一、所使用平台及软件:
1、安卓手机:小米2s 版本6.0 系统为开发版已取得root权限。
2、软件:IDA_Pro_v6.8
3、电脑系统win10
二、步骤:
1、确保XML里的Android:debuggable=”true”
2、将android_server文件push到手机/data/local/tmp目录
2、执行setenforce 0
3、执行chmod 755 android_server
4、执行android_server
5、端口转发 adb forward tcp:23946 tcp:23946
6、调试模式启动程序adb shell am start -D -n 包名/类名
7、IDA附加进程
8、F9运行,下断点调试。
三、扩展:
1、在有反调试的情况下如何跳过
说明,一般来说 反调试在这里开启一个线程,然后不断地做轮询,主要的原理是判断TrackerPid字段值是否等于0,由于如果存在调试,TrackerPid就不为0,因此可以用作反调试;要破解也简单,我们只要把这里的调用函数给Nop掉即可
2、下断点
Ctrl + S 然后搜索到so文件名
记录下基地址是:0×76118000
加上JNI_OnLoad函数的偏移地址0×1504为0×76119504
G跳转到0×76119504,下断点
A.触发断点
下好断点之后,直接F9运行吧,就能断在JNI_OnLoad函数处~
当这种调试手法出现之后,将特殊函数,或者反调试函数放在JNI_OnLoad中也不是那么的安全了。此时,程序猿们通过分析系统对SO文件的加载链接过程发现,JNI_OnLoad函数并不是最开始执行的。在JNI_OnLoad函数执行之前,还会执行init段和init_array中的一系列函数。
因此,现在的调试方法,都是将断点下在init_array中~
至于下断点的方法,可以类比于在JNI_OnLoad中下断点的方法,在init_array的函数中下断点。还有一种方法便是通过在linker模块中,通过对其中函数下断点,然后也能单步到init_array中下面便详细介绍下如何给任意系统函数下断点
四、后记
从很多网上博客中找到的资料,稍作整理,以备后用。已经过实际操作可行。