Ghidra中_2_1_与CONCAT11的含义及代码相关疑问
Ghidra中_2_1_与CONCAT11的含义及代码相关疑问
嘿,我来帮你拆解这些Ghidra反编译代码里的陌生符号,搞清楚它们到底在干嘛~
首先说Ghidra自动生成的这种_X_Y_格式的字段名,这是它处理字节数组或结构体时的命名规则:
user_input._2_1_:这个命名的格式是_偏移量_字节长度_,意思是从user_input这个变量的起始地址往后偏移2个字节的位置,取出1个字节的数据。(undefined)user_input:这里的undefined是Ghidra的内置类型,代表1字节的无类型数据,强制转换后就是取user_input起始位置(偏移0)的第一个字节。
然后是CONCAT11,你猜的没错,它确实是用来拼接两个1字节操作数的伪函数:
CONCAT11(a, b)的作用是把两个8位的字节拼接成一个16位的数值,规则是第一个参数作为高字节,第二个作为低字节,等价于C语言里的(a << 8) | b。
结合你给出的代码场景再梳理一遍:
代码里用read(0,&user_input,5)从标准输入读了5字节数据到user_input缓冲区,所以user_input是一个至少5字节的变量。后面的操作分别是:
uVar1 = user_input;:如果uVar1是32位整数,这里会取user_input的前4字节(偏移0到3)组成一个32位值;具体取值长度取决于uVar1的类型。uVar2 = user_input._1_1_;:取出user_input偏移1位置的1字节数据。local_16._0_2_ = CONCAT11(user_input._2_1_,(undefined)user_input);:把user_input偏移2的字节作为高8位,偏移0的字节作为低8位,拼接成一个16位数值,赋值给local_16变量起始位置(偏移0)的2字节字段。
备注:内容来源于stack exchange,提问作者SpaghettiMan
相关产品推荐
相关产品推荐

