反汇编之-->分析结构偏移
本帖最后由 陌路人 于 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字节对齐的,根本就没在意这个问题)
太认真了,自愧不如。 感谢您为大家分享心得
页:
[1]