PE文件 节表IMAGE_SECTION_HEADER的正确定位方法
来源:互联网 发布:微信软文制作软件 编辑:程序博客网 时间:2024/05/16 01:58
网络上大部分资料对PE文件的节表的定位方式都是下面这样的
1 (LPVOID)((BYTE *)a + ((PIMAGE_DOS_HEADER)a)->e_lfanew + SIZE_OF_NT_SIGNATURE + sizeof(IMAGE_FILE_HEADER) + sizeof(IMAGE_OPTIONAL_HEADER):
其意思是这样的:
为了在解释上面的代码之前:首先要介绍些PE头的结构。
在PE文件中开始是DOS头,之后是Stub dos,再之后是NT头,在之后是节表头。也就是我们要定位的。
其中NT头的定义是这样的
typedef struct _IMAGE_NT_HEADERS { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; } IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
他包括三个部分。
1》PE文件标识
2》文件头
3》可选头
现在就可以理解最开始的那条语句的含义
首先
1
((PIMAGE_DOS_HEADER)a)->e_lfanew 指向NT头的起始文件偏移(FOA)
之后
1
SIZE_OF_NT_SIGNATURE +
sizeof
(IMAGE_FILE_HEADER) +
sizeof
(IMAGE_OPTIONAL_HEADER)
//NT头的大小
加上NT头的大小。前面我们说过节表头紧跟在NT头之后,这样定位似乎很合理,很正确。开始我也是这么以为的,但是知道我碰到无法定位节表头的情况下我才仔细对比了字节码中的数据。
我是打开的eclipse.exe(java开发的朋友应该很了解吧,^_^).我发现在节表头和可选头的中间有16个空余,它既不在IMAGE_OPTION_HEADER32中有定义,也不再节表中定义。但是有的PE文件中并没有者16个字节。这就是我们用上面的定位方式无法准确的定位所有的PE文件的原因。
哎,找到这里我深深地擦了一把大汗,我这时陷入了困境,但是我突然回想起来,在IMAGE_FILE_HEADER中有一个字段指明了可选头的大小。它就是
1 typedef struct _IMAGE_FILE_HEADER2 {3 WORD Machine; //运行平台4 WORD NumberOfSections; //文件的区块数目5 DWORD TimeDateStamp; //文件创建日期和事件6 DWORD PointerToSymbolTable; //只想符号表(主要用于调试)7 DWORD NumberOfSymbols; //符号表中的符号个数(同上)8 WORD SizeOfOptionalHeader; //IMAGE_OPTIONAL_HEADER32结构大小
红色标注的部分。之后我在此对比了eclipse的字节码,发现使用该字段来定位,就ok了
那么正确的定位方法就是这样了。
IMAGE_DOS_HEADER.e_lfanew //文件头FOA+ 4//PE文件标识+ sizeof(PEStructs::IMAGE_FILE_HEADER) //文件头大小+ pTemFileHeader->SizeOfOptionalHeader, //可选头大小
哎,看到这里,功夫总算不负有心人。拿出来分享下,免得其它童鞋,也误入歧途。
阅读全文
0 0
- PE文件 节表IMAGE_SECTION_HEADER的正确定位方法
- PE文件区块表IMAGE_SECTION_HEADER
- PE文件,节头有感IMAGE_SECTION_HEADER
- PE文件格式--IMAGE_SECTION_HEADER
- PE文件重定位
- 小甲鱼PE详解之区块表(节表)和区块(节)(PE详解05) IMAGE_SECTION_HEADER
- PE文件基址重定位
- PE文件,导入表定位
- PE文件结构部分解析以及输入的定位
- 关于PE病毒编写的学习(七)——重定位的谬误和它的正确写法
- 关于PE病毒编写的学习(七)——重定位的谬误和它的正确写法
- RoR的正确定位
- PE文件结构详解--重定位
- PE文件详解-----PE文件的简介
- 关于PE病毒编写的学习(八)——定位API的N种方法
- 关于PE病毒编写的学习(7)——定位API的N种方法
- PE文件的运行
- 学习笔记:病毒感染PE文件的基本方法
- 序列补零、插值后对FFT变换的影响以及频率分辨率的理解
- ubuntu下配置wpsscan
- 数可重入性与不可冲入性及编写规范
- hpu暑假训练【最长公共子序列&&回溯输出】
- 《Android那些事》——Fragment的生命周期及常见问题
- PE文件 节表IMAGE_SECTION_HEADER的正确定位方法
- JZOJ5243【GDOI2018模拟8.8】超级绵羊异或 类欧几里得算法
- appium for windows 10的安装及环境搭配
- 2017 Multi-University Training Contest 5 solutions BY 吉如一
- NSRunLoop的退出方式
- 在Jenkins上创建Job并进行配置,发布,详细见《Jenkins 创建 job》
- 生产者消费者模型[多生产者-多消费者模式]
- HDU 1698 Just a Hook——区间更新的线段树
- Python学习笔记(二)-- 变量类型 + 运算符