• 标 题:逆向工程实例 (2千字)
  • 作 者:herofire
  • 时 间:2002-3-21 16:44:46
  • 链 接:http://bbs.pediy.com

逆向工程实例
背景:
    本文主要描述本人在工作中运用逆向工程方法来进行工作的实例,供大家参考、研究,有不足之处,请大家指出。
    本人曾参与一项目,主要内容是对一现有的网络通信设备程序(运行在NT环境下)进行二次开发,最终目的是分析出通信设备的通信协议。本文在这里所描述的是分析阶段的所运用到的逆向工程知识和一些思想方法思路.
经过初步分析研究,发现它是在安装时多增加了一个网络协议来实现程序和通信设备之间的通信,我们的思路是建立一个底层网络数据侦听程序,利用此程序来模拟原来程序的通信过程。我建立一个网络中间层驱动程序,它理论上可以接收到以太网中的所有数据,然后我在此驱动程序的基础上做了一些应用程序来做模拟实验,但没有达到理想的效果,初步怀疑是此驱动程序没有能接收到所有网络数据包。因此,我想在它原有程序上分析它所接收和发送网络数据的数量和数据,保存下来与我们的驱动程序所接收到的数据相比较。
使用工具:
    Softice,Wdasm32,Pediort1.7,Uedit32,VC++
参考资料:
  NT下驱动程序工作原理,PE文件结构,驱动开发网(www.driverdevelop.com).上关于NDIS的一些文章    。
大致思路:
    先让我们对NT驱动程序程序工作原理有个大致的了解, NT驱动程序结构如下:
1.应用程序
2.驱动程序层
3.HAL硬件抽象层
由上面的结构我们了解如下:
1. 驱动程序负责与HAL硬件抽象层通信,它工作在核心状态,本文不涉及;
2. 应用程序运用在RING 3状态下,它负责与驱动程序通信,所有数据均通过它发送;
因此,我们可得出一个结论:我们可在2中对它的一些读、写操作进行必要的截获,先转到我们的程序中记录下来后,再继续它原来流程;
    按照此思路我们参考一些资料和利用Wdasm32来进行静态分析后,得到程序是通过WriteFie、ReadFile来将网络数据与驱动程序来交互操作。因此,我们所做的工作就是将这两个函数拦截,转到我们的程序中,记录下数据后再还原流程。
具体过程:
1. 利用VC做一个动态库,用它来进行数据记录工作,它同时导出两个接口,用来替换原有的WriteFie、ReadFile函数;
2. 用Pediort1.7程序将上面动态库中两个导出接口加入到它原程序的Import表中,此时Pediort可形成一个文件说明我们在加入的这两个接口的地址;
3. 找到原程序中的WriteFie、ReadFile函数在Import表中的记录数据,用2中所产生的地替换源地址;
4. 经过上述的步骤就完全可以将它所接收、发送的数据进行保存供我们对照。
小结:
    在实际工作善于利用逆向工程知识来协作可使我们的工作事半功倍。