如何自动将重新输入的变量传播到函数签名?

逆向工程 视窗 吉德拉
2021-06-24 22:37:59

在 Ghidra 反编译器中,在将类型应用于函数参数后,编译器使用该类型信息在函数内提供更好的反编译。但是,当在函数调用中使用该参数时,类型信息不会传播。我必须手动更改类型信息的函数签名才能继承。

有没有办法让 Ghidra 自动传播类型信息?我想Commit Params/Return PCommit Local Names会这样做,但没有运气。发现必须在使用它的每个函数调用中重新键入已知实体非常耗时。

例子:

查看 Windows 内核驱动程序,遵循此处的分析步骤

将 param_2 的类型从 更改longlongPIRP并将其重命名为pIRP然后选择 Analysis -> Auto-Analyze file.sys 并且只选择 Decompiler Parameter ID。

运行分析后,我只剩下这个:

int FUN_140001a20(longlong test,PIRP pIRP)
{
    ... TRIMMED...

        if (uVar2 == 0xc3500e68) {
          uVar7 = FUN_140002a14(test,(longlong)pIRP,(longlong)pbVar3);

并双击FUN_140002a14

void FUN_140002a14(longlong param_1,longlong param_2,longlong param_3)

无论出于何种原因,pIRP的类型正在转换,并且被调用函数的签名不会改变。我原以为会longlong变成PIRP.

编辑:

还在做这个。由于类型/名称不会传播,因此使用脚本为给定函数为我执行此操作。现在我正在获取给定函数调用的所有函数并尝试更改已知参数的名称/类型。

我最困惑的是在反编译器窗口中,当我重命名/重新键入一个变量时,它会通过该函数的其余部分传播。但是当我查询这些函数的参数时,变量没有改变。例如,在反编译器窗口中,pIRP会传播到所有使用它的函数,但是当我在脚本中获取函数签名时,它的名称仍然为param_2.

反编译窗口:

uVar5 = FUN_140002a14(param_1,(longlong)pIRP,(longlong)CurrentStackLocation)

脚本输出:

helloGhidra.java> FUN_140002a14[[longlong param_1@RCX:8], [longlong param_2@RDX:8], [longlong param_3@R8:8]]

即使我尝试为参数提交参数/返回 P 和提交本地名称,也会发生这种情况。

1个回答

我认为Decompiler Parameter ID分析应该解决这个问题,至少它应该跨函数边界传播类型信息。