PE格式详解(九)

来源:互联网 发布:简易平面广告制作软件 编辑:程序博客网 时间:2024/05/18 18:15
 

         好了,如果你确实按进程看到了这里,那么我首先要钦佩你的毅力,感谢你的支持,同时也恭喜你已经对PE格式有了比较全面的了解。回想起来,其实PE格式的理解并不很困难,只是比较复杂,也容易搞混结构关系,所以我写了这第九篇,把PE格式的总体结构按研究的顺序给出,让这个轮廓清晰地出现在脑中。

         好,如果我们拿到一个EXE,想要去分析它的格式,我们可以按下面的步骤进行:

         一。首先是DOS  MZ Header,对应C结构IMAGE_DOS_HEADER,其中第一个成员e_magic用于判断是否为合法的EXE,而通过最后一个成员e_lfanew可以找到PE Header的位置。

    二。找到PE Header,对应C结构为IMAGE_NT_HEADERS32。第一个成员Signature可以验证是否为合法的PE文件。第二个成员结构IMAGE_FILE_HEADER FileHeader可以得到PE的类型和区段的个数。通过IMAGE_OPTIONAL_HEADER OptionalHeader可以访问附加头。

    三。继续查看OptionalHeader,可以得到一些代码或数据的长度及虚拟地址,还有一个比较有用的Data Directory目录,里面可以查到输出表和输入表等数据结构的地址和长度。

    四。紧接着就是区段表(Section Table),可以找到EXE中所有段的信息。

    五。按照段表分别找到对应段的所有数据。

六。访问.edata或者输出表可以得到函数输出信息,表项结构为IMAGE_EXPORT_DIRECTORY

七。访问.idata段,可以得到DLL引用的所有信息。子步骤为:1。遍历所有IMAGE_IMPORT_DESCRIPTOR数组,每个元素对应一个DLL;2。找到每个元素中的成员,访问两个FirstThunk指向的IMAGE_THUNK_DATA32结构数组;3。其中每个元素要么按IMAGE_IMPORT_BY_NAME结构访问,要么当作Ordinal访问;4。如果EXE还有绑定输入目录表(Bound Import Table),则可以接着去访问它,元素结构为IMAGE_BOUND_IMPORT_DESCRIPTOR,对于有输出转送的DLL,还可以进而访问IMAGE_BOUND_FORWARDER_REF结构数组

八。访问数据段(?)、代码段(反汇编器)、资源段(资源编辑器)可用及其他的所有区段,这个就不属于PE格式范围了。

九。如果这个EXE被加过壳,则在正常访问前,还需要将它先脱壳。

好了,我的水平就只能把PE格式为你介绍到这,进一步的研究就靠你自己啦,最后说一声,感谢大家的支持!

原创粉丝点击