IDA 忽略伪代码中的寄存器更改

逆向工程 艾达 职能
2021-06-23 00:31:51

Watcom 编译器使用了一个相当不寻常的调用约定,而 IDA 似乎放弃了一些与其内置伪代码无关的更改。根据我的经验,这通常意味着我做错了什么,而不是 IDA :)

例如,在以下函数片段中,伪代码中忽略了ebx的更改edx

; void __usercall RunScrIncDec(GeneralObject *object@<eax>, int *bufPtr@<edx>, int value@<ebx>)
RunScrIncDec    proc near
                cmp     byte ptr [edx], 0Ah
                jnz     short loc_164288

                inc     ebx
                inc     edx
                retn
...

这里注意 bufPtr 和 value 都是递增的,而且 value 确实是按值传递,而不是按引用传递。

如果我通过用 an 替换void返回类型int并附加值 location 来更改函数的返回类型使其为 int @<ebx>,那么 IDAebx在伪代码中包含一个,但仍然忽略edx.

有什么办法可以告诉IDA注意这些变化吗?edxebx不能仅仅通过功能宠坏了,他们是显着的变化应该逆转bufPtr ++和价值++而不是完全无法显示任何伪代码?或者这只是 IDA 无法处理的事情?

1个回答

正如您正确理解的那样,IDA 只考虑它所理解的与其余代码相关的更改。只有在它们确实是调用函数的返回值的情况下,它才会考虑这些值。

正如您自己发现的那样,您需要做的是让 IDA 理解这些是返回值。

这里有一个技巧可以让你做到这一点,通过设置该函数返回两个 DWORD结构(或结构中定义的任何其他类型)。

首先,通过转到结构视图 ( shift+ F9)创建一个 IDA 结构,然后创建一个新结构 ( INS)。

在该结构中,定义两个 DWORD 整数(通过D在结构底部使用或使用CTRL+E首先增加结构的大小)。

然后回到函数,修改函数的原型。void您的结构名称替换返回类型,并在函数名称后附加值位置说明符。要指定两个寄存器,在我们的例子中EBX和 EDX`,在它们之间使用冒号。

最终结果应如下所示,假设您将 struct 命名为s_ret

s_ret __usercall RunScrIncDec@<eax:ecx>(GeneralObject *object@<eax>, int *bufPtr@<edx>, int value@<ebx>)
^^^^^                        ^^^^^^^^^^