-
-
[旧帖] [原创]获取PE块表信息(C语言) 0.00雪花
-
发表于: 2016-2-8 16:12 1612
-

第一次发帖,最近在学习PE结构,参考的资料是小甲鱼的视频,看完视频之后在网上找了些资料来看看加深理解,听说弄懂PE的最好方式就是自己写程序获得PE的相关信息。
于是在网上找到的这篇材料
828K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6m8M7Y4c8A6j5$3I4W2i4K6u0r3x3U0l9I4x3U0l9I4i4K6u0r3x3e0p5$3x3e0R3$3i4K6u0W2K9s2c8E0L8l9`.`.
是红黑联盟上的文章,作者说有6篇文章,但是我只找到前面两篇文章
分别是
pe结构学习心得(一)--获取DOS头信息:
a42K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6m8M7Y4c8A6j5$3I4W2i4K6u0r3x3U0l9I4x3U0l9I4i4K6u0r3x3e0p5$3x3e0R3$3i4K6u0W2K9s2c8E0L8l9`.`.
pe结构学习心得(二)--获取pe头信息:
d22K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0u0U0N6r3!0Q4x3X3g2U0L8$3#2Q4x3V1k6m8M7Y4c8A6j5$3I4W2i4K6u0r3x3U0l9I4x3U0l9I4i4K6u0r3x3e0p5$3x3e0R3%4i4K6u0W2K9s2c8E0L8l9`.`.
然后就找不到下文了,于是打算自己写吧,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在附件:
赞赏
谁下载
赞赏
雪币:
留言: