您的位置:首页 > 其它

安卓逆向学习(1):so文件的动态调试方法

2017-02-02 16:28 323 查看
一、所使用平台及软件:

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中下面便详细介绍下如何给任意系统函数下断点

四、后记

从很多网上博客中找到的资料,稍作整理,以备后用。已经过实际操作可行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: