c - 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;
}
解决方案
Ghidra 本身可以再次编译该函数,以便我可以尝试为几个不同的值运行它
Ghidra的 P-Code仿真器就是为这种场景设计的。如果它只是一个简短的函数并且不像您的示例那样使用其他库、系统调用等,那么模拟器可以轻松处理此问题,而无需您进一步努力模拟库函数。Ghidra 知道每条指令的语义并将它们转换为标准化的 P-Code 格式,例如反编译,但这也可以与“P-Code 虚拟机”结合使用。
它很可能仍会涉及一些脚本,尽管存在诸如TheRomanXpl0it/ghidra-emu-fun 之类的插件可以使这更容易。如果您想了解 Emulator API 的基本思想和用法,还有更通用的教程(它不会以任何方式暴露在 GUI 中)
如果您在编写模拟器脚本时遇到问题,我建议您在专门的逆向工程堆栈交换中询问有关模拟器 API 的具体问题
推荐阅读
- javascript - WebGL2 片段着色器中的按位 OR Texels
- mysql - 第 1 行 phpmyadmin 上的列数无效
- python - 如何在两个字符串之间完全相同的位置打印匹配的字符?Python
- mysql - 如何调节时间列?
- hbase - 24 小时后运行火花流时出现 HBase kerberos 错误
- sql-server - 显式设置 ID 属性
- javascript - 如何在 java 脚本中识别/去除圆形对象?
- java - 我正在尝试使用扫描仪计算文档中每个字母的百分比,但我无法弄清楚如何正确计算和显示它
- drupal - 使用作曲家安装 Drupal 8 Commerce
- javascript - 您可以创建一个函数来检查多个输入值并相应地更改它们的样式吗?