IDA代码修复的问题

在IDA中经常碰到源码应该是类似switch语句的架构,
汇编为
ADR X9, A
LDRH W10, [X25,X8,LSL#1]
ADD X9, X9, X10,LSL#2
BR x9
但是F5之后得到的是
JUMPOUT(CS, (char *)&A + 4 * B[v13]);
这样的结果
如何修复将其修改成switch的伪码那?

一般都是用X8做目标函数地址寄存器的,这种用X9的似乎是动态变化的

1 个赞

是动态变化的,这里是碰到数组结果赋值给x9;
还有直接是一个函数返回值赋值给寄存器,然后利用br 跳转的,这2种我都不知道怎么进行恢复,switch。

看雪上有关于jumpout的对抗方法,分享一个对抗JUMPOUT的小技巧,不过似乎只是单独一个地址的跳转。你这种地址数组(多个可能地址)的跳转的话,感觉弄成switch是个不错的办法。只是我也不会弄这个 :broken_heart:

如何恢复成switch的,或者别的什么方法,能看出伪码就行啊,暂时还没找到什么解决办法。

最后搞定了吗?

看这篇文章,有你想要的 Anti-Disassembly on ARM64 - #15 由 Zhang

1 个赞

选中 br x9,然后ida中代开
edit ->>>> other ->>>> Specify switch idiom…
然后按下图,操作:
1111

各个参数,对应如下:

注释: 弄完了之后,先删掉当前函数,然后从新创建函数.
遇到表的格式,不一样的,就自建跳转表。

学习了,谢谢!

老哥,我这个jumpout怎么填弹框里的那些元素? :laughing:

JUMPOUT(CS,idb_tbl_3[0]);

不就是没基址 没移动位么…你对比下啊

JUMPOUT( CS ,0x00000 + 1*idb_tbl_3[0]);
翻译不一定准,对比汇编看,汇编才是准的