基于病毒生存技术的保护方案






4.96/5 (43投票s)
2007年10月29日
57分钟阅读

88374
病毒生存技术在保护方案中的应用调查。
由于该设备主要是一台计算机,它将不得不频繁地执行
基本的算术运算
John von Neumann
1945年6月
引言
尽管计算机病毒通常被认为是有害的,但出于学术和实际目的,它们应该被研究[1]。对于病毒研究者来说,目标很明确:开发反病毒防御技术。在可执行代码抵抗分析方面,病毒似乎比大多数保护方案领先。这是一个自然演变——病毒编写者的议程显然是抵抗反病毒程序。与冯·诺依曼模型的“良性宿主”(隐含的假设)[2]相反,病毒计算机代码必须存在于恶意的环境中——由各种反病毒软件产品创建。这种环境被称为“恶意宿主”或“敌对宿主”。在保护方案加固的背景下,“端点安全”(恶意用户手中的物理设备)[92]也适用。
本文将探讨Peter Szor在其著作《计算机病毒研究与防御艺术》[3]中记录的病毒代码演变,并将其应用于保护方案的背景下。某些病毒研究领域,如基本自我保护策略(第6章)和高级代码演进技术及计算机病毒生成器工具包(第7章),提供了丰富多样的技术。其他领域,如恶意代码环境(第3章),提供了更多方法;而诸如感染策略分类(第4章)等领域,则提供了关于数据隐藏的洞察。此外,本文还将讨论x86架构和操作系统带来的一些问题。
在本文中,将讨论以下主题
- 动机
- 分析师
- 恶意代码定义
- 许可系统
- Wintel商用系统
- 保护系统
- 安全即是隐藏
- 生命周期开发
- 逆向工程的合法性
- 世嘉企业有限公司诉Accolade案
- Atari诉任天堂案
- Autodesk Inc诉Dyason案
- Anacon Corp Ltd诉Environmental Research Technology案
- 逆向工程工具
- Microsoft Windows
- Unix和Linux
- 数据隐藏技术
- NTFS流
- 附加扇区
- 坏扇区
- 最后一个扇区
- 隐藏分区
- 信号
- 信号量和互斥量
- 消息传递
- 保护系统技术
- 隐形
- 非标准API调用
- 启动时
- 罗宾汉和约翰·弗莱尔
- 分层
- 并排
- 即时编译(JIT)
- 无API字符串使用
- 协处理器(FPU)指令
- MMX指令
- 未公开的CPU指令
- 结构化异常处理
- 执行陷阱
- 使用CreateThread() API转移控制权
- 多线程病毒
- 暴力解密器
- 系统实现
- 开放性问题
除了Szor的丰富工作外,本文还将参考《使用IDA Pro和SoftICE进行代码反汇编》[38]、《逆向工程:逆向工程的秘密》[3]、《黑客调试揭秘》[4]和《软件利用——如何破解代码》[5]。
对于那些认为印刷品已经过时,并渴望更生动地检查所引用病毒代码的机会的人来说,他们应该访问VX Heaven [63]。VX Heaven于2007年9月通过BitTorrent [33]提供了病毒集合。
最后,对于那些对保护硬件感兴趣的人,读者可以参考《QuickLogic器件中的安全性》[83]。该论文讨论了反向工程和反克隆技术。该论文应为抵御芯片剥离、电压对比显微镜和电子显微镜(检查智能卡的一种技术)提供有用的参考。
动机
本文的动机部分归因于过去对可执行文件的应用保护机制的忽视。正如Jan H.P. Eloff和Mariki Eloff在《信息安全管理:新范式》中所述
信息安全管理需要范式转变,才能成功保护信息资产……ISMS [信息安全管理系统]处理组织中涉及创建和维护安全信息环境的所有方面。[79]
学术界为理论和应用系统提供了大量背景。保护系统的研究似乎源于安全(例如,Java类文件的字节码验证)。在某些情况下,系统需要专用硬件或定制操作系统。基于硬件的解决方案,如智能卡、可移动媒体和加密狗,虽然在实际研究中很少见。正如C. Collberg和C. Thomborson在《水印、防篡改和混淆——软件保护工具》中所观察到的,“[硬件辅助保护]在学术文献中很少受到关注”[50]。
在商用系统(如x86 PC)的保护方案应用早期,系统的大部分集中方向由一群称为“破解者”的逆向工程师提供。据推测,破解者以学术练习为目的,并为自己提供更多逆向工程目标。例如,1997年,Fravia推出了一个“反反间谍”页面,其中可以讨论保护方案[39]。1999年,“Mark”在《软件保护,不可能的梦想?》[75]中提出了14条保护规则,随后又在《Tidbit的‘常识’规则》[41]下提出了另外22条规则。
在黑盒开发领域,许多第三方公司竞相提供现成的解决方案(COTS)。例如,硬件加密狗密钥和软件解决方案是很常见的。这些系统的问题在于数量太少且过于商业化。方案太少意味着破解者能够集体压倒一个方案,从而确保实现的反盗窃措施被完全中和。过于商业化意味着一旦一家公司提供了一个解决方案,它就会被锁定——因此它缺乏可能有助于系统加固的变体。这是规模经济(产品产量增加导致单位平均成本下降)[69]的一个副作用。
分析师
为本文的目的,假定分析师将检查机器代码。不对分析师的动机做区分。值得注意的是,许多人拥有这些知识。分析师可能是研究恶意代码的病毒研究员、分析崩溃转储的系统程序员,或者是试图中和反盗窃措施的破解者。
现场的第一批分析师似乎来自情报机构。他们的目的是为了情报原因而逆向工程硬件接口和协议。大约在1960年,这被扩展到软件接口。根据国籍或隶属关系,这可以被视为爱国主义或间谍活动。在美国,功劳应该归功于OSS(CIA的前身),以及后来的NSA。作者所知的一个例子是“常春藤之钟”行动。常春藤之钟行动包括窃听鄂霍次克海俄罗斯海岸的海底电缆。作者的前大学讲师Henry Katz博士在他担任NSA期间领导了该行动[43]。一个更近期的例子是中国军方于2007年9月对五角大楼的黑客攻击[90]。
与政治间谍活动密切相关的是商业领域的动机——分析以揭示知识产权。例如,关于揭示知识产权,应该参考DES的S-Box结构向Usenet群组sci.crypt的披露。另一个例子是“RIM的商业秘密被Good Technology盗用”。2002年9月,Research in Motion起诉Good Technologies[59]。
根据Wikipedia[86]的说法,第一个计算机病毒是在1982年出现在Apple IIe平台上,名为Elk Cloner。Elk Cloner是由当时宾夕法尼亚州的一名九年级学生Rich Skrenta编写的。1986年,出现了第一个IBM PC兼容病毒——现在已灭绝的Brain引导扇区病毒[86]。不久之后,作为对威胁的回应,出现了各种产品。这些反病毒产品似乎源于拥有系统程序产品或经验的公司或个人。例如,John McAfee、Alan Solomon和Peter Norton。再次引用Wikipedia[23]
对于第一个反病毒产品的发明者,存在相互竞争的说法。也许第一次公开已知的PC病毒中和是由欧洲的Bernt Fix在1987年初完成的。Fix中和了Vienna病毒的感染。
+ORC在他的约1995年的大量文章[85]中首次向世界介绍了以营利为目的的破解。后来Fravia和其他贡献者继续了+ORC的工作。尽管Fravia的网站早已从网上消失,但Fravia网站和+ORC的文章的存档很容易获得。在一些文献中,破解者被简单地称为海盗,而非法使用软件的行为被称为盗版[15, 52],尽管这并不准确。例如,来自R.G.C. Jenkins & Company网站的逆向工程[15]
…海盗偶尔会使用逆向工程技术。海盗通常不需要理解产品的工作原理即可复制,但有时产品可能包含海盗需要克服的安全功能。
这个家族中最新的似乎是安全工程师——那些检查软件以找出安全漏洞的人。例如,可以参考Greg Hoglund和Gary McGraw合著的《软件利用:如何破解代码》或SABRE Security。
恶意代码定义
学术界在计算机病毒研究领域提供了大量信息。一位研究者是Frederick Cohen博士,他是Leonard Adleman博士(RSA的共同发明人)的前学生。Cohen博士被普遍认为是计算机病毒之父。1984年,Cohen博士非正式地将计算机病毒定义为:“计算机‘病毒’是一种能够通过修改其他程序来‘感染’它们的程序,其中可能包含其自身的一个可能演变的副本”[64]。1985年,他的正式定义出现在印刷品中(基于图灵的计算模型),后来被南加州大学批准为他的论文[8]。
最早对计算机蠕虫的学术提及是由Xerox公司的J. Shoch和J. Hupp在《“蠕虫”程序:分布式计算的早期经验》[9]中提出的。Shoch和Hupp在他们1982年的论文中没有正式定义计算机蠕虫。一个广泛接受的非正式定义是,“自动复制并初始化其复制品解释的程序”[10]。Cohen博士随后在1992年[11]发布了计算机蠕虫的正式定义。
关于传播,Brooke Stephens博士基于托管提出了:“病毒被视为‘搭便车者’,需要代码依附。蠕虫可以进行自我传播,只需极少或无需用户帮助……许多人认为互联网是一个‘无标度’网络。因此,从流行病学的角度来看,它是通过无标度网络上的流行病传播来建模的。”[70]
Peter Szor 对语义进行了细化,提供了两个普遍接受的非正式定义:“计算机病毒是一种代码,它递归地复制其自身可能演变的副本”[12],以及“蠕虫主要是网络病毒,在网络上复制”[62]。Szor 还详细介绍了其他恶意代码分类[14],包括
- 章鱼——一种复杂的蠕虫,它将程序传播到网络上的计算机(类似于“分布式”病毒)
- 兔子——一种只存在一个副本的蠕虫,它离开一台网络计算机,去往另一台主机(兔子跳来跳去)
- 特洛伊木马——一种通常需要用户交互才能激活的恶意程序
- 细菌——第一代病毒,其形式无法执行其感染过程(见下文的“投放器”)
- 下载器——一种下载并安装其他程序的恶意程序
- 投放器——第一代病毒代码的安装程序(见上文的“细菌”)
- 注入器——一种特殊的投放器,直接将病毒代码注入内存
- 键盘记录器——捕获受感染主机上的键盘输入
- Rootkit——在主机被入侵并获得超级用户访问权限后安装在主机上的特殊黑客工具
CACI还在http://www.caci.com/business/ia/threats.html上提供了不太为人知的术语列表。
除了学术界和Szor提供的正式和非正式定义外,赛门铁克在其《病毒、蠕虫和特洛伊木马的区别是什么?》[42]中提供了一个通俗的视角。
许可系统
由于存在许多非法的软件用户,因此需要软件许可系统。根据商业软件联盟(BSA)的数据,2006年安装的软件中有35%是盗版,造成了400亿美元的许可费损失[52]。
许可系统通常由两个组件组成:产品密钥——用于确保诚实用户的诚实性;以及产品激活系统。产品激活用于产品密钥验证和用户人口统计数据开发。几乎所有商业软件都采用产品密钥系统。可观察到的趋势表明,使用互联网的自动产品激活系统正成为事实上的标准(站点和批量许可除外)。
根据Anckaert、De Sutter、De Bosschere在《软件盗版防治通过多样化》[13]中的说法,产品密钥和产品激活被视为软件令牌。有关产品密钥生成和产品激活的深入讨论,请参阅《基于高级加密标准(AES)的产品密钥》[27]、《基于椭圆曲线密码学的产品密钥》[28]和《基于RSA签名的产品激活》[84]。
Wintel商用系统
本文将重点关注Windows操作系统和Intel x86兼容硬件。这是由于市场份额。根据X-bit Laboratories的说法,span style="FONT-FAMILY: Verdana">“微软的Windows以96.97%的全球使用份额主导着操作系统市场”[77]。非微软操作系统的细分如下:Macintosh - 2.32%,Linux - 0.36%。Electronics Weekly报道称,英特尔和AMD在桌面市场占有91.3%的市场份额[81]。
常见的x86系统,如运行Windows等操作系统的IBM兼容PC,给可执行文件的加固带来了严峻的挑战。在x86架构上,我们无法完全保护可执行文件免遭逆向工程。这主要有两个原因:x86架构的限制;以及操作系统的支持不足。这两个缺点被称为“不信任的硬件”和“不信任的操作系统”[78]。
在防篡改检测的背景下描述问题时,Giffin、Christodorescu和Kruger在《通过自修改代码加强软件自校验》中陈述如下
……自校验仍然是软件防篡改不完全的解决方案。自校验程序在不信任的操作系统和不信任的硬件上运行。[37]
微软的下一代安全计算基[76]将使用诸如Curtained Memory[40]等技术来解决不信任的操作系统的问题。
保护系统
根据C. Collberg和C. Thomborson在《水印、防篡改和混淆——软件保护工具》中的说法,“……不存在比通过混淆代码的目的更强的防止逆向工程攻击的技术”[30]。关于混淆,《关于混淆程序的(不可能)性》指出:“即使在非常弱的形式化[原文如此:混淆的数学构造]下,混淆也是不可能的”[58]。微软进一步承认了这一点,认为“[阻止软件盗版]……可能是一个无法实现的目标”[94]。
保护系统是可执行文件的逻辑模块。它们通常与许可方案结合实现。保护方案通常用作阻碍逆向工程可执行文件部分(例如,许可系统)的能力的手段。最常被忽视的是保护所有可执行代码的目标,而不是仅仅保护许可方案。这似乎是由于意识问题——破解者可能是一个非常活跃的群体,并且表面上对公司的利益构成了最大的威胁。然而,正如IBM在DES和sci.crypt帖子中遇到的那样,有时保护知识产权是可取的。请注意作者选择的词语“阻碍”。
学术界提出的保护技术有时存在这样的问题:理论假设适用于问题域,但在实践中,分析师在应用时只遇到微小的障碍。例如,在《针对基于哈希的软件防篡改的通用攻击》中,Glen Wurster提出了三个假设。一个假设是,“攻击者无法识别受保护程序中的所有相关校验和计算代码或验证代码”[71]。
假设的根本前提是可判定性(判定问题)是NP完全的。如果分析师使用的工具不是交互式的,则上述陈述很可能成立。然而,IDA等工具会得到分析师的帮助。由熟练的对手协助的工具最有可能使分析师能够正确识别几乎所有相关的代码部分。《通过自修改代码加强软件自校验》的作者也同意:“尽管我们质疑这个假设的合法性——如果攻击者能够找到并删除不需要的代码(如许可证检查),他们也很可能能够找到并删除校验和代码”[72]。
应该假定任何一种技术在分析后都可以被轻易中和。因此,每种提出的技术都应该被视为软件作者实现的更大系统的一个“原始”或“构建块”。通过组合多个系统,希望大多数初级分析师会因掌握技能不足而放弃。
对于资深分析师来说,只是希望他或她会因代码分析的繁琐而感到厌倦。Szor 在病毒研究方面也提到了类似的情况,“在许多场合,能力不足的病毒分析师团队会发布错误的信息……分析病毒代码唯一可靠的方法是进行全面的细致工作。其他任何方法都是不专业的,必须避免”[53]。
对于软件作者来说,应该很清楚不存在“银弹”。应用于软件的每种技术只会增加特定系统分析和规避的复杂性。然而,软件作者可以通过包含多种技术来使分析变得异常复杂。
安全即是隐藏
由于保护机制的性质,它们是“安全即是隐藏”的一种体现。引用《水印、防篡改和混淆——软件保护工具》中的话,“在安全和密码学界,‘安全即是隐藏’长期以来一直被鄙视”[60]。这是一个令人失望的情况,因为除了学术界之外,合作很少。协作努力营造创造性和解决问题的环境。原因乍一看有些反常——由于分析师能够查看机器代码,因此不存在秘密。然而,系统作者认为,通过不征求评论,他们确保了系统的安全性。但一个没有公开讨论的保护系统可能比一个已经被讨论过的系统更不安全。
更糟糕的是,有些程序员充满自信。因此,当一个明显的缺陷或不足被揭露时,它会被基于自尊而驳回。作者曾咨询过一些公司,其中一个程序员负责保护方案,但由于他认为可执行文件得到了充分保护而拒绝接受建议。这位程序员甚至不了解计算机安全的基本原理,甚至不了解RSA加密系统的工作原理。
这与破解社区形成鲜明对比,在那里,合谋破坏安全措施的努力很常见。其含义显而易见——破解分析师拥有更多的资源,社区的资深成员指导初级成员。
生命周期开发
生命周期开发是一个规范信息系统创建的正式过程。这是软件开发的一种有纪律的方法。通常,该过程应用于大型企业,以指导其开发工作。
无论是由公司还是个人开发,趋势都是先进行可执行文件的生产,然后添加许可和保护方案。可执行文件的业务逻辑通常接收了公司的大部分资源。相比之下,病毒作者会竭尽全力来加固可执行文件。病毒的业务逻辑很简短。它通常包括一个感染组件、一个复制组件;如果适用,还有一个窃取密码、银行账号等信息的模块(恶意负载),然后“呼叫回家”。
在《Windows应用程序调试》中,John Robbins写道,应该在产品开发生命周期的早期开始开发安装程序[21]。与安装程序一样,应该尽早将保护方案的元素融入软件生命周期的实现阶段——而不是仅仅在产品开发之后添加。值得注意的是,操作系统(尤其是Microsoft Windows)在Windows家族开发中采取了这种方法,这导致了源代码库(Windows 9x和Windows NT)在添加安全考虑因素时发生了重大分裂。换个角度看,微软意识到Windows 9x框架无法充分支持安全(它还有其他方面的不足,如完整的32位支持),因此推出了一个独立的产品线。
逆向工程的合法性
虽然关于逆向工程的合法性存在许多相互竞争的观点,但应参考法院提供的观点。允许逆向工程受版权保护的材料的一个核心主题似乎是互操作性。作者未能找到关于编译后错误修复(例如,移除感知到的时间限制错误)的参考。根据电子前沿基金会的高级法律顾问Jason Schultz的说法
……法院愿意允许在一定程度上逆向工程受版权保护的材料,目的是为了在计算机产品之间实现互操作性,只要最终产品不包含任何侵权代码。如果它确实包含此类代码,在某些情况下,它也可以根据合并原则和场景原则(如果为了实现互操作性或作为锁定代码使用)得到豁免。[93]
本着互操作性和合理使用场景的精神,Peter Szor写道,“反病毒公司必须对Microsoft文件格式进行逆向工程,才能检测其中的病毒。尽管Microsoft在保密协议(NDA)下向反病毒开发人员提供了关于某些文件格式的信息,但收到的信息通常包含重大错误或不完整”[24]。
除了Jason Schultz的观点外,David Musker在1998年向IBC会议[16]提交了关于软件和硬件领域逆向工程的高层概述。该论文题为《保护与利用电子领域的知识产权》。在论文中,Musker提出了关于美国、澳大利亚和英国对专利和版权法的解释的以下案例法。有关逆向工程和“公平使用”领域的更多案例回顾,请访问R.G.C. Jenkins & Company网站[25]上的论文存档。
世嘉企业有限公司诉Accolade案
这家美国软件版权案件涉及Sega的视频游戏机和游戏卡带。游戏卡带有一个20至25字节的代码段,作为安全措施由游戏机进行查询。Accolade反汇编了三种不同Sega游戏卡带共有的代码,以找到安全段,并将其包含在竞争性游戏卡带中。
第九巡回法院认为,这种反汇编是允许的“合理使用”了游戏程序的版权。[17]
Atari诉任天堂案
这家美国软件版权案件涉及任天堂的NES视频游戏机和游戏卡带。游戏卡带包含一个微处理器和程序代码,并被游戏机微处理器查询,作为安全措施,类似于Sega系统。这种安全措施可能是一个双向过程,游戏机检查是否存在有效的游戏卡带,并且游戏卡带也可能检查是否存在有效的游戏机(任天堂实际上并未这样做)。
Atari反汇编了执行安全信号交换(接口代码)的程序代码。然而,他们也从美国版权局获得了源代码副本,并谎称是为了诉讼目的。
他们实现了信号交换来验证游戏卡带,从而实现了其游戏卡带与任天堂游戏机的兼容性。然而,他们做得更进一步,实现了接口的其余部分,以验证游戏机,显然是为了应对任天堂将来可能改变其产品。在每种情况下,他们都复制了一些实际代码,据称仅限于必要程度。
法院认为,逆向工程期间的中间复制是合法的,“合理使用”。然而,Atari仍然侵犯了版权,因为其复制范围超出了严格的必要范围。程序员显然也看到了来自美国版权局的源代码,这让人对其复制是否仅仅是由于逆向工程操作产生怀疑。
最后,任天堂拥有该接口的专利,Atari也被发现侵犯了该专利。[18]
Autodesk Inc诉Dyason案
这家澳大利亚软件版权案件涉及一个CAD软件包,该软件包配有一个硬件设备,其中包含一个EPROM,称为AutoCAD锁,它与软件包的一部分“Widget-C”程序配合使用。程序向锁发送挑战信号,锁以返回信号响应。程序将返回信号与查找表进行比较。查找表由30 KB程序中的16个字节组成。查找表的加密形式保存在锁EPROM中。
被告用示波器研究了信号并读出了它们。显然,EPROM的正确内容是从这种功能分析中推断出来的,而没有读取EPROM。然后他们生产了一个替代锁设备。原告声称该表是程序的重要组成部分,因此程序已被复制。
法院认为,该表是程序的重要组成部分(重要性问题而非大小问题),并且已被复制,这构成了侵权。[19]
Anacon Corp Ltd诉Environmental Research Technology案
这起英国版权案件涉及一种电子粉尘分析仪,其中包括一个计算机程序、一些工程图纸和一些PCB的电路图。被告已进入清算阶段,法官发现了前两项的明显侵权,因此报告仅涉及PCB电路图。
据称,被告逆向工程了原告的PCB,并从中提取了一个网表,指定了组件及其互连,然后他们用它来制作更多的PCB。法官认为,网表可以通过计算机解释,生成电路图或制造PCB的指令(即更高或更低级别的描述)。
法官认为,原告的电路图不仅包含艺术作品(图纸),还包含文学作品(组件符号表示的身份及其互连,构成一个表或汇编)。这种文学作品被复制在原告的PCB中,因此被被告通过他们从PCB衍生的网表所复制,该网表包含相同的信息。[20]
逆向工程工具
Microsoft Windows
在Windows平台上,分析师的武器库中普遍存在三种工具:IDA、SoftICE和PE Tools。IDA是Data Rescue公司的交互式反汇编器。IDA用于检查磁盘上的可执行文件。IDA提供了有用的功能,如用于分析程序流的调用图和自动库检测(FLIRT)。
SoftICE是Compuware公司的Ring 0调试器。尽管SoftICE不再是Compuware公司的产品,但其使用仍然非常普遍。虽然作者现在使用WinDbg代替SoftICE,但一些分析师转向了OllyDbg。可以推测,一旦Compuware决定销售SoftICE[36],该调试器将恢复其之前的受欢迎程度。
PE Tools用于转储可执行文件的部分(区域)或完整内存映像。它还包括自动删除“反转储保护”并查找原始OEP(IMAGE_OPTIONAL_HEADER结构中的AddressOfEntryPoint值)的功能。此工具将用于打包或加密的可执行文件。在解压缩或解密发生后,将使用PE Tools将映像从内存中复制出来进行进一步分析。
IDA用于对磁盘执行静态分析,而调试器则用于在内存中检查正在执行的程序。基于这些工具,可以观察到保护方案必须在两种环境中运行——磁盘上和内存中。在病毒研究社区中,在反反汇编层[49]中会遇到具有挑战性的反汇编,而抑制动态分析的实现被称为反调试层[66]。
Unix和Linux
对于Unix和Linux,objdump(及其基于PERL的包装器dasm)和gdb是两种可用的工具。gdb支持C、C++、Java、Fortran和汇编等语言的调试。此外,gdb旨在与GNU编译器集合(GCC)紧密配合。objdump和dasm共同构成了一个完整的反汇编器。或者,可以使用Wine在Linux上运行Windows应用程序,如IDA,它充当在Linux上运行Windows程序的兼容层。Kris Kaspersky在《黑客反汇编揭秘》[82]中介绍了其他工具和特定于ELF文件格式的详细过程。
数据隐藏技术
数据隐藏之所以被包含进来,是因为病毒作者在隐藏信息的方式和位置上很有创意。这些技术应被考虑作为保护方案的组成部分。这些位置为作者提供了除标准文件系统和注册表之外的额外区域。不仅可以隐藏重复数据,还可以放置之前编译的代码以供将来使用(在适当的修复后)。后者不像看起来那么奇异——Apple的多分支文件系统就是围绕这样一个概念设计的。
有关读取和写入硬盘原始扇区的技术,请参阅Shalom Keller的《构建自己的操作系统》[89];或Sreejith的《读取/写入磁盘扇区(绝对磁盘读/写)》[88]。后一篇文章更全面地检查了读写操作。此外,Sreejith的文章使用DOS、Windows 9x系列和Windows NT系列演示了该技术。
NTFS流
HFS由Apple于1985年9月推出。NTFS文件流(或备用数据流)旨在支持Apple Computer的HFS(UNIX通常通过使用隐藏目录来实现文件分支)的多分支概念。HFS文件可以有多个分支,通常包括数据和资源分支。这使得程序代码可以与菜单和菜单栏的定义等资源分开存储,这些资源可能需要本地化。
Windows NT支持多分支文件,因为Windows文件服务器可以配置为服务Macintosh计算机。与HFS一样,NTFS文件可以在磁盘上包含多个流。“主流”就是文件本身。例如,calc.exe的代码可以在文件的未命名(主)流中找到。
摘自3.5.2节,“NTFS流病毒”
……有人可以在同一个文件中存储额外的命名流;例如,可以使用notepad.exe:test流名来创建一个名为test的流名。当WNT/Stream病毒感染一个文件时,它将覆盖文件的主流代码,但首先它会将主机原始代码存储在名为STR的命名流中……
恶意黑客经常在磁盘上的NTFS流中留下他们的工具。备用流在命令行或图形文件管理器Explorer中不可见。它们通常不会增加目录条目中的文件大小,尽管丢失给它们的磁盘空间可能会被注意到。此外,备用流的内容可以直接执行,而无需将文件内容存储在主流中。这为未来的复杂NTFS蠕虫提供了潜力。[31]
Microsoft不对未来产品中备用数据流的存在做出保证。摘自知识库文章105763,“如何使用NTFS备用数据流”:“备用数据流是NTFS文件系统的专有功能,未来文件系统可能不支持。然而,NTFS将在未来版本的Windows NT中得到支持”[35]。
最后,对于那些在.NET中开发的人来说,备用数据流不可用。根据“System.IO中的类不支持NTFS卷上的备用数据流”[45],尝试使用它们会抛出“给定的路径格式不受支持”的消息,并出现NotSupportedException。
附加扇区
使用通常无法访问的软盘区域为保护方案提供存储来隐藏数据。这种技术的明显缺点是,由于内存棒等可移动媒体的普及,软盘已不再流行。摘自4.1.2.2节,“格式化附加扇区的引导病毒”关于印度尼西亚病毒Denzuko
防复制软件通常利用放置在正常范围之外的特殊格式化的“附加”磁盘扇区。因此,正常的磁盘复制工具,如DISKCOPY,无法制作出此类磁盘的精确副本。
一些病毒专门格式化一组附加磁盘扇区,以使防病毒程序更难在修复期间访问原始副本。然而,附加扇区的典型用途是为更大的病毒体腾出更多空间。[22]
坏扇区
该技术最初的应用是将磁盘的原始引导扇区保存到备用位置,然后将该扇区(已存档的引导扇区)标记为BAD。摘自Szor著作的4.1.2.3节,“标记扇区为BAD的引导病毒”
……将原始扇区或病毒体的其他部分保存在DOS FAT中标记为BAD的未使用簇中。此类病毒的一个例子是相当危险的Disk Killer,写于1989年4月。[22]
最后一个扇区
采用概率方法,可以将数据保存到磁盘的最后一个扇区,同时将其标记为未使用。摘自Szor:4.1.2.5节,“存储在磁盘末尾的引导病毒”
……通过覆盖原始引导扇区并将其保存在硬盘末尾来替换原始引导扇区,就像MBR病毒偶尔也会这样做一样。臭名昭著的Form病毒就使用了这种方法。它将原始引导扇区保存在磁盘的最末端。Form希望这个扇区不会被频繁使用,或者根本不使用,从而存储的引导扇区将保留在磁盘上,而不会有太大的被修改的风险。因此,病毒不会以任何方式标记该扇区;它也不会减小包含已保存扇区的分区的大小。[22]
隐藏分区
现代企业服务器允许管理员使用实用程序引导操作系统安装。这些实用程序由HP、Compaq和Dell等公司提供。对于Compaq,该程序是名为System Configuration Utility(SCU)的可引导CD。配置实用程序创建一个名为System Partition的隐藏分区。System Partition是固定磁盘上的一个特殊区域,其中可以包含配置信息、诊断程序和其他实用程序。
实用程序分区创建了另一个可以隐藏数据的地方。摘自3.22,“多类型病毒”,“Junkie可以感染一些计算机制造商用来隐藏数据和额外代码的隐藏分区上的COM文件……”
信号
通过使用诸如线程、互斥量、信号量和消息之类的操作系统对象来打破过程块编程的同步性质,可以增加运行时分析的复杂性。
信号量和互斥量
Szor在5.2.4.1节,“内存中的自检测技术”中讨论了病毒使用信号机制。尽管讨论的目标是加载病毒的单个实例,但它的存在暗示了更高级机制的实现。
……病毒经常使用内存信号量,例如全局互斥量,它们在病毒首次加载时设置。这样,新加载的副本在执行时就可以简单地退出。[56]
其他蠕虫,如Blaster,也使用互斥量来成功限制其操作。
消息传递
尽管下面的示例在Office文档宏的上下文中使用了回调,但相同的技术也可以与保护方案一起使用。摘自3.7.1.4节,“宏病毒的平台依赖性”
例如,{W32, W97M}/Heathen.12888病毒使用KERNEL32.DLL的CallBack12()、CallBack24()和CreateThread() API来实现文档和32位可执行文件的感染和投放机制。
保护系统技术
病毒的保护机制提供多达五种服务来阻止分析。每种服务旨在抵御野外反病毒软件将提出的特定类别的攻击。对可执行文件保护感兴趣的防御技术是
- 反反汇编层
- 反调试层
- 反模拟层
以下将详细介绍病毒计算机代码采用的更有趣的技术。
隐形
隐形保护与其说是一种保护,不如说是保护的一个属性。虽然许多病毒采用隐形技术,但作者认为保护方案不应采用此类技术。隐形性通常通过软件接口(如NtQueryInformationProcess() [48])操纵操作系统返回的数据,或操纵操作系统拥有的链表数据结构来实现。
原因是保护系统越过了道德界限,并且作为rootkit运行。关于此类技术的强烈反对,读者可以阅读CNet的《索尼CD保护引发安全担忧》[46]。这个特定的rootkit是由SysInternals(Dr. Mark Russinovich联合创始人)在2005年发现的。2005年11月,索尼提出了针对此次事件引发的集体诉讼[47]的解决方案。
此外,微软不保证该接口的未来存在,并称,“NtQueryInformationProcess在未来版本的Windows中可能会被更改或不可用。”[48]
非标准API调用
病毒提供的另一项服务是帮助记录Windows原生API。大多数原生API已被微软遗留为未文档化。原生应用程序不依赖于各种子系统DLL,如KERNEL32.DLL。 autochk.exe等原生应用程序使用NTDLL.DLL(原生API)[80],其中存储了数百个未文档化的API。可以使用Windows NT DDK来构建原生应用程序。摘自Szor
……32位Windows病毒正在兴起:原生感染者。第一个此类病毒W32/Chiton是由病毒编写者roy g biv于2001年末创建的。与大多数依赖调用Win32子系统来访问API函数进行复制的Win32病毒不同,W32/Chiton也可以在Win32子系统外进行复制。[61]
如果使用原生API,将使用RtlAllocateHeap()和RtlFreeHeap()进行内存管理;以及RtlSetCurrentDirectory()、RtlDosPathNameToNtPathName()和NtQueryDirectoryFile()进行目录操作。最后,NtOpenFile()、NtClose()、NtMapViewOfSection()、NtUnmapViewOfSection()、NtSetInformationFile()和NtCreateSection()将用于文件管理。这些是W32/Chiton在野外使用的函数[61]。
请注意,RtlSetCurrentDirectory()几乎未被文档化:在Google搜索[67]中仅返回四个不同的结果(不包括本文的索引)。结果来自Linux的Wine等互操作层。这包括Gary Nebbett在《Windows NT/2000原生API参考》[68]中缺乏覆盖。
启动时
如果软件作者希望使用启动时保护系统(这很可能作为外部保护系统),早期要检查的病毒之一是W32/Chiton。选择W32/Chiton作为代表是因为它是原生应用程序。作为原生应用程序,它可以在启动过程的早期启动。摘自Szor在3.6.5.2节讨论原生病毒
……与大多数依赖调用Win32子系统来访问API函数进行复制的Win32病毒不同,W32/Chiton也可以在Win32子系统外进行复制。
PE文件可以加载为设备驱动程序、GUI Windows应用程序、控制台应用程序或原生应用程序。原生应用程序在启动时加载。由于它们在子系统可用之前加载,因此它们负责自己的内存管理。[61]
使用启动时系统必须非常小心,因为驱动程序拥有完整的系统访问权限。微软发布了安全公告944653,日期为2007年11月5日,标题为“Windows上Macrovision SECDRV.SYS驱动程序的漏洞可能允许权限提升”[91]。Macrovision创建Adobe等公司使用的软件合规系统。
罗宾汉和约翰·弗莱尔
在此系统中,至少有两个独立的进程(或可能的线程)积极参与监控篡改。这个保护对作者来说很有趣,因为他原型化了一个类似的系统,包括1)原生应用程序监视器和2)业务逻辑可执行文件。业务可执行文件还包含一个监视器组件。每个进程都监视自己和其他进程是否被运行时篡改。
该系统的优势在于现代操作系统是多任务的,而程序是顺序的。典型的攻击向量如下:破解者尝试通过禁用监视系统并写入内存中的(正在执行的)二进制文件来应用内存补丁。补丁程序必须原子地执行两个函数:禁用监视器和修补可执行文件。实际上,破解程序很可能会被抢占。在抢占期间,幸存的监视器负责重新启动被禁用的监视器线程或进程。在任何时候,如果监视器发现可执行文件被篡改,它将启动修复操作。有关检测和修复内存中可执行文件的技术,请参阅《防篡改和自修复代码》[74]。
再次摘自Szor的第12.8节,“可能的内存扫描攻击”
蠕虫可以运行多个副本,每个副本都互相监视。或者,将一个线程注入另一个进程,该进程监视蠕虫进程。第一种攻击的一个例子是W32/Chiton的一个变种。第二种攻击的一个例子是W32/Lovegate@mm。这种攻击的第一个变体基于“罗宾汉和约翰·弗莱尔”程序的自保护机制,据传该程序于20世纪70年代中期在摩托罗拉开发。
分层
分层保护只是包装了以前的加固方法。最常见的分层保护方法之一是UPX。UPX只支持压缩。根据László Molnár的说法,没有计划支持加密。如果需要加密可执行文件,那么ASPack的ASProtect等产品可能很有趣。如果软件作者希望同时进行加密和压缩,则软件应首先压缩以产生熵。
并排
与分层保护不同,并排保护将多个保护例程放置在可执行文件内部。每个保护实例都作为其他保护例程的对等项。尽管每个系统在功能上都是等效的,但每个系统都是单独编码的。这确保了没有例程在多个方案之间通用。
一种类似的情况也适用于此措施,记录在3.7节,“解释环境依赖性”中。再次摘自《计算机病毒研究与防御艺术》
从VBA5(Office 97)开始,文档包含宏的压缩源,以及它们的预编译代码,称为p-code(伪代码),以及execode。Execode是p-code的进一步优化,它无需进一步检查即可运行,因为它的状态是自包含的。出现问题是因为在特定情况下,这三种形式中的任何一种都可以运行。
……[反病毒]产品删除了这三种形式中的任何一种,而没有删除另外两种中的至少一种。例如,一些反病毒程序可能会删除p-code,但会留下源代码。通常p-code会先运行。VBA编辑器还将反编译的p-code显示为宏的“源代码”,而不是使用保存在文档中的宏的实际源代码。在特定情况下,当p-code被移除但源代码未被移除时,病毒可能会复苏……
另一个病毒技术记录在3.22节,“多类型病毒”中。这些病毒执行多种感染,例如主引导记录(MBR)和用户文件。
第一个感染COM文件和引导扇区的病毒Ghostball,于1989年10月由Fridrik Skulason发现。另一个早期多类型病毒的例子是Tequila。Tequila可以感染DOS EXE文件以及硬盘的MBR(主引导扇区)。
多类型病毒通常很棘手且难以清除。例如,Junkie病毒感染COM文件,同时也是一个引导病毒。Junkie可以通过标记特定分区条目来感染一些计算机制造商用于隐藏数据和额外代码的隐藏分区上的COM文件。
即时编译(JIT)
即时编译(JIT)用于某些运行时环境,如JAVA和.Net。在本讨论中,仅详细介绍.Net。在.Net中,平台无关的伪代码(MSIL)会被编译成本地架构,并在需要时执行。当使用模块的特定方法时,.Net Framework的CLR(通用语言运行时)会在模块级别执行此操作。
而UPX打包(解压缩)和解包(压缩)整个可执行文件,JIT保护只会根据需要解包或解密函数或方法。这在功能上也与.Net运行时不同,后者在模块中使用方法时会编译该模块。当函数不再需要时,JIT保护机制会丢弃该函数,并将内存归零。
尽管这会增加大约15%的处理开销,但其好处在于增加了跟踪或转储打包程序的难度。该系统的缺点在于其实现的难度。除了基于功能依赖性构建的调用树的额外逻辑外,标准的编译器和链接器根本不适合这种情况。问题更多地在于链接器,而不是编译器。这迫使作者退回到糟糕的技巧来原型化系统。
摘自《计算机病毒研究与防御艺术》第3.10节的病毒参考
第一个针对.NET可执行文件的病毒不是JIT依赖的。例如,Donut由Benny于2002年2月创建。该病毒攻击.NET可执行文件的本机入口点,将_CorExeMain()导入(目前运行JIT初始化)替换为自己的代码,并将其附加到文件末尾。几个月后,出现了JIT依赖的病毒,可以感染其他MSIL可执行文件。第一个此类病毒由Gigabyte编写。
无API字符串使用
根据Szor的说法,“[无API字符串使用是]一种非常有效的……反反汇编技巧”[26]。Win32/Dungue不使用字符串来指定特定的API。它不使用字符串名称,而是计算API名称的校验和。然后,病毒通过校验和动态确定要调用的API。例如,会扫描kernel32.dll的导出表,计算每个函数的校验和。当找到匹配项时,病毒调用该函数。
协处理器(FPU)指令
为了绕过模拟器,病毒作者开始在他们的解密器中加入FPU指令,因为早期的启发式方法会跳过协处理器指令。许多病毒都使用了这项技术,因为诸如Prizzy Polymorphic Engine(PPE)之类的病毒引擎能够基于FPU生成指令序列。根据Szor的说法,PPE能够生成43种不同的协处理器指令[26]。
MMX指令
与FPU指令一样,MMX指令也被用来延长生存能力。W95/Prizzy是第一个使用该技术来病毒。根据Szor的说法,W32/Legacy和W32/Thorin比Prizzy更成功。PPE引擎能够生成46条MMX指令[26]。
未公开的CPU指令
使用未公开的CPU指令是病毒作者采用的另一种反模拟技术。根据Szor的说法
W95/Vulcano在其多态解密器中使用未公开的SALC指令作为垃圾,以停止某些无法处理它的防病毒引擎的处理器模拟器。英特尔声称SALC可以被模拟为NOP(无操作指令)。[26]
结构化异常处理
结构化异常处理长期以来一直被认为是有效的反调试和反模拟技术。根据Szor的说法,“病毒经常设置异常处理程序来为反病毒产品使用的模拟器设置陷阱。这种技巧被引入了W95/Champ.5447.B病毒”。
执行陷阱
在结构化异常处理的基础上,一些病毒会利用陷阱,通过检查FS:[0xC]的值来根据操作系统将控制权转移到真正的OEP(或病毒体)。在Windows 9x下,FS:[0xC]将存储W16TDB的值,这是线程信息块(TIB)的一部分。在Windows NT下,值为0。因此,病毒仅在Windows 9x系统下运行时激活。Pszor称之为随机执行逻辑:“最早使用随机执行逻辑的病毒之一是W95/Invir”。该方法可以追溯到DOS病毒。
扩展这一概念,通过执行非法指令或除以0,然后让处理器处理程序将控制权转移到真正的OEP,可以实现有效的OEP模糊化。
使用CreateThread() API转移控制权
诸如W95/Kala之类的病毒将使用CreateThread()将控制权转移到病毒代码[44]。当使用模拟器扫描时,早期的AV产品无法正确识别病毒代码,因为它没有实现API。这项技术本身也作为一种反模拟技术。
多线程病毒
在CreateThread() API用于转移控制权的基础上,多线程病毒利用多个线程和高级同步来阻止模拟。摘自Szor
模拟器最初用于模拟DOS应用程序。DOS仅支持单线程执行,这对模拟器来说比多线程模型更简单的模型。模拟多线程Windows应用程序具有挑战性,因为各种线程的同步至关重要但相当困难。[44]
在这种情况下,模拟器作者不仅需要实现必需的API调用,还需要正确地整合同步对象。
暴力解密器
随机解密算法(RDA)使用暴力方法(试错)来确定病毒的解密密钥以解密病毒体。尽管作者认为这种方法不适合用于保护机制。然而,Szor指出,“在实时执行的情况下,这种逻辑相对较快,但它会生成非常长的循环,导致无数次模拟迭代,确保实际的病毒体不会轻易被达到。”[29]。根据Szor的评论,作者推测加密算法不属于商业质量。也就是说,优选XOR方案而不是更复杂的密码。
系统实现
必须实现并排保护,以满足高质量用户界面的设计要求。并排变体可以(也可能)被分层保护所封装。以用户为中心的设计要求,如果用户输入了错误的产品密钥或宽限期已过,则必须清楚地告知用户。然而,这为分析师提供了一个切入保护方案某个方面的立足点。软件作者应该假设分析师会找到并禁用负责通知用户的例程。然而,初级分析师可能会错过其他对等例程中的一个或多个。
其中一个保护例程专门用于用户信息,另外至少还有两个例程应该得到支持。第一个是退出例程。退出例程将——独立地——确定程序应退出并执行此操作。对于那些有兴趣破坏安全措施的人来说,这也是唾手可得的(low hanging fruit),所以应该假定该例程会被找到并最终移除。
最后一个保护例程或例程将导致程序执行不正确,而不通知用户或退出。这是必需的,以便非法用户假设保护方案已被移除,并且程序存在编程错误,不值得进一步追究。无论非法用户认为故障出在哪里。他或她可能认为在移除保护例程期间发生了附带损害;或者可执行文件在存在编程错误的情况下被投入生产。
值得注意的是,每个例程都应使用自己的数据副本,以确定安装的有效性。如果它们共享对公共数据的访问,那么在并排系统中找到所有保护方案将是一件微不足道的事情。
除了最少三个并排运行的例程外,还应采用三种其他技术——一种用于使静态分析复杂化(反反汇编)的系统、反仿真因素以及相应的反调试层。可以通过打包或加密来实现反反汇编。Strengthening Software Self-Checksumming via Self-Modifying Code 中可以找到关于增强仿真的灵感[27]。最后,至少应使用异常处理来进行反调试。
开放性问题
如果存在一个完美的保护系统(针对商品硬件),那么最有可能的候选方案是基于数字签名。另一个可能的候选方案是哈希。哈希也是电子签名的组成部分。在作者看来,可执行文件加固领域存在两个悬而未决的问题:
- 是否存在一个完美的系统?
- (如果存在)完美的系统由哪些组件构成?
在作者看来,对于像英特尔 x86 PC 这样的商品硬件,并不存在一个完美的系统。如果要在密码学领域模拟威胁分析,场景如下:两个希望安全通信的实体——存储(磁盘或内存)和处理器,而对手是分析师(试图进行准中间人攻击)。加密可执行文件以阻止对手是微不足道的。然后将加密的可执行文件输入到处理器。处理器的某个组件会解密加密的可执行文件,然后执行程序。然而,这会带来许多问题,其中三个问题(技术和政治可行性)在下面详细介绍。
第一个问题与处理器架构有关。英特尔 x86 处理器并非为满足将加密的可执行文件从内存移至处理器芯片、解密程序并在芯片上存储解密后的程序以执行的要求而设计。x86 架构上没有像 XOM 或 AEGIS 那样的安全协处理器或“解密器”控制器。Shashank Khanvilkar 在Guaranteeing Memory Integrity in Secure Processors with Dynamic Trees 中提出了一个解决方案。
进程之间的数据流通过定义明确的接口进行严格控制,任何进程(即使是操作系统)都不能访问其他主体的属于其他主体的数据。特殊指令允许操作系统在中断期间通过内部私有缓存存储/恢复进程状态(而不实际读取状态)。[55]
在 David Lie 的 XOM(eXecute Only Memory,仅执行内存)抽象机器中,这是出自Architectural Support for Copy and Tamper-Resistant Software。添加了指令以将加密数据移入和移出处理器,因为抽象机器假设操作系统是不可信的(即,它会允许另一个进程访问程序的_数据)。摘自“Supporting an Operating System”:
... XOM 不信任操作系统。这是因为有许多方法可以让对手破坏操作系统并获得其控制权……当 XOM 程序被中断时,寄存器的内容仍然带有被中断程序的 XOM ID 标签。因此,操作系统无法读取这些值并将其存储到内存中。我们需要在 ISA 中添加两个指令——保存寄存器和恢复寄存器指令。[7]
值得注意的是,Lie 构建了一个 XOM 实现。
构建了一个名为 XOMOS 的操作系统,可在 XOM 架构上运行。由于应用程序不信任操作系统能够妥善处理它们的数据,这为操作系统设计带来了有趣的挑战。这项工作表明,可以在可信硬件之上实现一个不可信的操作系统,该操作系统具有管理资源所需的足够权限,但没有权限读取或修改用户应用程序代码或数据。这通过将 IRIX 6.5 操作系统移植到 XOM 处理器来创建 XOMOS 来实现。我们在模拟器中能够_在 XOMOS 上运行...应用程序,并发现开销小于 5%。[33]
第二个问题是 PKI 和密钥管理/分发。设置程序的作者如何在没有任何先验知识的情况下为特定处理器进行加密?考虑 Pentium III 中引入的处理器序列号所带来的负面看法。公众将如何接受处理器芯片上不仅有序列号,还有公钥和私钥对?Architecture for Protecting Critical Secrets in Microprocessors 的作者提出了一个解决方案。
我们提出了“秘密保护 (SP)”架构,以实现对关键秘密的安全便捷保护……密钥是关键秘密的示例,而密钥保护和管理是使用加密技术保护敏感文件、消息、数据和程序的基础问题——通常被假定存在但未解决。[87]
作者认为,David Lie 在 XOM 抽象机器的软件分发模型中Architectural Support for Copy and Tamper-Resistant Software 中错误地淡化了这项任务。
...软件生产者只需使用分区密钥加密程序映像,然后使用目标处理器的公钥加密分区密钥。由于此私钥用于保护机器上的所有分区,因此它被称为主密钥。如果每台 XOM 机器都初始化有不同的公钥/私钥对,那么这将为程序提供一种验证其正在执行的处理器的方式,因为只有具有正确私钥的处理器才能解密和访问分区密钥。[65]
下一个问题是调试器的作用。虽然公司拥有硬件在线仿真器(ICE,如 SoftICE)或板载调试器(On Circuit Debugger)的资源,但大多数开发人员却没有。对于那些对 ICE 或 OCD 与软件调试的更精细细节感兴趣的人,请参阅 Robert R. Collins 的文章In-Circuit Emulation: How the Microprocessor Evolved Over Time [73] 和ICE Mode and the Pentium Processor [72],发表在 Dr. Dobbs Journal 上。如果作者不能在他的机器上调试(即使是加密的)可执行文件,他至少会感到不满。John Robbins 等作者在Implementing an Untrusted Operating System on Trusted Hardware 中解决了一些问题。
最近,使用硬件提供“可信计算平台”引起了相当大的兴趣——TCPA 和 Palladium 是最公开可见的例子。本文讨论了我们使用在 XOM(一种提供防复制和防篡改功能的处理器架构)上运行的传统分时操作系统构建此类平台的经验。[57]
Architectural Support for Copy and Tamper-Resistant Software 承认了操作系统在调试器方面的不足。
...由于程序的执行不受保护,攻击者可能会使用调试器或其他类似工具检查程序的动态状态,并推断出正在执行的指令。[65]
如果一个完美的系统不存在,那么一个近乎完美的系统能有多接近?虽然不是理想情况,但这种情况可能适用于一个强大的系统。例如,调试器通常被认为是透明的。然而,调试器实际上应该被认为是“不透明”的。设置断点会插入软件中断或在被调试程序上下文中使用硬件寄存器。这就引出了一个问题:如何利用调试器不透明这一事实?
参考文献
[1] K. Kendall 和 C. McMillan,《Practical Malware Analysis: Fundamental Techniques and a New Method for Malware Discovery》,http://www.blackhat.com/presentations/bh-dc-07/Kendall_McMillan/Paper/bh-dc-07-Kendall_McMillan-WP.pdf,Black Hat DC 会议,2007。
[2] J. von Neumann,《First Draft of a Report on the EDVAC》,宾夕法尼亚大学,1945 年 6 月。
[3] P. Szor,《The Art Of Computer Virus Research And Defense》,Symantec Press,2005 年,ISBN 0-3213-0454-3。
[4] K. Kaspersky,《Hacker Debugging Uncovered》,A-List Publishing,2005 年,ISBN 1-1927-6357-4。
[5] G. Hoglund 和 G. McGraw,《Exploiting Software - How to Break Code》,Addison-Wesley Publishing,2004 年,ISBN 0-201-78695-8。
[6] E. Eilam,《Reversing: Secrets of Reverse Engineering》,Wiley Publishing,2005 年,ISBN 0-7645-7481-7。
[7] D. Lie,《Architectural Support for Copy and Tamper-Resistant Software》,第 17 页,2003 年。
[8] F. Cohen,《Computer Viruses》,ASP Press,1985 年,ISBN 1-8781-0902-2。
[9] J. Shoch 和 J. Hupp,《The "Worm" Programs: Early Experience with a Distributed Computation》,Communications of the ACM (CACM),1982 年。
[10] F. Cohen,《Computer Viruses - Theory and Experiments》,1984 年。
[11] F. Cohen,《A Formal Definition of Computer Worms and Some Related Results》,1992 年。
[12] P. Szor,《The Art Of Computer Virus Research And Defense》,第 28 页,Symantec Press,2005 年。
[13] B. Anckaert、B. De Sutter 和 K. De Bosschere,《Software Piracy Prevention through Diversity》,第 5 页,ACM,2004 年。
[14] P. Szor,《The Art Of Computer Virus Research And Defense》,第 29-36 页,Symantec Press,2005 年。
[15] R.G.C. Jenkins & Company 网站,http://www.jenkins-ip.com/serv/serv_6.htm,2007 年 9 月。
[16] D. Musker,《Protecting & Exploiting Intellectual Property in Electronics》,IBC Conferences,1998 年 6 月。
[17] SEGA ENTERPRISES LTD v. ACCOLADE INC 977 F.2D 1510 (9TH CIR. 1992)。
[18] ATARI v. NINTENDO 975 F.2D 872 (FED. CIR. 1992)。
[19] AUTODESK INC v. DYASON [1992] RPC 575 & (NO. 2) 12 RPC 259, 1993。
[20] ANACON CORP LTD v. ENVIRONMENTAL RESEARCH TECHNOLOGY LTD [1994] FSR 659。
[21] J. Robbins,《Debugging Applications for Microsoft Windows》,第二版。
[22] P. Szor,《The Art Of Computer Virus Research And Defense》,第 122-132 页,Symantec Press,2005 年。
[23] Wikipedia,《Antivirus Software》,http://en.wikipedia.org/wiki/Anti-virus_software,2007 年 9 月。
[24] P. Szor,《The Art Of Computer Virus Research And Defense》,第 76 页,Symantec Press,2005 年。
[25] R.G.C. Jenkins & Company 网站,http://www.jenkins-ip.com,2007 年 10 月。
[26] P. Szor,《The Art Of Computer Virus Research And Defense》,第 242-244 页,Symantec Press,2005 年。
[27] J. Walton,《Product Keys Based on the Advanced Encryption Standard (AES)》,https://codeproject.org.cn/cpp/AESProductKey.asp,2006 年 11 月。
[28] J. Walton,《Product Keys Based on Elliptic Curve Cryptography》,https://codeproject.org.cn/cpp/ECIESProductKey.asp,2006 年 11 月。
[29] P. Szor,《The Art Of Computer Virus Research And Defense》,第 245-246 页,Symantec Press,2005 年。
[30] C. Collberg 和 C. Thomborson,《Watermarking, Tamper-Proofing, and Obfuscation - Tools for Software Protection》,第 5 页,IEEE Transactions On Software Engineering,第 28 卷,第 8 期,2002 年 8 月。
[31] P. Szor,《The Art Of Computer Virus Research And Defense》,第 56-59 页,Symantec Press,2005 年。
[32] D. Lie,《Architectural Support for Copy and Tamper-Resistant Software》,第 V 页,2003 年。
[33] VX Heavens 网站,Virus Collection,http://vx.netlux.org/vl.php,2007 年 10 月。
[34] Microsoft 网站,《File Management Functions》,http://msdn2.microsoft.com/en-us/library/aa364232.aspx,2007 年 10 月。
[35] Microsoft 网站,《How To Use NTFS Alternate Data Streams》,http://support.microsoft.com/kb/105763,2007 年 10 月。
[36] 作者与 John Robbins 的私人通信,2007 年 6 月。
[37] J. Giffin、M. Christodorescu 和 L. Kruger,《Strengthening Software Self-Checksumming via Self-Modifying Code》,第 23-32 页, Proceedings of the 21st Annual Computer Security Applications Conference (ACSAC),2005 年,ISBN 0-7695-2461-3。
[38] V. Pirogov,《Disassembling Code with IDA Pro and SoftICE》,A-List Publishing,2006 年,ISBN 1-9317-6951-6。
[39] Fravia 网站存档,http://fravia.com/couninte.htm,2007 年 10 月。
[40] Microsoft Corporation,《Security Model for the Next-Generation Secure Computing Base》,http://www.microsoft.com/resources/ngscb/documents/NGSCB_Security_Model.doc,2007 年 10 月下载。
[41] Fravia 网站存档,http://fravia.com/protec.htm,2007 年 9 月。
[42] Symantec 网站,《What is the Difference Between Viruses, Worms, and Trojans?》,2007 年 10 月。
[43] 作者与 Henry Katz 博士的私人通信,2001 年。
[44] P. Szor,《The Art Of Computer Virus Research And Defense》,第 246 页,Symantec Press,2005 年。
[45] Microsoft 网站,《Classes in System.IO do not support Alternate Data Streams on NTFS volumes》,http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=95186,2007 年 10 月。
[46] CNet 网站,《Sony CD Protection Sparks Security Concerns》,http://www.news.com/2100-7355_3-5926657.html,2007 年 9 月。
[47] Business Week 网站,《Sony BMG Ends a Legal Nightmare》,http://www.businessweek.com/technology/content/dec2005/tc20051230_658336.htm,2007 年 10 月。
[48] Microsoft 网站,《NtQueryInformationProcess Function》,http://msdn2.microsoft.com/en-us/library/ms684280.aspx,2007 年 10 月。
[49] P. Szor,《The Art Of Computer Virus Research And Defense》,第 220 页,Symantec Press,2005 年。
[50] C. Collberg 和 C. Thomborson,《Watermarking, Tamper-Proofing, and Obfuscation - Tools for Software Protection》,第 3 页,IEEE Transactions On Software Engineering,第 28 卷,第 8 期,2002 年 8 月。
[51] Wikipedia,《Anti-Patterns》,http://en.wikipedia.org/wiki/Anti-pattern,2007 年 10 月。
[52] Business Software Alliance 网站,《2006 Global Piracy Study》,http://w3.bsa.org/globalstudy,2007 年 10 月。
[53] P. Szor,《The Art Of Computer Virus Research And Defense》,第 222 页,Symantec Press,2005 年。
[54] B. Barak 等人,《On the (Im)possibility of Obfuscating Programs》,第 6 页,2001 年 8 月 15 日。
[55] Shashank Khanvilkar,《Guaranteeing Memory Integrity in Secure Processors with Dynamic Trees》,第 4 页,2004 年。
[56] P. Szor,《The Art Of Computer Virus Research And Defense》,第 186-209 页,Symantec Press,2005 年。
[57] D. Lie、C. Thekkath 和 M. Horowitz,《Implementing an Untrusted Operating System on Trusted Hardware》,Symposium on Operating Systems Principles (SOSP),第 1 页,2003 年 10 月。
[58] B. Barak 等人,《On the (Im)possibility of Obfuscating Programs》,http://www.eecs.harvard.edu/~salil/papers/obfuscate.ps,2001 年 8 月 15 日。
[59] Research In Motion 网站,《Research In Motion Files Fourth Complaint Against Good Technology》,http://www.rim.net/news/press/2002/pr-19_09_2002.shtml,2007 年 10 月。
[60] C. Collberg 和 C. Thomborson,《Watermarking, Tamper-Proofing, and Obfuscation - Tools for Software Protection》,第 5 页,IEEE Transactions On Software Engineering,第 28 卷,第 8 期,2002 年 8 月。
[61] P. Szor,《The Art Of Computer Virus Research And Defense》,第 59-66 页,Symantec Press,2005 年。
[62] P. Szor,《The Art Of Computer Virus Research And Defense》,第 29 页,Symantec Press,2005 年。
[63] VX Heavens 网站,http://vx.netlux.org,2007 年 10 月。
[64] F. Cohen,《Computer Viruses - Theory and Experiments》,1984 年。
[65] D. Lie,《Architectural Support for Copy and Tamper-Resistant Software》,2003 年。
[66] P. Szor,《The Art Of Computer Virus Research And Defense》,第 220 页,Symantec Press,2005 年。
[67] Google 网站,http://www.google.com/search?hl=en&q=RtlSetCurrentDirectory&btnG=Search,2007 年 10 月访问。
[68] G. Nebbett,《Windows NT/2000 Native API Reference》,Macmillan Technical Publishing,2000 年,ISBN 1-5787-0199-6。
[69] Wikipedia 网站,《Economies of Scale》,http://en.wikipedia.org/wiki/Economies_of_scale,2007 年 10 月。
[70] 作者与 Brooke Stephens 博士的私人通信,2007 年 10 月。
[71] G. Wurster,《A Generic Attack on Hashing-Based Software Tamper Resistance》,第 9 页。2004 年。
[72] J. Giffin、M. Christodorescu 和 L. Kruger,《Strengthening Software Self-Checksumming via Self-Modifying Code》,第 27 页,Proceedings of the 21st Annual Computer Security Applications Conference (ACSAC),2005 年。
[72] R. Collins,《ICE Mode and the Pentium Processor》,http://www.rcollins.org/ddj/Nov97/Nov97.html,2007 年 10 月。
[73] R. Collins,《In-Circuit Emulation: How the Microprocessor Evolved Over Time》,http://www.rcollins.org/ddj/Sep97/Sept97.htm,2007 年 10 月。
[74] J. Walton,《Tamper Aware and Self Healing Code》,https://codeproject.org.cn/cpp/SelfHealing.asp,2007 年 10 月。
[75] Fravia 网站存档,http://fravia.com/protec.htm,2007 年 9 月。
[76] Microsoft 网站,《Next-Generation Secure Computing Base》,http://www.microsoft.com/resources/ngscb/default.mspx,2007 年 10 月。
[77] Market Share 网站,《Top Operating System Market Share Trend for October, 2006 to September, 2007》,http://marketshare.hitslink.com/report.aspx?qprid=5,2007 年 9 月访问。
[78] J. Giffin、M. Christodorescu 和 L. Kruger,《Strengthening Software Self-Checksumming via Self-Modifying Code》,第 23 页,Proceedings of the 21st Annual Computer Security Applications Conference (ACSAC),2005 年,ISBN 0-7695-2461-3。
[79] Jan H. P. Eloff 和 Mariki Eloff,《Information Security Management: A New Paradigm》,Proceedings of the 2003 Annual Research Conference of the South African Institute of Computer Scientists and Information Technologists (SAICSIT),2003 年 9 月。
[80] Microsoft 网站,《Inside Native Applications》,http://www.microsoft.com/technet/sysinternals/information/NativeApplications.mspx,2007 年 10 月。
[81] Electronics Weekly 网站,《Intel Grabs Processor Market Share Back from AMD》,2007 年 10 月访问。
[82] K. Kaspersky,《Hacker Disassembly Uncovered》,第二版,A-List Publishing,2007 年,ISBN 1-9317-6964-8。
[83] QuickLogic 网站,《Security in QuickLogic Devices》,http://www.quicklogic.com/images/security_WP.pdf,2007 年 10 月。
[84] J. Walton,《Product Activation Based on RSA Signatures》,https://codeproject.org.cn/cpp/ProductActivation.asp,2007 年 6 月。
[85] Fravia 网站存档,http://fravia.com/essays.htm,2007 年 10 月。
[86] Wikipedia,《Timeline of Notable Computer Viruses and Worms》,http://en.wikipedia.org/wiki/Timeline_of_notable_computer_viruses_and_worms,2007 年 9 月。
[87] Ruby B. Lee 等人,《Architecture for Protecting Critical Secrets in Microprocessors》,Department of Electrical Engineering, Princeton University, NJ 08544,第 1 页。
[88] S. Sreejith,《Reading/Writing Disk Sectors (Absolute Disk Read/Write)》,http://www.codeguru.com/Cpp/W-P/system/misc/article.php/c5765,2002 年 11 月。
[89] S. Keller,《Building Your Own Operating System》,https://codeproject.org.cn/system/MakingOS.asp,2006 年 10 月。
[90] Financial Times 网站,《Chinese Military Hacked into Pentagon》,http://www.ft.com/cms/s/0/9dba9ba2-5a3b-11dc-9bcd-0000779fd2ac.html,2007 年 9 月。
[91] Microsoft Security Advisory 944653,《Vulnerability in Macrovision SECDRV.SYS Driver on Windows Could Allow Elevation of Privilege》,http://www.microsoft.com/technet/security/advisory/944653.mspx,2007 年 11 月 7 日。
[92] Windows Security 网站,《Endpoint Security》,http://searchwindowssecurity.techtarget.com/generic/0,295582,sid45_gci1199135,00.html,2006 年 7 月 16 日,2007 年 11 月访问。
[93] 作者与 Jason Schultz 的私人通信,2007 年 11 月。
[94] eWeek 网站,《Key Generator Beats Windows Product Activation》,http://www.eweek.com/article2/0,1759,33474,00.asp,2002 年 2 月,2007 年 11 月访问。
修订
- 2007.11.27 添加了 [93]、[94]
- 2007.11.12 添加了 [92]
- 2007.11.07 添加了 [91]
- 2007.10.29 初始发布