我在 ghidra 中反编译了一个文件,我在反编译的文件中看到了很多 CONCAT+RandomNumber!
他们是什么意思?
让我先引用 Ghidra 帮助(F1):
CONCAT31(x,y)
- 连接运算符 -PIECE
数字“3”表示输入操作数“x”的大小(以字节为单位)。数字“1”表示输入操作数“y”的大小(以字节为单位)。参数“x”和“y”保存被连接的值。CONCAT31(0xaabbcc,0xdd) = 0xaabbccdd
将“x”中的字节与“y”中的字节连接起来。在结果中,“x”成为最高有效字节,“y”成为最低有效字节。因此,所有这些带有前缀的“函数”都
CONCAT
属于 Ghidra 使用的一组内部反编译器函数,用于表达通常不能简单地以类 C 高级表示形式表达的事物。
CONCAT
特别是可以建模为第一个参数的左移第二个参数的大小,然后对两个参数进行逻辑与运算。但是对于人类来说,更容易将其视为“将两件事放在一起”。
CONCAT
仅当传递的参数不是预期的大小并且可能主要是为了使事情更明确时,后面的数字才有意义。具体来说,你不应该读CONCAT15
作“concat 15”,而应该读作“concat one 5”:第一个参数的大小预计为一个字节,而第二个参数的大小为 5,总计 6 个字节:CONCAT15(0x12, 0x3456789012)
是一样0x123456789012
。
PS:CONCAT412
几乎可以肯定意味着连接4
和12
字节,而不是41
和2
。