以下是IDA生成的一个函数:
int __cdecl page_s_pilot_route__cmd_for_list_pilot_route(unsigned __int8 a1, char a2)
{
int result; // eax
unsigned __int8 *v3; // esi
_BYTE v4[2480]; // [esp+80h] [ebp-9D8h] BYREF
char v5[4]; // [esp+A30h] [ebp-28h] BYREF
int v6; // [esp+A34h] [ebp-24h]
_BYTE v7[15]; // [esp+A38h] [ebp-20h] BYREF
int v8; // [esp+A47h] [ebp-11h]
char v9; // [esp+A4Bh] [ebp-Dh]
char v10; // [esp+A4Ch] [ebp-Ch]
char v11; // [esp+A4Dh] [ebp-Bh]
mmi_server_types__t_data_fm_commandIP((int)v5, 107);
mmi_server_types__t_result_data_fm_commandIP((int)v4, 107);
result = a1;
if ( page_s_pilot_route__g_cde_allowed[a1] )
{
v5[1] = a2;
v10 = 0;
*(_DWORD *)&v7[10] = 538976288;
v8 = 538976288;
v7[14] = 4;
v9 = 4;
v3 = (unsigned __int8 *)&page_s_pilot_route__g_current_route[104 * a1];
spec_cmd_tool__var_str_24_to_str((int)(v3 + 4), (int)v7, (int *)&unk_CC0490);
v11 = page_s_pilot_route__g_route_request[a1];
v6 = page_s_pilot_route__g_nr_rte[a1];
return server_request__get_data_from_fm_command(a1, v5, v4, 1);
}
return result;
}
先用自研工具修改了上述伪代码的表现形式,特别是变量名称。
void page_s_pilot_route__cmd_for_list_pilot_route_6B95A0
(
unsigned8 arg_0,
unsigned8 arg_4
)
{
unsigned32 var_A58;
unsigned8 var_9D8;
unsigned8 var_28;
unsigned8 var_27;
unsigned32 var_24;
unsigned32 var_16;
unsigned32 var_12;
unsigned32 var_11;
unsigned32 var_D;
unsigned32 var_C;
unsigned8 var_B;
unsigned8 var_8;
mmi_server_types__t_data_fm_commandIP_621267((void *)&var_28, 107);
mmi_server_types__t_result_data_fm_commandIP_61A5EB((void *)&var_9D8, 107);
if (G_C63EF6 != 0)
{
var_27 = arg_4;
var_C = 0;
var_16 = G_CC04C8;
var_11 = G_CC04C8;
var_12 = 4;
var_D = 4;
spec_cmd_tool__var_str_24_to_str_67C5AC(&&G_28249C0[arg_0]._4, &var_8 - 24, G_CC0490);
var_B = G_28249B0;
var_24 = G_2824990;
server_request__get_data_from_fm_command_A27D7C(arg_0, &var_28, &var_9D8, 1);
}
}
通过分析得知var_28的类型是一个结构类型:
typedef struct
{
unsigned8 _0;
unsigned8 _1;
union
{
//此处略
mmi_server_types__data_fm_command_107_t u107;
//此处略
};
char _609[5];
char _632[5];
char _644[5];
unsigned16 _656;
} mmi_server_types__data_fm_command_t;//size=660
该函数使用了这个结构类型中的一个分量,其类型是:
typedef struct
{
unsigned8 _4;
char _8[10];
char _18[4];
unsigned8 _22;
char _23[4];
unsigned8 _27;
unsigned8 _28[3];
} mmi_server_types__data_fm_command_107_t;
该函数中从var_27开始的变量实际是var_28的分量。
用另一个自研工具修改了变量定义:
mmi_server_types__result_data_fm_command_t var_9D8;//#107 2472
mmi_server_types__data_fm_command_t var_28;//#107 660
//var_28._1 | unsigned8 var_27;
//var_28.u107._4 | unsigned32 var_24;
//var_28.u107._8 | unsigned32 var_20;
//var_28.u107._18 | unsigned32 var_16;
//var_28.u107._22 | unsigned32 var_12;
//var_28.u107._23 | unsigned32 var_11;
//var_28.u107._27 | unsigned32 var_D;
//var_28.u107._28 | unsigned32 var_C;
//var_28.u107._29 | unsigned8 var_B;
var_28这一行中‘#’右边2个数字的含义是:
- 107是union中的分量编号
- 660是mmi_server_types__data_fm_command_t的字节数
var_27及以下的变量不再使用,它们应以var_28的分量形式出现在代码中。
例如,var_27与var_28的偏移量是1(28-27=1),因此,代码中的var_27要改为var_28._1。
自研工具提出的修改不是完美的。例如,mmi_server_types__data_fm_command_107_t中的分量_28是一个数组,因此,var_28.u107._28与var_28.u107._29是错的,还应改为var_28.u107._28[0]与var_28.u107._28[1] 。
最终,该函数修改如下:
void page_s_pilot_route__cmd_for_list_pilot_route_6B95A0
(
unsigned8 arg_0,
unsigned8 arg_4
)
{
mmi_server_types__result_data_fm_command_t var_9D8;//#107 2472
mmi_server_types__data_fm_command_t var_28;//#107 660
mmi_server_types__t_data_fm_commandIP_621267(&var_28, 107);
mmi_server_types__t_result_data_fm_commandIP_61A5EB(&var_9D8, 107);
if (page_s_pilot_route__g_cde_allowed[arg_0])
{
var_28._1 = arg_4;
var_28.u107._28[0] = 0;
memcpy(var_28.u107._18, " ", 4);
memcpy(var_28.u107._23, " ", 4);
var_28.u107._22 = 4;
var_28.u107._27 = 4;
spec_cmd_tool__var_str_24_to_str_67C5AC(
(mcdu_key_for_special_purpose_t*)page_s_pilot_route__g_current_route[arg_0].formatD5._4._0, var_28.u107._8, &G_CC0490);
var_28.u107._28[1] = page_s_pilot_route__g_to_from_id_or_fix1_fix2_id_valid[arg_0];
var_28.u107._4 = page_s_pilot_route__g_nr_rte[arg_0];
server_request__get_data_from_fm_command_A27D7C(arg_0, &var_28, &var_9D8, 1);
}
}

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



