有什么方法可以修复 Ida Pro 中误解的案例跳转表?

逆向工程 艾达 拆卸
2021-07-08 09:55:08

我正在反汇编一个似乎使用 switch 语句的函数,导致索引间接跳转,在两个不同的地方(同一个函数!):

0005FA58                 mov     al, [eax+112h]
0005FA5E                 cmp     al, 4
0005FA60                 ja      loc_5FBED
0005FA66                 and     eax, 0FFh
0005FA6B                 jmp     cs:off_5F98C[eax*4]
0005FA73


00060011                 mov     al, byte ptr unk_A4E30[eax]
00060017                 cmp     al, 3
00060019                 ja      short loc_60053
0006001B                 and     eax, 0FFh
00060020                 jmp     cs:off_5F9A0[eax*4]

0005F98C off_5F98C       dd offset loc_5FBCC, offset loc_5FA73, offset loc_5FAC5, offset loc_5FB14, offset loc_5FB66
0005F98C                                         ; DATA XREF: FunctionStart+BB
0005F9A0 off_5F9A0       dd offset loc_60049, offset loc_6003E, offset loc_60031, offset loc_60028
0005F9A0                                         ; DATA XREF: FunctionStart+670

第一个跳转表有 5 个条目,第二个有 4 个条目。不幸的是,编译器将它们直接放在内存中。在计算这些节点的图连接时,这似乎让 IDA 感到困惑:

第一个跳转表的图表

编辑,因为问题的措辞可能具有误导性

图节点显示 9 个传出连接。其中 5 个是真正的连接,接下来的 4 个不是 - 它们属于不同的跳转表,恰好在内存中的这个之后。我想告诉 IDA“这个跳转表有 5 个有效条目,在创建图形节点时忽略其他条目”。有没有办法做到这一点?

原来的问题是:

第一个跳转表有 9 个连接,其中 4 个不属于 语句。(为简洁起见,这里省略了第二个,只有一个连接)。有什么方法可以告诉 IDA 从第一个表中删除额外的连接,并可能创建从第二个表到相应目标的新连接?

我已经尝试将跳转表定义为数组,然后取消定义函数并将其重新定义为代码,但这并没有改变任何东西。

(我正在使用 IDA 5.0,因为这是一个业余爱好项目,我不想在我每年会使用几次的东西上花费数百美元)。

2个回答

这是可能的,但不是在免费软件版本中:

  1. 将光标放在 jmp
  2. 编辑->其他->指定开关习语...

我不太确定我是否理解你的问题,但我如何配置跳转表是:

  1. 将整个表转换为 db 字节,非数组,每行一个字节。
  2. 将顶部元素设置为 2 个字节 (dw),然后设置O.
  3. 从顶部元素到最后一个元素突出显示并配置为数组 (*),但未选中数组复选框。
  4. 如果在第一张桌子之后紧接着有第二张桌子,那么做同样的事情。

编辑:我有点太罗嗦了。我认为您需要的是将跳转分成每行一个,然后使用数组命令 {*} 执行此操作并取消选中所有复选框。我对图形视图的经验是,无论您如何配置它们,它都不知道如何处理跳转表。