以下是IDA9.0生成的一段伪代码:
if ( aFix0Fix1Fix2Fi[50] <= unk_CDF1BF )
{
for ( nn = aFix0Fix1Fix2Fi[50]; ; ++nn )
{
result = mmi_server_types__t_data_fm_commandIP(
(int)&page_s_direct_to_fpln__g_data_fm_com[660 * (nn - (unsigned __int8)aFix0Fix1Fix2Fi[50])],
55);
if ( unk_CDF1BF == nn )
break;
}
}
在伪代码文件的头部中这两个变量定义如下:
char aFix0Fix1Fix2Fi[51] = "FIX0 FIX1 FIX2 FIX3 FIX4 "; // weak
_UNKNOWN unk_CDF1BF; // weak
在汇编清单中这两个变量的定义是:
.rdata:00CDF18C aFix0Fix1Fix2Fi db 'FIX0 FIX1 FIX2 FIX3 '
.rdata:00CDF18C db ' FIX4 ',0
.rdata:00CDF1BF unk_CDF1BF db 1
由此可见,aFix0Fix1Fix2Fi[50]的地址是00CDF1BE,其值是0。
经分析,这个值与unk_CDF1BF的值1是一对,它们构成了结构体数组page_s_direct_to_fpln__g_data_fm_com的下标范围。
在Ada语言中,数组需要指定其下标范围,所以编译器生成了地址是00CDF1BE和00CDF1BF的两个数据。
下标范围中的0恰好在字符串变量aFix0Fix1Fix2Fi的末尾,也许这样就被IDA看成是字符串的结尾了。
因此需要另外定义一个数组:
unsigned char G_CDF1BE[2] = {0. 1};
上述伪代码可修改为:
if ( G_CDF1BE[0]<= G_CDF1BE[1] )
{
for ( nn = G_CDF1BE[0]; ; ++nn )
{
result = mmi_server_types__t_data_fm_commandIP(
(int)&page_s_direct_to_fpln__g_data_fm_com[660 * (nn - G_CDF1BE[0])],
55);
if ( G_CDF1BE[1] == nn )
break;
}
}

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



