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

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

在跳出的设置窗口中,可以发现Address of jump table和Start of the switch idiom的参数已经通过我们指定的指令自动填写了。可以结合F5的JUMPOUT的语句填写以下参数:
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语句消失了,并且反汇编了各条判断分支。