它是什么类型的数据结构?

逆向工程 拆卸 部件 艾达 结构
2021-06-12 07:10:40

我有以下数据:

.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]
...

它看起来像另一个数组中的数组。我对么?如果不是,你认为数据结构是什么?如果它是单个数组,为什么要通过 2 个不同的“头”word_4305fcword_4305FE

谢谢你。

添加:

以下是对以下评论的回应。谢谢你们,非常感谢你们的意见!我真的很感激它和一般的 RE 社区。我觉得我的问题需要澄清一下。我确实意识到这是一个数组。我也清楚地看到这Variable_1是数组的索引。此外,我可以看到迭代。然而,这不是我的问题。我真正想要的是澄清或可能的解释。我如何才能区分这个数组是否确实是更复杂的数据类型?为什么编译器选择从 2 个不同的角度引用这种数据类型:使用 2 个全局变量word_4305fcword_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)添加到数组的地址来替换它。这允许更优化的计算,在运行时不会发生任何增量。