以下是IDA生成的一段伪代码:
for ( i = 1; i <= 3; ++i )
*(_BYTE *)(v5 - 8 + 4) = util_rnav__valide_caract(&a5[104 * i - 104]);
而且还有以下警告:
// 9C8A2F: variable 'v5' is possibly undefined
在以上循环中,v5没有变化,这很可疑,于是查看对应的汇编代码:
汇编 | 备注 |
.text:009C8A26 loc_9C8A26: | 伪代码中的i对应esi,a5对应edi, v5对应ebx |
.text:009C8A26 lea eax, [esi+esi*2] | 3*i赋予eax |
.text:009C8A29 lea eax, [esi+eax*4] | 13*i赋予eax |
.text:009C8A2C lea eax, [edi+eax*8] | a5+104* i赋予eax |
.text:009C8A2F lea ebx, [eax-8] | a5+104* i-8赋予ebx 为何IDA忽视了a5+104* i? |
.text:009C8A32 sub esp, 0Ch | |
.text:009C8A35 sub eax, 68h | 104 * i - 104赋予eax |
.text:009C8A38 push eax | |
.text:009C8A39 call _util_rnav__valide_caract | 返回值是al |
.text:009C8A3E mov [ebx+4], al | al赋予[a5+104* i-8+4] |
.text:009C8A41 add esp, 10h | |
.text:009C8A44 inc esi | |
.text:009C8A45 cmp esi, 3 | |
.text:009C8A48 jle short loc_9C8A26 |
根据以上分析,伪代码中的赋值语句应改为:
*(_BYTE *)(&a5[104 * i - 8 + 4]) = util_rnav__valide_caract(&a5[104 * i - 104]);
后来查看了GHIDRA的反编译结果,其中与上述相关的伪代码是正确的:
iVar17 = 1; do { iVar16 = param_5 + iVar17 * 0x68; uVar15 = _util_rnav__valide_caract(iVar16 + -0x68); *(undefined *)(iVar16 + -4) = uVar15; iVar17 = iVar17 + 1; } while (iVar17 < 4);看来用GHIDRA核查IDA生成的伪代码是可行的。