我正在反汇编一个似乎使用 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,因为这是一个业余爱好项目,我不想在我每年会使用几次的东西上花费数百美元)。