| 
 | 
 
 本帖最后由 陌路人 于 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字节对齐的,根本就没在意这个问题) 
 
 
 |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |