这是我第一次使用 Ghidra 和调试。我的项目涉及从 2007 年开始对 Dos 可执行文件进行逆向工程,以了解它如何生成代码。
我查找了通过 wine 启动程序时可以读取的字符串(在 linux 下调试)并找到了一个地方:
/* Reverses the string */
__strrev(local_8);
local_4 = 0;
DISPLAY_MESSAGE(s__Code_=_%s_0040704c);
是DISPLAY_MESSAGE
:
int __cdecl DISPLAY_MESSAGE(byte *param_1)
{
int iVar1;
int errorCode;
iVar1 = FUN_004019c0((undefined4 *)&DAT_004072e8);
errorCode = FUN_00401ac0((char **)&DAT_004072e8,param_1,(undefined4 *)&stack0x00000008);
FUN_00401a60(iVar1,(int *)&DAT_004072e8);
return errorCode;
}
我将函数命名为“DISPLAY_MESSAGE”,因为我在屏幕上看到了字符串;-)。我想命名它,printf
但它的签名与 of 不匹配,printf
因为它采用byte *
而不是char *, ...
作为输入参数并返回一个int
而不是void
实际的printf
.
字符串“Code = %s”(去除 CR 和新行)实际上位于地址“0040704c”,我很惊讶没有看到保存生成代码值的变量(这可以帮助我重命名变量) .
如果我将签名更改为其中之一,printf
则会产生:
DISPLAY_MESSAGE(s__Code_=_%s_0040704c,local_8)
看起来更好,因为local_8
可能是代码,但我不知道这样更改签名是否正确(从那时起我重命名的局部变量errorCode
从未使用过,而它在签名更改之前返回)。
void __cdecl DISPLAY_MESSAGE(char *param_1,...)
{
int iVar1;
int errorCode;
iVar1 = FUN_004019c0((undefined4 *)&DAT_004072e8);
FUN_00401ac0((char **)&DAT_004072e8,(byte *)param_1,(undefined4 *)&stack0x00000008);
FUN_00401a60(iVar1,(int *)&DAT_004072e8);
return;
}
所以我的问题是:
- 为什么 Ghidra 会附加
_0040704c
到字符串(它应该对我有帮助吗,我应该如何利用这条信息)? - 如果我的签名更改是正确的,是什么阻止 Ghidra 从其分析中找到正确的签名?
- 每当我看到函数签名
undefinedX
出现在 中时,我是否应该认为它存在问题DISPLAY_MESSAGE
?
非常感谢任何帮助!