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

时间:2024-10-25 15:11:46

场景:F5 之后的伪代码,变量直接被使用,没有被赋值,但是根据上下文,一定具有含义;
例如:

  1. v3 = &v104 + 0x14 * (signed __int16)v29 - 0x442;
  2. // 这里的104 是什么??前面只有定义,没有被赋值,而且不属于数组中的一部分
  3. 查看对应Arm指令:
  4. .text:9FAADCD8 MOVS R6, #0x50 ; 这里的0x50 是什么??
  5. .text:9FAADCDA STR R0, [SP,#0x1218+var_1200]
  6. .text:9FAADCDC LSLS R3, R4, #0x10
  7. .text:9FAADCDE ASRS R3, R3, #0x10
  8. .text:9FAADCE0 MULS R6, R3
  9. .text:9FAADCE2 MOVS R0, #0x1200 ;这里 是&V104 查看 int v104; // [sp+1200h] [bp-18h]@9
  10. .text:9FAADCE6 LDR R1, =0xFFFFEEF8
  11. .text:9FAADCE8 ADD R0, SP
  12. .text:9FAADCEA ADDS R6, R0, R6
  13. .text:9FAADCEC MOVS R4, #1
  14. .text:9FAADCEE ADDS R6, R6, R1

查看对应的汇编,其实应该这么写:
    v3 = (signed int *)v54 + 0x14 * (signed __int16)v29;// OK 通过调试发现其实要这样写

另外一个情况也是一样的;

  1. v104_seriesLength = (*v103_InputStringExID)(0xFFFD002E, 0xFFFD000B, 0, v202);//
  2. // 提示信息 并 输入电池序列号
  3. // 返回输入数据的长度;
  4. n_index_ret = v104_seriesLength;
  5. if ( v104_seriesLength == 0xFFFFFFFF )
  6. goto LABEL_86;
  7. for ( index = 0;
  8. index < (signed int)n_index_ret
  9. && ((v104_seriesLength <= 0xA) + (v104_seriesLength >> 0x1F)) & 0xFF;
  10. ++index )
  11. {
  12. v106 = *((_BYTE *)&v160 + index + 0x644);// 这里v160 是什么?输入的是123654789
  13. // 这里其实v160每循环依次就是输入的一位数字:0x31 0x32 0x33 0x36 0x35 0x34
  14. if ( (unsigned int)(v106 - 0x61) <= 0x19 )// 这里是大小写的处理 ;
  15. *((_BYTE *)&v160 + index + 0x644) = v106 - 0x20;// 这里是小写变大写;
  16. } //
  17. // 这里IDA识别出错。实际上就是数字不变,字母小写变大写;

 所以:v106 = *((_BYTE *)&v160 + index + 0x644); 需要改为:
v106 = v202_serialnumber[index];

到目前为止,这种IDA识别算法错误的地方,我只能通过动态调试,观察内存值的变化来猜测代码行为,如果读者有更好的方法可以相互讨论,谢谢;