场景:F5 之后的伪代码,变量直接被使用,没有被赋值,但是根据上下文,一定具有含义;
例如:
-
v3 = &v104 + 0x14 * (signed __int16)v29 - 0x442;
-
// 这里的104 是什么??前面只有定义,没有被赋值,而且不属于数组中的一部分
-
-
查看对应Arm指令:
-
.text:9FAADCD8 MOVS R6, #0x50 ; 这里的0x50 是什么??
-
.text:9FAADCDA STR R0, [SP,#0x1218+var_1200]
-
.text:9FAADCDC LSLS R3, R4, #0x10
-
.text:9FAADCDE ASRS R3, R3, #0x10
-
.text:9FAADCE0 MULS R6, R3
-
.text:9FAADCE2 MOVS R0, #0x1200 ;这里 是&V104 查看 int v104; // [sp+1200h] [bp-18h]@9
-
.text:9FAADCE6 LDR R1, =0xFFFFEEF8
-
.text:9FAADCE8 ADD R0, SP
-
.text:9FAADCEA ADDS R6, R0, R6
-
.text:9FAADCEC MOVS R4, #1
-
.text:9FAADCEE ADDS R6, R6, R1
查看对应的汇编,其实应该这么写:
v3 = (signed int *)v54 + 0x14 * (signed __int16)v29;// OK 通过调试发现其实要这样写
另外一个情况也是一样的;
-
v104_seriesLength = (*v103_InputStringExID)(0xFFFD002E, 0xFFFD000B, 0, v202);//
-
// 提示信息 并 输入电池序列号
-
// 返回输入数据的长度;
-
n_index_ret = v104_seriesLength;
-
if ( v104_seriesLength == 0xFFFFFFFF )
-
goto LABEL_86;
-
for ( index = 0;
-
index < (signed int)n_index_ret
-
&& ((v104_seriesLength <= 0xA) + (v104_seriesLength >> 0x1F)) & 0xFF;
-
++index )
-
{
-
v106 = *((_BYTE *)&v160 + index + 0x644);// 这里v160 是什么?输入的是123654789
-
// 这里其实v160每循环依次就是输入的一位数字:0x31 0x32 0x33 0x36 0x35 0x34
-
if ( (unsigned int)(v106 - 0x61) <= 0x19 )// 这里是大小写的处理 ;
-
*((_BYTE *)&v160 + index + 0x644) = v106 - 0x20;// 这里是小写变大写;
-
} //
-
// 这里IDA识别出错。实际上就是数字不变,字母小写变大写;
所以:v106 = *((_BYTE *)&v160 + index + 0x644); 需要改为:
v106 = v202_serialnumber[index];
到目前为止,这种IDA识别算法错误的地方,我只能通过动态调试,观察内存值的变化来猜测代码行为,如果读者有更好的方法可以相互讨论,谢谢;