IDA调试阻止java线程异常退出

最近在使用IDA调试分析某款产品遇见了一个头痛的问题,因为程序核心功能在native层实现的,所以主要的侧重点是分析so文件,但是在分析的时候总是出现java线程异常,导致程序异常退出,而且总是在分析到最关键的地方退出,开始的时候不知道怎么处理,跟程序抢时间,你肯定抢不过他,真的很懊恼,后来经过同事的指点,由于是java线程出了问题,可以使用jdb指令去操作线程试一试,果真有效,直接贴图:

解除阻止java内容在此浏览器会话中运行 已经阻止java_查看java线程是否退出

从图片中可以看出,出现异常错误的线程是Thread-2,具体出现错误的是哪个类下面的哪个函数的第几行都已经告诉我们了,反编译成smali文件,打开到出错代码的位置,返回到调用函数一看还真的是直接kill掉进程(具体的图片补贴了,有点职业操守)

在调试过程中,当java线程出现异常的时候,调试程序会被挂起,最直观的现象就是IDA卡住跑不起来了,这时候就要注意看看是不是出现和我类似的情况。下面我就说一下怎么操作(友情提示:以下的操作都是围绕jdb指令展开的,不了解的同学请参考这里jdb百度百科)。

首先查看一下Thread-2的线程ID,键入threads命令,从上图中可以看出列出的线程列表,Thread-2的线程ID号是0x1105;

其次键入run命令让挂起的程序跑起来,这里有个小技巧,就是设置一个即将运行到某处的断点,我设置的是API断点,运行起来就能断下来,这样做的目的是保证程序不会马上退出,只要不退出后面就有机会让程序一直跑下去;

最后键入suspend 0x1105,也就是挂起异常线程;

这样程序就不会因为异常出错而退出了,你想要跟踪的东西就会很顺利的得到。需要注意的是第二步,一定不能要一直运行下去,这样会很快退出的。(个人实际应用中总结的一点小技巧,高手掠过,大牛勿喷,谢谢!)

最后于 2019-5-16 21:21

被梨树生果编辑