以下是IDA生成的某个函数中的三段伪代码:
//第一段
_WORD v16[302]; // [esp+24h] [ebp-538h] BYREF
int v17; // [esp+280h] [ebp-2DCh]
int v18; // [esp+284h] [ebp-2D8h]
int v19; // [esp+288h] [ebp-2D4h]
int v20; // [esp+28Ch] [ebp-2D0h]
int v21; // [esp+290h] [ebp-2CCh]
int v22; // [esp+294h] [ebp-2C8h]
int v23; // [esp+298h] [ebp-2C4h]
int v24; // [esp+29Ch] [ebp-2C0h]
int v25; // [esp+2A0h] [ebp-2BCh]
int v26; // [esp+2A4h] [ebp-2B8h]
int v27; // [esp+2A8h] [ebp-2B4h]
int v28; // [esp+2ACh] [ebp-2B0h]
//第二段
v17 = 3;
v18 = 5;
v19 = 7;
v20 = 9;
v21 = 11;
v23 = 3;
v24 = 5;
v25 = 7;
v26 = 9;
v27 = 11;
LOBYTE(v2) = 0;
do
*(_DWORD *)&v16[2 * (unsigned __int8)v2++ + 272] = 0;
while ( (unsigned __int8)v2 <= 0xEu );
v22 = 0;
v28 = 0;
//第三段
num_tact = spec_cmds_tactical_fpln__get_num_tact(a1, *(_DWORD *)&v16[2 * a2 + 272]);
第一段代码定义了一些变量。
第二段代码对这些变量赋值。但是,则这个函数中没有找到显式地读取这些变量的代码。
第三段代码中出现以下表达式:
*(_DWORD *)&v16[2 * a2 + 272]
根据上下文的分析,a2的取值范围是0..26。
当a2>=15时,上式将是*(_DWORD *)&v16[302]..*(_DWORD *)&v16[324],这将超出v16的下标范围。
根据上下文的分析,v16的类型是一个结构数组,其大小是540字节,因此,从v16[272]到v16[324]是另一个数组。
这样,我们应增加一个新的变量定义:int var_318[27]。
第二段代码中的那些变量应归入var_318。
由此,原先的三段代码修改如下:
//第一段
mmi_application_types__parameters_t var_538[5];//_WORD v16[302]; [ebp-538h]
int var_318[27];
//v17 var_318[15]
//v18 var_318[16]
//v19 var_318[17]
//v20 var_318[18]
//v21 var_318[19]
//v22 var_318[20]
//v23 var_318[21]
//v24 var_318[22]
//v25 var_318[23]
//v26 var_318[24]
//v27 var_318[25]
//v28 var_318[26]
//第二段
/*v17*/ var_318[15] = 3;
/*v18*/ var_318[16] = 5;
/*v19*/ var_318[17] = 7;
/*v20*/ var_318[18] = 9;
/*v21*/ var_318[19] = 11;
/*v23*/ var_318[21] = 3;
/*v24*/ var_318[22] = 5;
/*v25*/ var_318[23] = 7;
/*v26*/ var_318[24] = 9;
/*v27*/ var_318[25] = 11;
v2 = 0;
do
var_318[v2] = 0;
while ( v2 <= 0xEu );
/*v22*/ var_318[20] = 0;
/*v28*/ var_318[26] = 0;
//第三段
num_tact = spec_cmds_tactical_fpln__get_num_tact_A225FE(
a1,
var_318[a2]);
28

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



