甄别伪代码中的变量

以下是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;
    }
  }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值