.data:004305FC word_4305FC dw 1583h
.data:004305FC
.data:004305FE word_4305FE dw 35B6h
.data:00430600 dw 6835h
.data:00430602 dw 6553h
.data:00430604 dw 6351h
.data:00430606 dw 23F5h
.data:00430608 dw 6845h
.data:0043060A dw 6344h
.data:0043060C dw 6823h
.data:0043060E dw 2342h
.data:00430610 dw 2474h
...
此外,我还对访问数据的代码进行了以下反汇编:
...
mov eax, [ebp+Variable_1]
xor ecx, ecx
mov cx, word_4305FE[eax*2]
...
mov eax, [ebp+Variable_1]
xor edx, edx
mov dx, word_4305FC[eax*2]
...
看起来像另一个数组中的数组。我对么?如果没有,您认为数据结构是什么?如果是单个数组,为什么要通过两个不同的“ heads”
word_4305fc
和word_4305FE
访问它?谢谢。
添加:
以下是对以下评论的回应。谢谢大家,非常感谢您的投入!我真的很感谢它以及整个RE社区。我觉得我的问题似乎需要澄清。我确实意识到这是一个数组。我也清楚地看到
Variable_1
是数组的索引。另外,我可以看到迭代。但是,这不是我的问题。我真正想要的是澄清或可能的解释。我如何区分该数组是否确实是更复杂的数据类型?为何编译器选择使用2个不同的角度来引用此数据类型:使用2个全局变量word_4305fc
和word_4305FE
?是否有特定原因?是否表示更复杂的数据类型? #1 楼
如Dcoder所示,short
数据类型的数组从较低地址开始,并且数组基数由2
的增量对应于将1
添加到索引。请考虑以下C代码:short array[256];
// ...
cx = array[variable_1+1];
// ...
// ...
dx = array[variable_1];
// ...
考虑编译器在编译这些代码片段时所具有的选择。它可能会生成如下代码:
mov eax, [ebp+Variable_1]
xor ecx, ecx
mov cx, word_4305FC[eax*2+2] ; note the +2 and the -FC address
或者也许:
mov eax, [ebp+Variable_1]
inc eax ; note this
xor ecx, ecx
mov cx, word_4305FC[eax*2] ; note the -FC address
或者您发布的内容是等效的代码序列:
mov eax, [ebp+Variable_1]
xor ecx, ecx
mov cx, word_4305FE[eax*2] ; note the -FE address
编译器所做的是消除地址位移中的“ +2”或“ inc eax” ”,并在数组地址中添加1 * sizeof(short)来代替它。这样可以进行更优化的计算,而在运行时不会进行任何增量。
评论
编译器消除+2使得IDA将其表示为2个变量,不是吗?
– PSS
13年6月11日在22:24
IDA将其表示为两个变量,因为就IDA而言,它是两个变量,因为它是从两个不同的位置访问的。如果要更改它,可以转到较早的地址,然后使用alt-numpad *组合键在该位置创建一个数组。
–滚轴
2013年6月11日22:50
评论
它是一个从0x4305FC开始的单词数组,该代码分别在索引[Variable_1 + 1]和[Variable_1]处访问其成员。我同意以上评论。而且,它看起来像是迭代循环的一部分。
修改我以前的评论,它不是“更复杂的数据类型”,因为更改Variable_1的值会将访问的偏移量更改2个字节,并且从该偏移量中读取的字节数完全相同。在更复杂的数据类型中,数组的成员将更大。