IDA逆向代码 --- F5 反汇编识别错误的情况

场景: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识别算法错误的地方,我只能通过动态调试,观察内存值的变化来猜测代码行为,如果读者有更好的方法可以相互讨论,谢谢;

 

你可能感兴趣的:(----IDA分析)