1

我从 Ghidra 反编译器中挑选了一个简短且“自包含”的函数。Ghidra 本身可以再次编译该函数,以便我可以尝试为几个不同的值运行它,还是我需要自己使用 gcc 编译它?

附加上下文功能:

undefined8 FUN_140041010(char *param_1,longlong param_2,uint param_3)

{
  char *pcVar1;
  uint uVar2;
  ulonglong uVar3;
  
  uVar3 = 0;
  if (param_3 != 0) {
    pcVar1 = param_1;
    do {
      if (pcVar1[param_2 - (longlong)param_1] == '\0') {
        if ((uint)uVar3 < param_3) {
          param_1[uVar3] = '\0';
          return 0;
        }
        break;
      }
      *pcVar1 = pcVar1[param_2 - (longlong)param_1];
      uVar2 = (uint)uVar3 + 1;
      uVar3 = (ulonglong)uVar2;
      pcVar1 = pcVar1 + 1;
    } while (uVar2 < param_3);
  }
  param_1[param_3 - 1] = '\0';
  return 0;
}
4

2 回答 2

2

Ghidra 本身可以再次编译该函数,以便我可以尝试为几个不同的值运行它

Ghidra的 P-Code仿真器就是为这种场景设计的。如果它只是一个简短的函数并且不像您的示例那样使用其他库、系统调用等,那么模拟器可以轻松处理此问题,而无需您进一步努力模拟库函数。Ghidra 知道每条指令的语义并将它们转换为标准化的 P-Code 格式,例如反编译,但这也可以与“P-Code 虚拟机”结合使用。

它很可能仍会涉及一些脚本,尽管存在诸如TheRomanXpl0it/ghidra-emu-fun 之类的插件可以使这更容易。如果您想了解 Emulator API 的基本思想和用法,还有更通用的教程(它不会以任何方式暴露在 GUI 中)

如果您在编写模拟器脚本时遇到问题,我建议您在专门的逆向工程堆栈交换中询问有关模拟器 API 的具体问题

于 2021-10-23T09:19:41.460 回答
0

你可以,但你必须将一些类型更改为标准 C,或者像这样添加 typedef:

#include <stdint.h>

typedef uint8_t undefined8;
typedef long long int longlong;
typedef unsigned long long int ulonglong;
typedef unsigned int uint;

undefined8 FUN_140041010(char *param_1,longlong param_2,uint param_3)
{
  char *pcVar1;
  uint uVar2;
  ulonglong uVar3;
  
  uVar3 = 0;
  if (param_3 != 0) {
    pcVar1 = param_1;
    do {
      if (pcVar1[param_2 - (longlong)param_1] == '\0') {
        if ((uint)uVar3 < param_3) {
          param_1[uVar3] = '\0';
          return 0;
        }
        break;
      }
      *pcVar1 = pcVar1[param_2 - (longlong)param_1];
      uVar2 = (uint)uVar3 + 1;
      uVar3 = (ulonglong)uVar2;
      pcVar1 = pcVar1 + 1;
    } while (uVar2 < param_3);
  }
  param_1[param_3 - 1] = '\0';
  return 0;
}

然后你可以像调用任何函数一样调用它:

int main(int argc, char const* argv[])
{
  char* mystr = "hello";
  printf("%hhu\n", FUN_140041010(mystr, /* not sure about this arg */ 0, strlen(mystr));
  return 0;
}
于 2021-10-22T03:08:52.593 回答