0

这是我第一次使用 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;
}

所以我的问题是:

  1. 为什么 Ghidra 会附加_0040704c到字符串(它应该对我有帮助吗,我应该如何利用这条信息)?
  2. 如果我的签名更改是正确的,是什么阻止 Ghidra 从其分析中找到正确的签名?
  3. 每当我看到函数签名undefinedX出现在 中时,我是否应该认为它存在问题DISPLAY_MESSAGE

非常感谢任何帮助!

4

0 回答 0