我有以下数据:

.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_4305fcword_4305FE访问它?

谢谢。

添加:

以下是对以下评论的回应。谢谢大家,非常感谢您的投入!我真的很感谢它以及整个RE社区。我觉得我的问题似乎需要澄清。我确实意识到这是一个数组。我也清楚地看到Variable_1是数组的索引。另外,我可以看到迭代。但是,这不是我的问题。我真正想要的是澄清或可能的解释。我如何区分该数组是否确实是更复杂的数据类型?为何编译器选择使用2个不同的角度来引用此数据类型:使用2个全局变量word_4305fcword_4305FE?是否有特定原因?是否表示更复杂的数据类型?

评论

它是一个从0x4305FC开始的单词数组,该代码分别在索引[Variable_1 + 1]和[Variable_1]处访问其成员。

我同意以上评论。而且,它看起来像是迭代循环的一部分。

修改我以前的评论,它不是“更复杂的数据类型”,因为更改Variable_1的值会将访问的偏移量更改2个字节,并且从该偏移量中读取的字节数完全相同。在更复杂的数据类型中,数组的成员将更大。

#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