C 代码 Ghidra 反编译导致我不熟悉的语法
C code Ghidra decompile results in syntax I am unfamiliar with
我正在使用 Ghidra 逆向一个简单的二进制文件。反编译结果是这行代码
if ((param_1 != 4) && (func0(param_1 + 1), param_1 + 1 == 0x32))
param_1+1==0x32 部分让我感到困惑,因为我只是不熟悉语法并且不确定它在布尔表达式中做了什么。
那是逗号运算符。在这种情况下,它只是不必要的混淆,因为替代反编译可以避免它,例如,这些是等价的:
if ((param_1 != 4) && (func0(param_1 + 1), param_1 + 1 == 0x32)) {
doStuff();
}
if (param_1 != 4) {
func0(param_1 + 1);
if(param_1 + 1 == 0x32) {
doStuff();
}
}
好的,这将是相当崩溃的
表达式为:
(func0(param_1 + 1), param_1 + 1 == 0x32)
因此,用 param_1 + 1
调用 func0,丢弃结果,并将 param_1 + 1
与 0x32
进行比较。
这段代码不自然;我通常希望找到 param_1 == 0x31
.
我猜这不是 C 二进制文件,反编译器无法表达按值传递 return,这是 ancient basic 使用的。文档 说 它是通过引用传递的,但事实并非如此。我通过将全局变量传递给改变全局变量的函数来找到困难的方法。
我正在使用 Ghidra 逆向一个简单的二进制文件。反编译结果是这行代码
if ((param_1 != 4) && (func0(param_1 + 1), param_1 + 1 == 0x32))
param_1+1==0x32 部分让我感到困惑,因为我只是不熟悉语法并且不确定它在布尔表达式中做了什么。
那是逗号运算符。在这种情况下,它只是不必要的混淆,因为替代反编译可以避免它,例如,这些是等价的:
if ((param_1 != 4) && (func0(param_1 + 1), param_1 + 1 == 0x32)) {
doStuff();
}
if (param_1 != 4) {
func0(param_1 + 1);
if(param_1 + 1 == 0x32) {
doStuff();
}
}
好的,这将是相当崩溃的
表达式为:
(func0(param_1 + 1), param_1 + 1 == 0x32)
因此,用 param_1 + 1
调用 func0,丢弃结果,并将 param_1 + 1
与 0x32
进行比较。
这段代码不自然;我通常希望找到 param_1 == 0x31
.
我猜这不是 C 二进制文件,反编译器无法表达按值传递 return,这是 ancient basic 使用的。文档 说 它是通过引用传递的,但事实并非如此。我通过将全局变量传递给改变全局变量的函数来找到困难的方法。