任何方式来解决在Ida Pro曲解案例跳转表?


3

我拆开,似乎使用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项,第二不幸的是,编译器将它们直接放在内存中。这似乎混淆IDA计算这些节点的图形连接时:

Graph for 1st jump table

编辑,因为这个问题的措辞可能是误导

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

原来的问题是:

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

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

(我使用的是IDA 5.0,因为这是一个业余爱好项目,而且我不想花几百美元购买我每年会使用几次的东西)。

5

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

    jmp
  1. 编辑 - >其他 - >指定开关成语
  2. 将光标...
  0

不是我想听到的,但可能是我会得到的最佳答案。 16 4月. 142014-04-16 12:09:48


3

我不太清楚,如果我理解你的问题,但我怎么设置跳转表是:

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

编辑: 我已经有点太罗嗦了。我认为你需要的是将跳线分成一行,然后使用数组命令{*}来完成,并取消选中所有复选框。我对图表视图的经验是,它不知道如何处理跳转表,不管你如何配置它们。

  0

对不起,我想我的问题是误导性的(“从第一个*表中删除额外的连接*”)。我的问题是,图节点有9个传出连接,它应该只有5个连接,所以有些连接是错误的,并且图形比它应该更复杂。我想以某种方式告诉IDA“这个跳转表有5个条目,即使它看起来是9,因为最后4个属于不同的跳转表”。不幸的是,你的“不知道如何处理跳转表,不管你如何配置它们”意味着它可能是不可能的。 15 4月. 142014-04-15 17:42:33

  0

也许我错了,但我认为图表视图被跳转表打破了,所以我从来没有去追求它。看起来你必须告诉IDA,跳转表的一部分在一个函数(proc)内,另一部分在另一个函数内。 15 4月. 142014-04-15 20:29:00