Reverse engineering is the process of discovering the technological principles of a device, object, or system through analysis of its structure, function, and operation.
----- Eilam, Eldad & Chikofsky, Elliot J. (2007). Reversing: secrets of reverse engineering
对于大多数的IT从业人员,特别是研发人员来说,软件逆向技术是一个学习商业软件某些设计思想或者核心技术,提高自身设计实现水平的途径之一,特别是那些设计优美,性能强悍的商业软件,这些软件的设计思想和实现手段往往都做为商业机密不会公开,作为普通的研发人员来说,在工作之余希望自我快速提升,除了多多参与共享软件的设计实现以外,参考学习一下成熟的商业软件也是一个很好的途径。
在系统学习了逆向之余,我通过分析一款免费好用的软件(如图1)来总结和整理一下逆向学习软件设计实现的一般过程。
图1 软件界面图
首先,站在软件设计学习者的角度来看待这个软件的某些核心价值部分,最最本质的地方,就是那上千个可用且好用的电台URLs了,因为作者收集了相关的URLs,并通过分类整合到软件中,通过不定期升级节目库的方式来不断更新电台数据,那么对于软件设计者来说,必须自己设计并维护一个微型的数据库,即:电台信息数据库。软件的作者是如何设计组织实现这个微型数据库的呢,我们首先可以看一下,软件数据文件夹里的相关文件,并通过简单查看的方式(例如:用记事本或者其他文本类软件打开瞅一下)【如图2】。
图2 电台树明码文件关系图
此图很明显地说明了,电台树的显示组织结构。通过简单地分析不难进一步得到,数据文件的相关作用【如图3】
图3 数据文件的作用
接下来,通过监控API的调用流程,获取软件运行的关键流程信息并作出相应的分析,如图4。
图4 软件关键流程API调用分析图
接下来,就可以利用OllyDBG+IDA准备进行分析了,在深入核心过程分析之前,首先可以,使用PEID来大致看看有木有壳以及该软件采用什么语言编写的等等,为进一步的详细分析做准备,通过PEID的分析,可以知道,该软件采用Delphi编写,使用的是pascal语言,该语言对于我来说,除了很早很早在大学使用过这个做过数据库相关的课设以外就没有更多的印象了,当然如果需要逆向这种语言写的软件,重点其实并不在此语言的语法结构上,而是在于Delphi编译器将其转化为汇编的相关行为上,例如:尽量采用EAX、EDX、ECX等传参,多于三个参数的时候,对多出来的参数按照从左至右的PASCAL方式来压栈,等。如果对Delphi的函数传参及返回值的这些不清楚,那么很难继续进行进一步的函数级别的分析还原。当然在 分析的时候,可以针对该语言及其IDE的相关特点进行一些预处理,例如使用Dede来获取一些既有的相关API的辅助信息,或者直接使用IDA分析过程中加入Delphi相关库的签名等等,获取到尽可能多的额外信息,方便我们进行接下来的分析。【To be continued......】