这个反汇编的数组的开始和结束是啥?

Posted

技术标签:

【中文标题】这个反汇编的数组的开始和结束是啥?【英文标题】:What is the beginning and the end of this disassembled array?这个反汇编的数组的开始和结束是什么? 【发布时间】:2021-06-06 08:23:56 【问题描述】:

在一个反汇编的 dll 中(通过 IDA),我找到了一个数组,它被注释为 int 的数组(但它可能是 byte):

.rdata:000000018003CC00 ; int boxA[264]
.rdata:000000018003CC00 boxA            dd 0                    ; DATA XREF: BlockPrepXOR+5FC↑r
.rdata:000000018003CC04                 db  0Eh
.rdata:000000018003CC05                 db  0Bh
.rdata:000000018003CC06                 db  0Dh
.rdata:000000018003CC07                 db    9
.rdata:000000018003CC08                 db  1Ch
.rdata:000000018003CC09                 db  16h
.rdata:000000018003CC0A                 db  1Ah
.rdata:000000018003CC0B                 db  12h
.rdata:000000018003CC0C                 db  12h
.rdata:000000018003CC0D                 db  1Dh
.rdata:000000018003CC0E                 db  17h
.rdata:000000018003CC0F                 db  1Bh

我可以将数据解释为

    000000h, E0B0D09h, 1C161A12h, ..0, 90D0B0Eh, 121A161Ch, ...00h,00h,00h,00h, 0Eh, 0Bh, .. ?

根据评论(来自 IDA),您能否确认该数组以 CC00h + 253*4 = D01Fh 结尾?我还有另一个数组,从 D020h 开始:

.rdata:000000018003D01D                 db 0F9h ; ù
.rdata:000000018003D01E                 db 0A2h ; ¢
.rdata:000000018003D01F                 db  3Fh ; ?
.rdata:000000018003D020 array4_1248     db    1                 ; DATA XREF: BlockPrepXOR+39A↑o
.rdata:000000018003D021                 db    2
.rdata:000000018003D022                 db    4
.rdata:000000018003D023                 db    8

【问题讨论】:

【参考方案1】:

这只是this paper 中描述的 AES 解密的 T8 矩阵。 您可以通过在 Google 上查找 DWORD 值轻松识别它(例如 this is one of the results)。

所以这只是 AES 解密函数的数据。

另请注意,将字节序列解释为多字节数据序列(WORD、DWORD、QWORD 等)取决于架构。 对于 x86,只有 little-endian 解释是正确的(这是您的情况 2),但数据可能会进行任意操作(例如,它可以是 bswapped),因此,在 Google 上查找时,请始终同时使用 little 和 big-数据的字节序版本。

另外值得注意的是,IDA 可以将字节解释为 DWORD(输入两次d 或使用上下文菜单),根据反汇编二进制的体系结构显示正确的值。

【讨论】:

感谢 T8 提示。但是哪种解释是正确的? 1/2/3 ?此外,不清楚 1/2 中的哪一个是小端(我正在研究 x86)。 @Soleil:你的第二个问题是 little-endian。 @Soleil 哎呀,对不起,我以为你想知道那个向量是什么。正如 ecm 礼貌地指出的那样,这是您的情况 2。 @MargaretBloom 谢谢。我可以将数据更改为数组,但它是字节数组;我找不到让它成为一个 uint 数组(4 个字节)。当我使用d 更改类型时,它仅适用于作为数据的第一个元素,而不适用于数组。 @Soleil 定义第一个 DWORD,然后使用数组命令 (*)。有很多 IDA 教程(包括官方文档)可以让它做你想做的事。如果你每次遇到(小)问题就放弃,逆向工程会把你活活吃掉:)

以上是关于这个反汇编的数组的开始和结束是啥?的主要内容,如果未能解决你的问题,请参考以下文章

基于arm的C++反汇编 数组和指针的寻址

基本反汇编算法

什么是反汇编?

如何反汇编 Pro*C/C++ 程序? [关闭]

反汇编工具objdump的使用以及反汇编文件的解读

keil反汇编窗口怎么搜索