紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 2453|回复: 2

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

[复制链接]

8

主题

77

帖子

2

精华

钻石会员

Rank: 6Rank: 6

积分
3279
发表于 2015-5-26 15:25:09 | 显示全部楼层 |阅读模式
本帖最后由 陌路人 于 2015-5-26 23:20 编辑

先看这张图,已知第3个结构大小是0xf0, 那么 IMAGE_NT_HEADERS64 这个结构的总共大小是多少呢, 自己计算下.

无标题.png

以前分析过,如果结构内有成员最大是8字节的,那么这个结构就以8字节对齐.
显然 这个结构中 有LONGLONG 成员 那么肯定是8字节对齐的了. 反汇编的时候要取 0xc ,和 0x10 的成员
于是我就这么计算的
  1. typedef struct _IMAGE_NT_HEADERS64 {
  2.         ULONG Signature;                           //0
  3.         IMAGE_FILE_HEADER FileHeader;     //8         
  4.         IMAGE_OPTIONAL_HEADER64 OptionalHeader;   
  5. } IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;


  6. typedef struct _IMAGE_FILE_HEADER {  // 接着上边的数下来的
  7.         USHORT  Machine;                         /*8*/   
  8.         USHORT  NumberOfSections;          /*a*/   
  9.         ULONG   TimeDateStamp;               /*c*/   
  10.         ULONG   PointerToSymbolTable;       /*10*/   
  11.         ULONG   NumberOfSymbols;           
  12.         USHORT  SizeOfOptionalHeader;      
  13.         USHORT  Characteristics;                    
  14. } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;  
复制代码


但是我发现了问题,为什么32 位 和 64位 结构对齐不一样,反汇编,偏移一样但是对应的成员变量不对了.
而且, 32的是4字节 对齐的 64的 是8字节 对齐的. 偏移不该一样的才对.

其实这时候我就陷入了误区,其实真正的算法 应该这么算的

  1. typedef struct _IMAGE_NT_HEADERS64 {
  2.     ULONG Signature;                         /*0*/
  3.     IMAGE_FILE_HEADER FileHeader;  /*4*/       //这个结构是以4字节对齐的,所以这个结构的第一个成员偏移是4

  4. typedef struct _IMAGE_FILE_HEADER { //从上边接着数下来
  5.     USHORT  Machine;                         // 4
  6.     USHORT  NumberOfSections;              //6
  7.     ULONG   TimeDateStamp;                   //8
  8.     ULONG   PointerToSymbolTable;         //c
  9.     ULONG   NumberOfSymbols;               //10
  10.     USHORT  SizeOfOptionalHeader;         //14
  11.     USHORT  Characteristics;                    //16
  12. } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;//由于4字节对齐加上第一个成员ULONG 大小是 18
复制代码

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

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


评分

参与人数 1水晶币 +100 收起 理由
Tesla.Angela + 100 很给力!

查看全部评分

837

主题

3433

帖子

2

精华

管理员

身居欧盟,心系中华。

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
36876
发表于 2015-5-26 17:24:24 | 显示全部楼层
太认真了,自愧不如。

30

主题

723

帖子

0

精华

钻石会员

Rank: 6Rank: 6

积分
2815
发表于 2015-5-26 19:47:14 | 显示全部楼层
感谢您为大家分享心得
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2022-8-19 06:52 , Processed in 0.026065 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表