IDA 对 switch 的识别

在分析crash问题时,可以下载带有符号信息的动态链接库进行分析,结合源代码可以知道是由于哪条语句或哪个变量引起的。

由于附带有符号信息,所以使用IDAF5功能之后和源码对照,可以非常迅速的定位到问题。但是一次分析却卡住了,F5之后出现了JUMPOUT的语句,如下图所示。对照着源代码查看汇编代码,并查了一些资料后,发现代码里有对同一个变量进行了多次if判断,并且判断的值接近,所以编译器就采用了“跳转表”的方式加快执行速度(与switch机制一样)。


switch 修复

查到资料果然IDA有相应的处理机制:在跳转表寻址的那条语句上面,点击Edit - Other - Specify switch idiom


在跳出的设置窗口中,可以发现Address of jump tableStart of the switch idiom的参数已经通过我们指定的指令自动填写了。可以结合F5JUMPOUT的语句填写以下参数:

    Size of table element,因为是char类型的,所以填写1

    Element shift amount,因为对查表元素要*4,所以填写2

    Element base value,因为有基地址,这边填写0x77BB28

其余需要填写的参数:

    Number of elements,表元素的个数。结合上下文或源代码,此示例填写6

    Input register of switch,用于index的寄存器。结合上下文,此示例填写x11


其余参数还不知道具体的用途,在上述参数填写好后,再按F5有时候我需要重启一下才会生效)就会发现JUMPOUT语句消失了,并且反汇编了各条判断分支。