如何让 Ghidra 将函数的 complete/original 栈帧用于反编译代码
how to make Ghidra use a function's complete/original stackframe for decompiled code
我有一个案例,其中某些函数 allocates/uses 堆栈上的 404 字节临时结构用于其内部计算(该函数是独立的,并在该数据结构内随机播放数据)。从概念上讲,相应的结构似乎由一些 32 位计数器组成,后跟一个 int[15] 和一个 byte[80] 数组,然后是一个可能实际使用或可能不实际使用的区域。表中生成的一些数据似乎表示函数再次使用这些偏移量在临时结构中导航。
不幸的是,Ghidra 的反编译器在试图理解该函数时弄得一团糟:特别是它创建了单独的“local_..”int-vars(然后使用指向该 var 的指针)来表示应该正确的是指向函数原始数据结构的指针(例如指向数组之一)。
undefined4 local_17f;
...
dest= &local_17f;
for (i = 0xf; i != 0; i = i + -1) {
*dest = 0;
dest = dest + 1;
}
Ghidra 似乎不明白此时实际上正在使用基于数组的数据访问。 Ghirda 的反编译器随后还会生成一个本地 auStack316[316] 变量,不幸的是,该变量似乎只覆盖了原始 ASM 代码使用的相应本地数据结构的一部分(至少 Ghidra 实际上确实注意到使用了临时内存缓冲区)。结果,反编译代码基本上使用了两个重叠(和损坏)的影子数据结构,它们应该正确地只是同一块内存。
有没有办法让 Ghidra 的反编译器使用函数分配的完整 404 字节块作为 auStack404,从而绕过 Ghidra 有缺陷的解释逻辑并实际保留 ASM 代码的原始功能?
我想我找到了一些东西。在“列表”视图中,使用的 local-variable 布局显示为函数 header 下的注释。似乎通过右键单击该注释中相应的 local-var 行,“设置数据类型”可以应用于相应的局部变量。啊,还有我一直在寻找的“功能/”编辑堆栈框架“:-)
我有一个案例,其中某些函数 allocates/uses 堆栈上的 404 字节临时结构用于其内部计算(该函数是独立的,并在该数据结构内随机播放数据)。从概念上讲,相应的结构似乎由一些 32 位计数器组成,后跟一个 int[15] 和一个 byte[80] 数组,然后是一个可能实际使用或可能不实际使用的区域。表中生成的一些数据似乎表示函数再次使用这些偏移量在临时结构中导航。
不幸的是,Ghidra 的反编译器在试图理解该函数时弄得一团糟:特别是它创建了单独的“local_..”int-vars(然后使用指向该 var 的指针)来表示应该正确的是指向函数原始数据结构的指针(例如指向数组之一)。
undefined4 local_17f;
...
dest= &local_17f;
for (i = 0xf; i != 0; i = i + -1) {
*dest = 0;
dest = dest + 1;
}
Ghidra 似乎不明白此时实际上正在使用基于数组的数据访问。 Ghirda 的反编译器随后还会生成一个本地 auStack316[316] 变量,不幸的是,该变量似乎只覆盖了原始 ASM 代码使用的相应本地数据结构的一部分(至少 Ghidra 实际上确实注意到使用了临时内存缓冲区)。结果,反编译代码基本上使用了两个重叠(和损坏)的影子数据结构,它们应该正确地只是同一块内存。
有没有办法让 Ghidra 的反编译器使用函数分配的完整 404 字节块作为 auStack404,从而绕过 Ghidra 有缺陷的解释逻辑并实际保留 ASM 代码的原始功能?
我想我找到了一些东西。在“列表”视图中,使用的 local-variable 布局显示为函数 header 下的注释。似乎通过右键单击该注释中相应的 local-var 行,“设置数据类型”可以应用于相应的局部变量。啊,还有我一直在寻找的“功能/”编辑堆栈框架“:-)