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

1万+

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



