首页
社区
课程
招聘
[旧帖] [原创]获取PE块表信息(C语言) 0.00雪花
发表于: 2016-2-8 16:12 1587

[旧帖] [原创]获取PE块表信息(C语言) 0.00雪花

2016-2-8 16:12
1587

      第一次发帖,最近在学习PE结构,参考的资料是小甲鱼的视频,看完视频之后在网上找了些资料来看看加深理解,听说弄懂PE的最好方式就是自己写程序获得PE的相关信息。
      于是在网上找到的这篇材料
      http://www.2cto.com/Article/201201/116186.html
      是红黑联盟上的文章,作者说有6篇文章,但是我只找到前面两篇文章

分别是
      pe结构学习心得(一)--获取DOS头信息:
      http://www.2cto.com/Article/201201/116186.html
      pe结构学习心得(二)--获取pe头信息:
      http://www.2cto.com/Article/201201/116187.html

      然后就找不到下文了,于是打算自己写吧,PE头之后貌似就是块表的信息了,看了前面两篇文章,知道怎么获取程序的映像之后就直接写代码了。
      建议不懂的同学先去看看前面两篇文章

主要步骤:
       1.打开文件

                API : CreateFile   
这是一个多功能的函数,可打开或创建以下对象,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。这里我们打开的是文件,这里就不说参数了的含义了。大家可以去查。

       2.创建映射文件(个人理解)

                API: CreateFileMapping
百度百科解释:创建一个新的文件映射内核对象。

       3.映射到自己进程的空间(把上一步创建到内核对象映射到自己的进程空间)

                API: MapViewOfFile
个人理解就是第二步的时候还只是内核知道文件的映射,这一步是把文件映射到自己的进程地址空间来。

       4.接着就是通过指针指向文件映射的开头,获取DOS头之后再获取PE头,我们的目的就是获取块表的开始地址,怎么获取呢?

答:我们知道,块表是紧接着PE头的可选头OptionalHeader之后的,那么我们就是可以先获取可选头的地址(这个有了PE头就可以获取了),然后就在PE的文件头(IMAGE_FILE_HEADER)里获取成员SizeOfOptionalHeader的值,这个就是可选头的大小。
最后块表的位置就是:第一个块表位置 = 可选头位置 + 可选头大小(SizeOfOptionalHeader)。
至此,我们的主要任务完成了,然后再根据IMAGE_FILE_HEADER的NumberOfSections做循环输出各个块表的字段即可

测试结果:






然后再用PE INFO 看了一下,貌似一致



声明:
以上是小菜最近学习PE结构的一点理解,希望那些和我一样的菜鸟可以参考参考就可以了,以免哪些出错了误人子弟,理解有误还希望大神们指点一下。

为了排版我就不贴代码了
代码.c在附件:

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//