危险漫步博客
有时候,正是那些意想不到之人,成就了无人能成之事。
文章1443 浏览13839428

PE系列之PE查看器

写PE查看器并不是很复杂的事情,只要按照PE结构一步一步的解析就可以了,下面简单的解析其中几个字段内容,显示一下节表的信息,写PE查看器。

PE查看器的界面就按照如图4-26所示的那样来设置,不过这个可以按照个人的偏好进行设置,编写该PE查看器的步骤为打开文件并创建文件内存映像,判断文件是否为PE文件并获得PE格式相关结构体的指针,解析基本的PE字段,枚举节表,最后关闭文件,我们需要在类中添加几个成员变量及成员函数,添加的内容所示。

按照前面所说的顺序,依次实现添加的各个成员函数。

这个函数的主要功能是打开文件并创建内存文件映像。通常对文件进行连续读写时直接使用ReadFileO秕WriteFileO两个函数,当不连续操作文件时,每次在ReadFile0或者WriteFile0后就要使用SetFilePoin把fO来调整文件指针的位置,这样的操作较为繁琐。内存文件映像的作用是把整个文件映射入进程的虚拟空间中,这样操作文件就像操作内存变量或数据一样的方便,创建内存文件映像所使用的函数存两个,分别是CreateFileMapping()和MaEViewOfFile0。

下面分别介绍这两个函数,CreateFileMappjng()函数的定义如下:

参数说明如下。

(1) hFile:该参数是CreateFile()函数返回的句柄。

(2) lpAffi'ibutes:是安全属性,该值通常是NULL。

(3) flProtect:创建文件映射后的属性,通常设置为可读可写PAGE READWRITE,如果需要按照装载可执行文件那样把文件映射入内存的话,那么需要使用SEC IMAGE最后3个参数在这里为O。如果创建的映射需要在多进程中共享数据的话,那么最后一个参数设定为一个字符串,以便通过该名称找到该块共享内存。

该函数的返回值为一个内存映射的句柄,

MapViewPffle()函数的定义如下:

参数说明如下:

(1)hfilemappingobject:该参数为createfilemapping()返回的句柄。

(2)dwdeiredaccess:想获得的访问权限,通常情况下也是可读科协FILF_MAO_READ、FILE_MAP_WRITE.

最后3个参数一般给0值就可以了。

按照编程的规矩,打开要关闭,申请要释放,那么对于CREATEFILEMAPPING()的关闭需要使用CLOSEHANDLE()函数,对于MAPVIEWOTFILE()来说,要使用UNMAPCIEWOFILE,该函数的定义如下:

该函数的参数就是MAPVIEWOFFILE()函数的返回值。

接着说PE查看器,文件已经打开,那么就要判断文件是否为有效的PE文件了,如果是有效的PE文件,那么就把解析PE格式的相关结构体的指针也得到,代码如下:

这段代码应该非常容易理解,继续看解析PE格式的部分吧。

对于PE格式的基础信息来说,简单的过去结构体的成员变量,没有过多复杂的内容,获取导入表,到处表就要比获取基础信息要复杂了,关于导入表,导出表的内容将在后面介绍,接下来进行节表的枚举,代码如下:

最后的动作就是释放动作了,因为很简单,这里就不给出代码了,整个PE查看器就算是写完了。