取得机器码字节流
PE file wrapper object
在前面的章节中我们提到过要使用一个独立功能的对象来提供数据流这个服务,也决定了在这个项目中,我们将用一个似类于PE dump的对象来完成这个功能。非常幸运的是,我们有很多的PE dumper例子程序。(我使用Matt Pietrek's PEDUMP作为切入点)
根据需求,我们的对象需要有这样的能力:从用户提供的可执行文件中得到代码部分然后输出给其它需要使用机器字节流的模块。
这个对象的需求如下:
----将一个可执行文件名作为输入
----处理PE文件格式
----提供函数以便于客户可以得到机器码字节流
这并不是一系列复杂的需求,你可以很容易以一个典型的PE dumper的功能来扩张这个对象。
虽然PE文件dumper 是一个有趣并且重要的话题,但在此我并不打算深入的讨论。况且,这个对象是一个”附加“的对象,我们对Parser和Decorder更加感兴趣,因为它们是一个反汇编器的核心所在。
由此,我就仅仅来展示一下我的Data stream provider的实现,它叫做PEFileWrap
很基本的,PEFileWrap提供了一些方法来给出一个PE文件中代码节的位置及大小。
一个PE文件有如下几个不同的节:
然后,你不并关于除代码节以外的节。链接器将所有的代码都放入这个节中。当系统加载器开始执行一个文件时,这个节的第一个字节将被执行。这个节就是我们将要反汇编的机器码字节流。
接口如下,我们要使用的接口已被高亮显示
怎么样创建和使用IPPEFileWrap对象
我决定将此打包成一个DLL有两个如下理由:
1、使得本项目更加简洁
2、我可以随时的升级这个DLL。既然PE dump是另一个可能的可扩展项目
这个DLL有一个名为CreatePEFileWrap()的导出函数,调用此函数可以得到一个指向IPPEFileWrap对象的指针
当你调用CreatePEFileWrap时,它返回PEUTILITY_ERROR_CODE,使用这个返回值来判断是否调用成功。
注意:这个DLL实现需要使用COM。我在此使用none-com object,因为在此介绍COM会使得本项目更加的复杂难以理解。不用说也知道,使用COM object当然更好了。
这个PEFileWrap对象有一个巨大的缺陷在于它不是多线程的。换句话说,你不能用此对象打开多个PE文件。实际上,在当前的实现在,你所能做的就是打开一个PE文件直到进程结束后,这个DLL文件被释放,这个对象才会被释放。