Ghidra 可以重新编译 运行 一个短函数吗?

Can Ghidra re-compile and run a short function?

我从 Ghidra 反编译器中挑选了一个简短的“独立”函数。 Ghidra 本身能否再次编译该函数,以便我可以尝试 运行 它以获得几个不同的值,或者我是否需要自己编译它,例如海合会?

附加上下文函数:

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] == '[=11=]') {
        if ((uint)uVar3 < param_3) {
          param_1[uVar3] = '[=11=]';
          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] = '[=11=]';
  return 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] == '[=10=]') {
        if ((uint)uVar3 < param_3) {
          param_1[uVar3] = '[=10=]';
          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] = '[=10=]';
  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;
}

Can Ghidra itself compile the function again so I can try to run it for a couple different values

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

它很可能仍会涉及一些脚本编写,但如果您想了解 Emulator API 的基本概念和用法(未公开在GUI)

如果您 运行 在编写模拟器脚本时遇到问题,我建议您在专用 Reverse Engineering Stack Exchange

上询问有关模拟器 API 的具体问题