使用枚举在 ghidra 中切换大小写值

逆向工程 吉德拉
2021-06-10 22:47:12

ghidra 有没有办法将反编译的 switch 语句 case 值更改为它们的名称?

我正在查看一个 WndProc 函数,其原型为LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam). 函数内部有许多基于msgUINT的 switch 语句,ghidra 调用param_2. uint 值在winuser.h. 我想更改param_2在反编译中比较的所有点,因此它使用 winuser.h 名称而不是 uint 值,例如,更改if (param_2 != 0x100)if (param_2 != WM_KEYDOWN),用于param_2给定函数中的所有检查。

2个回答

在这里找到答案:IDA 技巧 - 字符串 + 参数

在反汇编中,右键单击常量,单击Set Equate...并选择合适的类型。您可能必须首先加载(或创建并加载)适当的 gdt 文件。

除了手动更改每种情况外,根据切换的逻辑取得一定程度的成功,最好的方法是enum使用您希望看到的所有值创建一个类型(它的大小必须正确),然后强制param_2转换为该类型enum类型。

我不做很多 Windows RE,所以我不确定 Ghidra 目前如何提供这些值,它可能已经作为枚举存在于他们的 Windows 库中,尽管它可能是你可能需要的一堆单独的定义手动创建成一个enum像你想要的那样使用。