2022-06-30星辉娱乐代理2

我们将 ram.bin 加载到 HxD 或任何其他十六进制编辑器中并查看。

HxD Hex Editor 中的 ram.bin 文件
HxD Hex Editor 中的 ram.bin 文件

唉,我们在那里找不到任何可以理解的东西。但是工作逻辑清楚了一点:DAT_0040423c 是 ram.bin(我们在堆中分配了 507 个字节)。让我们将 DAT_0040423c 重命名为 RAM,以便更轻松地浏览。接下来,转到 FUN_004022e0 函数。

函数 FUN_004022e0 的图形表示
函数 FUN_004022e0 的图形表示

下面是反编译的函数星辉娱乐代理2:

由于我们仍然知道我们面前有一个虚拟机,所以一切都或多或少地变得清晰起来。但是要真正理解伪星辉娱乐代理2,您总是必须查看反汇编程序,否则伪星辉娱乐代理2可能会令人困惑。

使用吉德拉。 伪代码和反汇编程序 Ghidra
伪星辉娱乐代理2和反汇编程序 Ghidra

我已经强调了将变量加一的指令。请记住,我们有一个函数 FUN_00402270,它使用三个参数进行初始化。我们看第一个参数的初始化。

显然,从 [RAM] 中取出一个字节,并用它初始化变量。和初始化每个函数参数时的星辉娱乐代理2相同,唯一的区别是函数参数将为 FUN_00402270 的寄存器发生了变化。结果,函数调用如下所示:

因此,三个参数被传输到 FUN_00402270 - [RAM] 中的三个字节,一个接一个。我们进入 FUN_00402270 函数,这是它的伪星辉娱乐代理2:

在这里,检查传递给函数的第一个字节,如果它匹配 0x1、0x2 或 0x3,则处理接下来的两个参数。第一个参数的解析在反汇编列表中特别清楚。显然,这是一个虚拟机命令解释器,它只包含三个虚拟机命令。

使用吉德拉。 Ghidra 中解释器的图形表示
Ghidra 中解释器的图形表示

在这个阶段,我会稍微停下来,以便总结中间结果。因此,我们有一个使用 507 字节内存的应用程序,我们拥有的转储文件是 ram.bin。在这个转储中,我们感兴趣的数据与我们不需要的其他数据混合在一起。vm1.exe 应用程序逐字节读取内存,查找指令 0x1、0x2 和 0x3,一旦找到其中一个,就会处理它们之后的下两个字节。

换句话说,我们有与它们的两个参数一起工作的助记命令(p-code、pi-code),而 507 字节的内存区域只不过是一个混有垃圾的 pi-code 磁带。其实你不应该害怕垃圾——命令处理会从找到想要的操作码字节开始,接下来的两个值\u200b\u200b会被取走,垃圾直接跳过。