重新排列 ida 数据库中的指令?

逆向工程 艾达 部件
2021-06-27 22:42:19

我正在拆解一个旧的(1996 年)游戏,它是用 Watcom 386 编译器编译的。这个编译器似乎积极地重新排序指令以更好地利用处理器管道,如以下汇编块所示:

在此处输入图片说明

标有红点的指令设置下一次调用的参数;带有蓝点的指令完成了上次调用返回的对象的初始化。重新排列它们使程序集更易于阅读:

...
call    ClassAlloc13680_0FAh
mov     edx, [eax]
mov     [edx+Class180F4.WidgetInputHandler], offset gblHandleTransportDestinationAndCheckForPassengersSpace
mov     edx, [eax]
mov     [edx+Class13680.Paint???], offset ClassVehicleManager__PaintForSomeWidget
mov     dword_A4D88, eax
mov     eax, [eax]
mov     [eax+Class10B8C.MouseInputHandler], offset ClassVehicleManager__MouseInputHandler

push    0
push    2
push    0
push    4Eh
push    5Bh
mov     ebx, 5Ch
mov     ecx, 21h
mov     edx, ebp
mov     eax, ebp
call    ClassAlloc13680_0FAh
push    0
push    2
...

(请注意,我将mov reg, xxh指令进一步向下移动,因为编译器的调用约定是 ax-dx-cx-bx-stack,所以我也可以在这里看到参数的顺序)

有没有办法在 IDA 中实现这一点?我不是在要求一种算法来自动确定哪些指令应该是“红色”,哪些应该是“蓝色”,而且我不想修补原始二进制文件,我只想手动重新排列指令在 ida 数据库中。

或者有没有其他方法可以提高 IDA 中此类代码的可读性?

1个回答

几年前,我编写了swapinsn.idc来为 ARM 代码执行此操作。它将向上或向下旋转一系列 insn,并修复该范围内的任何相对跳跃。

请注意,与脚本中的注释相反,我实际上从未添加过 x86 支持。

为方便起见,我添加了热键功能,HK_ExchangeDownHK_ExchangeUphotkeys.idc 中定义所以在可以选择一系列指令时,输入 shift-x 将最后选择的 insn 向上移动,其余的向下移动。