陌路人 发表于 2015-5-26 15:25:09

反汇编之-->分析结构偏移

本帖最后由 陌路人 于 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 {// 接着上边的数下来的
      USHORTMachine;                         /*8*/   
        USHORTNumberOfSections;          /*a*/   
        ULONG   TimeDateStamp;               /*c*/   
        ULONG   PointerToSymbolTable;       /*10*/   
        ULONG   NumberOfSymbols;         
        USHORTSizeOfOptionalHeader;      
      USHORTCharacteristics;                  
} 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 { //从上边接着数下来
    USHORTMachine;                         // 4
    USHORTNumberOfSections;              //6
    ULONG   TimeDateStamp;                 //8
    ULONG   PointerToSymbolTable;         //c
    ULONG   NumberOfSymbols;               //10
    USHORTSizeOfOptionalHeader;         //14
    USHORTCharacteristics;                    //16
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;//由于4字节对齐加上第一个成员ULONG 大小是 18


因为第二个结构 是以4字节对齐的,所以, 第一个 ULONG 以4字节计算, 不能以8字节计算,
如果 _IMAGE_FILE_HEADER这个结构是以 8字节计算的, 那么 第一个ULONG就得以 8字节计算

这次我理解存在的误区就是,当内嵌一个结构的时候, 没有注意这个内嵌结构是以几字节对齐的.
并且一开始以为,只要内嵌一个结构那么一定是8字节的`````(毕竟以前看的那些结构大多数都是以8字节对齐的,根本就没在意这个问题)


Tesla.Angela 发表于 2015-5-26 17:24:24

太认真了,自愧不如。

upring 发表于 2015-5-26 19:47:14

感谢您为大家分享心得
页: [1]
查看完整版本: 反汇编之-->分析结构偏移