把伪代码函数中的某些变量还原为结构变量的分量

以下是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个数字的含义是:

  1. 107是union中的分量编号
  2. 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);
  }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值