以下是IDA生成的两段伪代码:
//第一段
_DWORD v12[24]; // [esp+150h] [ebp-2A8h] BYREF
_DWORD Src[24]; // [esp+1B0h] [ebp-248h] BYREF
//第二段
Src[0] = dword_28CE8A0[26 * v3];
Src[1] = dword_28CE8A4[26 * v3];
Src[2] = dword_28CE8A8[26 * v3];
Src[3] = dword_28CE8AC[26 * v3];
for ( i = 5; i <= 24; ++i )
v12[i + 23] = 4;
第一段定义了两个数组:v12与Src。
第二段中的前4行是对Src的赋值操作。
第二段中的第6行是对v12的赋值操作。但是,所用的下标是i + 23。这样的下标超出了v12定义的下标范围。
第二段中的第5行的for循环从i为5开始,也即从v12[28]开始。
由于Src在v12后面,所以v12[28]实际是Src[4]。
因此,这个for循环应该是对Src的操作。其代码修改如下:
for ( i = 4; i < 24; ++i )
Src[i] = 4;
查看了汇编清单中与IDA的伪代码对应的代码:
.text:0068827E loc_68827E:
.text:0068827E mov [ebp+eax*4+var_24C], 4
.text:00688289 inc eax
.text:0068828A cmp eax, 18h
.text:0068828D jle short loc_68827E
上述汇编中的var_24C对应v12[23]。可能是这个原因,IDA认为这是对v12的循环操作。
28

被折叠的 条评论
为什么被折叠?



