甄别伪代码中的二维数组
2026/8/28 6:03:12 网站建设 项目流程

以下是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]

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询