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 的具体问题
我从 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 的具体问题