|
本帖最后由 陌路人 于 2015-5-26 23:20 编辑
先看这张图,已知第3个结构大小是0xf0, 那么 IMAGE_NT_HEADERS64 这个结构的总共大小是多少呢, 自己计算下.
以前分析过,如果结构内有成员最大是8字节的,那么这个结构就以8字节对齐.
显然 这个结构中 有LONGLONG 成员 那么肯定是8字节对齐的了. 反汇编的时候要取 0xc ,和 0x10 的成员
于是我就这么计算的
- typedef struct _IMAGE_NT_HEADERS64 {
- ULONG Signature; //0
- IMAGE_FILE_HEADER FileHeader; //8
- IMAGE_OPTIONAL_HEADER64 OptionalHeader;
- } IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
- typedef struct _IMAGE_FILE_HEADER { // 接着上边的数下来的
- USHORT Machine; /*8*/
- USHORT NumberOfSections; /*a*/
- ULONG TimeDateStamp; /*c*/
- ULONG PointerToSymbolTable; /*10*/
- ULONG NumberOfSymbols;
- USHORT SizeOfOptionalHeader;
- USHORT Characteristics;
- } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
复制代码
但是我发现了问题,为什么32 位 和 64位 结构对齐不一样,反汇编,偏移一样但是对应的成员变量不对了.
而且, 32的是4字节 对齐的 64的 是8字节 对齐的. 偏移不该一样的才对.
其实这时候我就陷入了误区,其实真正的算法 应该这么算的
- typedef struct _IMAGE_NT_HEADERS64 {
- ULONG Signature; /*0*/
- IMAGE_FILE_HEADER FileHeader; /*4*/ //这个结构是以4字节对齐的,所以这个结构的第一个成员偏移是4
- typedef struct _IMAGE_FILE_HEADER { //从上边接着数下来
- USHORT Machine; // 4
- USHORT NumberOfSections; //6
- ULONG TimeDateStamp; //8
- ULONG PointerToSymbolTable; //c
- ULONG NumberOfSymbols; //10
- USHORT SizeOfOptionalHeader; //14
- USHORT Characteristics; //16
- } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;//由于4字节对齐加上第一个成员ULONG 大小是 18
复制代码
因为第二个结构 是以4字节对齐的,所以, 第一个 ULONG 以4字节计算, 不能以8字节计算,
如果 _IMAGE_FILE_HEADER 这个结构是以 8字节计算的, 那么 第一个ULONG 就得以 8字节计算
这次我理解存在的误区就是,当内嵌一个结构的时候, 没有注意这个内嵌结构是以几字节对齐的.
并且一开始以为,只要内嵌一个结构那么一定是8字节的`````(毕竟以前看的那些结构大多数都是以8字节对齐的,根本就没在意这个问题)
|
评分
-
查看全部评分
|