首页 > 解决方案 > Ghidra 可以重新编译并运行一个简短的函数吗?

问题描述

我从 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;
}

标签: creverse-engineeringghidra

解决方案


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

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

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

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


推荐阅读