甄别伪代码中的二维数组

以下是IDA生成的关于变量dword_2810F8C伪代码:

int dword_2810F8C[]; // weak
int page_s_tactical__g_num_rte[]; // weak

          if ( v22 > 5 ) //这是Ada编译器插入的判断下标是否合法的语句
            __gnat_rcheck_05("page_s_tactical.adb", 1252);
          if ( v29 > 1u ) //这是Ada编译器插入的判断下标是否合法的语句
            __gnat_rcheck_06("page_s_tactical.adb", 1252);
          dword_2810F8C[6 * v29 + 1 + v22] = *(_DWORD *)(a2 + 12 * (v26 - 1) + 8);

根据以上两行if语句,可知v22与v29是数组下标。

v22的合法数值范围是0..5。

v29的合法数值范围是0..1。

从汇编清单中可知page_s_tactical__g_num_rte的起始地址是0x2810F90:

bss:02810F8C ; int dword_2810F8C[]
.bss:02810F8C dword_2810F8C dd ?
.bss:02810F90 ; int page_s_tactical__g_num_rte[]
.bss:02810F90 _page_s_tactical__g_num_rte dd ?
.bss:02810F94 align 40h
.bss:02810FC0 ; char page_s_tactical__g_exec_pressed[]

page_s_tactical__g_num_rte与dword_2810F8C相差4个字节。

page_s_tactical__g_num_rte的长度是48个字节。

由此可见,

  dword_2810F8C[6 * v29 + 1 + v22]

可改写为:

  page_s_tactical__g_num_rte[v29][v22]

因此,page_s_tactical__g_num_rte可以定义为:

Int page_s_tactical__g_num_rte[2][6];

其他关于dword_2810F8C的伪代码都可以进行相应的修改。例如:

   dword_2810F8C[6 * a1 + page_s_tactical__num_page[a1]]

可改为:

  page_s_tactical__g_num_rte[a1][page_s_tactical__num_page[a1] - 1]

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值