结构类型的成员如何在堆栈上定位?

逆向工程 小精灵 结构 调试符号 堆栈变量 类型重建
2021-06-18 11:04:47

某些结构类型的成员不相邻堆叠。此处查看bzip2_base (x86-64) 中 0x33E6 处的结构类型在位置偏移 0 处有一个 int,在 4 处有一个字符,然后在 5004 处有一个 int!等等,这使结构的大小增加到 5104 字节,尽管它只包含 int 和 char 变量(每个变量 3 个)以及一个名为 strm 的结构,其长度为 640 字节。

1个回答

第二构件,称为buf(在位置4)是一个char该成员的类型定义在0x3451,这是一个数组类型。它的元素是在 处定义的每个类型0x2d04,它是一个名为 的 typedef Char,它重定向到0x29b7,确实是char(表示为基类型signed char)。

 <1><3451>: Abbrev Number: 11 (DW_TAG_array_type)
    <3452>   DW_AT_type        : <0x2d04>       ==> Char   ==> (signed) char
    <3456>   DW_AT_sibling     : <0x3462>       ==> just management info
 <2><345a>: Abbrev Number: 25 (DW_TAG_subrange_type)
    <345b>   DW_AT_type        : <0x29a8>       ==> indexed by "sizetype"
    <345f>   DW_AT_upper_bound : 4999           ==> indices are 0..4999
 <2><3461>: Abbrev Number: 0

所以该成员的类型是一个包含 5000 个Char对象的数组char所以当buf从偏移 4 开始时,下一个对象从偏移 5004 开始也就不足为奇了