(一) 概述
我们逆向的世界
在软件破解或者软件加密、解密这个圈子里面,大家对于逆向工程这个词语并不陌生,因为大家兴趣爱好的原因,使大家每天都在与逆向工程这个词语进行着斗争,当然,我们这里使用的逆向工程这个概念,指的是计算机软件方面的逆向工程,而没有包括逆向工程这个词语所包含的所有范围。
逆向计算机软件的世界
从某种程度上来说,计算机软件的逆向工程技术主要过程为分析计算机程序,在分析计算机程序的过程中,逐渐建立起高于源代码级别的更抽象层次的程序运行过程。使用一些有助于逆向工程的软件产品,可以帮助我们来完善这个过程的建立,例如,我们通过使用IDA、OD等反编译调试软件,来寻找程序功能模块、寻找程序数据结构等。
广义上的逆向工程、案例
从广义上来讲,通过对某种产品的结构、功能、运行机理来进行分析、分解、研究完后,制作出功能相近,但又不完全相同的产品,这属于逆向工程的一个基本概念。
逆向工程的使用,多数人错误的认为会侵犯对方的知识产权,但在实际应用上,却往往又不会侵犯知识产权。例如,在集成电路领域,如果怀疑对手侵犯了自己的知识产权,则可以完全使用逆向工程技术来搜集自己的证据。记得有次与朋友讨论知识产权问题,在美国好像是产品相似度或者计算机程序代码的相似度超过60%,即判定为侵犯知识产权。
在逆向工程针对硬件领域内,微软开发人体力学鼠标,就是一个很典型的例子。以微软公司生产的鼠标器为例,就其功能而言,只需要有三个按键就可以满足使用需要,但是,怎样才能让鼠标器的手感最好,而且经过长时间使用也不易产生疲劳感却是生产厂商需要认真考虑的问题。因此微软公司首先根据人体工程学制作了几个模型并交给使用者评估,然后根据评估意见对模型直接进行修改,直至修改到大家都满意为止,最后再将模型数据利用逆向工程软件 imageware 生成 cad 数据。当产品推向市场后,由于外观新颖、曲线流畅,再加上手感也很好,符合人体工程学原理,因而迅速获得用户的广泛认可,产品的市场占有率大幅度上升。
从某种角度上来解释逆向工程这个概念的话,我们可以把逆向工程理解为:剖析一个产品,知道这个产品的工作原理。因此,在逆向工程这个词语概念的大范围下,逆向工程还包括硬件的逆向工程、软件的逆向工程等等。对于,硬件的逆向工程而言,我们可以举一个简单的例子,
软件的逆向工程是分析程序,力图在比源代码更高抽象层次上建立程序的表示过程,逆向工程是设计的恢复过程。逆向工程工具可以从已存在的程序中抽取数据结构、体系结构和程序设计信息。
逆向工程,通过对某种产品的结构、功能、运作进行分析、分解、研究后,制作出功能相近,但又不完全一样的产品过程。
逆向工程可能会被误认为是对知识产权的严重侵害,但是在实际应用上,反而可能会保护知识产权所有者。例如在集成电路领域,如果怀疑某公司侵犯知识产权,可以用逆向工程技术来寻找证据。
漏洞挖掘?
软件方面的逆向工程,大家的第一印象就是漏洞挖掘技术,但在实际的应用过程中,漏洞挖掘在网络安全逆向工程的应用方面,只属于一个环节而已。
(二) 逆向工程在实际生产中的使用
了解生产该产品的厂家的实力
在决定采纳某款厂家的产品前,先对该厂家的产品进行适当的逆向分析,以确认该款产品是否适合自己的使用。在这个过程中,主要需要注意的就是厂家的产品质量、产品是否符合安全需求。例如:我们需要购买一批网络安全主动防御产品,但我们需要对这些安全厂商的产品进行市场调查、功能检查,由于网络安全产品的特殊性,为了更进一步的获取该产品是否符合我方的要求,可以在适当的层面上对该产品进行逆向分析,以确认其默认的安全性,以及产品的技术优势。
了解产品的功能,以方便自己更好的创建兼容的组件
很多时候,软件厂商会公开自己的很多组件接口,以方便客户开发自己使用的第三方组件。某些时候,由于软件厂商的一些小错误,客户自行开发的第三方组件往往会出现一些未知问题。在这个时候,就需要我们对软件厂商的组件进行适当的逆向工程,以期望找到组件接口的内部逻辑流程,然后更加和谐的创建兼容的组件。
确定产品是否存在漏洞或者设计缺陷(软件安全性分析)
在网络安全领域内,一切以安全两字为基础,因此,在选择使用某款软件产品前,在某些特殊情况下,需要对这款软件产品进行逆向分析,分析该产品存在漏洞的几率,以及该款产品是否存在设计方面的缺陷。
评定漏洞的存在几率:
1. 黑盒子测试
2. 漏洞挖掘工具测试
3. 针对性的Fuzzing测试
评定设计缺陷:
1. 非法字符过滤不足
2. Unicode与ASCII的问题
3. 权限绕过
4. 对不正当操作的处理程度
确定产品是否包含未公开功能
漏洞!…又是漏洞!…在实际情况下,的确存在这样的问题。通过上述的软件安全性分析,我们可以得到一份详细的问题列表,以此来验证该款软件产品的安全性。如果,发现该产品存在未公开漏洞或者自身即包含了恶意功能,在单纯的安全性来考虑的话,即使该款产品的性能再好,我们也不得不放弃这款产品。很好的例子:迅雷的之前版本会搜集用户的桌面信息,而迅雷目前的版本也存在很多不为人知的秘密。
产品相似性对比技术(法律相关)
产品相似性对比分析在安全领域也有所涉及,例如,某家规模小的软件厂商,通过逆向工程的办法,“悄悄”使用了另外一家软件厂商的功能模块。如果被这一家软件厂商发现,则该厂家可以使用逆向工程对这家软件厂商的产品进行对比分析,以确认代码是否存在相似性。
法律规定:
代码对比。计算机程序指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可被自动转换成代码化指令序列的符号化指令序列或者符号化语言序列,包括源程序和目标程序。源程序指的是可以由人类理解的高级语言如C语言、FORTRAN语言等组成的代码序列,它必须进行编译才能被计算机所运行。一般来讲,计算机软件单独以源程序方式向外传播的情况较少,大多是以目标程序的形式向外传播,而不向外公布其源程序。
(三) 逆向工程对于黑帽、白帽而言
黑帽子:地下黑客技术研究者,具备某种邪恶感。
白帽子:安全研究人员,多数为网络安全公司的在职人员,也有很多具备正义性的个人研究者。
他们感兴趣的方向有那些?
逆向操作系统,熟悉操作系统内部机理
熟悉操作系统的内部,从而帮助自己实现一些技术想法。也包括对操作系统进行漏洞挖掘、相似性对比分析、补丁分析技术。
逆向一款软件产品,熟悉软件产品的未公开功能及是否存在恶意行为
某些网络安全逆向研究人员,会主动利用业余时间分析病毒、木马程序、黑客程序,并借此挖掘这些恶意软件的功能实现及是否存在恶意行为。事实证明,这样的分析是必要的,例如:在某些闭源黑客工具内,经常被安置后门程序;曾经有一款很经典的FTP密码破解软件,就存在恶意行为,该软件会在检测到自身连续运行24个小时后,主动发送已破解的FTP用户名、密码至作者邮箱。类似的案例还有很多,例如,有些漏洞利用代码的作者,会书写具有恶意功能的 shellcode,混合入正常的shellcode内,以迷惑使用exploit的脚本小子。
逆向安全产品,查找安全产品的不足
安全厂商真的可靠嘛?答案很简单,不可靠。因为安全软件厂商的程序也是由人来编写的,只是他们的软件安全性测试流程更加的强悍而已。而做为邪恶的黑帽子而言,他们的乐趣正是朝这些所谓安全的安全厂商进行挑战,挑战的目的就是不断的挖掘出安全厂商产品中的漏洞及弱点。对于白帽子而言,他们也在研究安全厂商的产品,第一个原因是为了检测该产品的安全性,第二个原因则是为了找到产品中的漏洞-黑客的本能反应。
例子:安全研究人员对卡巴斯基的逆向,并在逆向的过程中寻找利用办法。当然还有很多黑帽子进行同类型的研究,只是资料保持了私有。
逆向任何程序,查找程序漏洞
对任意常用的程序进行黑盒子测试,进行漏洞挖掘。黑帽子在发现漏洞后,会书写私有化的利用代码,并进行恶意攻击;白帽子在发现漏洞后,会通知厂商,并公布漏洞细节。
破解软件
破解软件,或许使用权,把破解软件当成一种乐趣。
获取软件源代码
通过黑客技术得到软件源代码,并进行更深入的分析。
(四) 逆向工程中图形化技术的使用
IDA OD Windbg SoftICE Syser Debugger 图形化软件 Etc… |
图形化对比技术很大程度上减轻了代码流程的分析过程。IDA本身在图形化对比方面已经有所提高,但在某些逆向分析的项目内,我们或许还需要根据项目需要或者个人习惯来选择一款图形化对比软件。
下面我们选择一款免费的图形化工具,结合修改过的一款插件进行演示。
使用GDE Community Edition。
运行IDA插件,产生了以下函数流程列表:
每个产生的图形都根据函数地址产生,我们以高亮显示的avp.exe-00416250.gml为例来阐述图形化工具的运用。
IDA5.0本身的图形化问题:
拖拽图形区域更舒服,但在某些时候,却并不一定适合我们的习惯。
WinGraph32本身的图形化问题:
结构清晰、条理,但却无法实现编辑功能。
GDE Community Edition并非是最好、最合适的图形化工具,只是自己使用习惯了而已,大家可以寻找更好的图形化对比工具,并根据IDA SDK书写功能更强大的插件。
(五) 总结
以上内容仅仅简单的概述了自己对逆向工程在网络安全领域运用的一些想法,当然逆向工程还有很多种用途,本文章不当之处,请大家指正。