IDA动态调试逆向分析Android so

使用IDA进行动态调试Android so,有两种方式进行调试如下所示:

  (1).一种是调试启动方式,调试启动可以调试jni_onload ,init_array处的代码,可以在较早的时机得到调试权限,一般反调试会在较早的时候进行启动。

  (2).另一种则是附加调试,附加调试是在App已经运行起来的时候进行附加调试,这两种方式与Windows上的调试启动和附加调试概念很相似。

 

实践环境:Windows 10 + IDA Pro 7.0 + Nexus5(Android 7.1.2)

 

第一种:调试启动

 

1.以调试的方式启动程序(可以在jni_onload、init_array处下断点)

adb shell am start -D -n com.***.***/.MainActivity

图片

 

2.在IDA的主目录dbgsrv目录下,找到android_server,拷贝到手机的data/local/tmp/目录下

图片

  

adb push (android_server所在目录) /data/local/tmp

图片

 

3.使用chmod修改android_server程序的执行权限并执行

adb shell chmod 755 /data/local/tmp/android_server 

图片

 

 

adb shell

su

cd data/local/tmp

./android_server

图片

4.新开一个cmd窗口使用forward程序进行端口转发

adb forward tcp:23946 tcp:23946

图片

 

5.打开方法调试

打开IDA,选择菜单Debugger -> Attach -> Remote ARM Linux/Android debugger

图片

 

6.Hostname填写127.0.0.1或者locahost

Port端口自动填23946 

图片

 

7.选择要进行调试的App

图片

 

点击OK按钮则进入调试界面,注意,这时候还不能进行动态调试

图片

 

8.点击菜单Debugger->Debugger Opitions在弹出的Debugger setup窗口的Events中选择Suspend on Process entry和Suspend on thread start/exit以及Suspend on library load/unload,再点击OK退出。通过此操作可以设置程序在创建新线程和加载so时自动中断

图片

 

通过DDMS获取相应进程的端口号,然后使用jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=XXXX(DDMS查询到的端口号,一般ddms进行转发后的端口都是8700) 

图片

 

如果成功执行jdb -connect DDMS上虫子图标会变成绿色 

图片

 

连接成功后,在IDA按F9后手机上的“waiting for debugger"提示会自动消失,这个时候应该已经断在新线程,或者加载so处了。

图片

 

9.现在就可以在IDA中按下快捷键CTRL + S来查看要调试的so是否已经加载了,如果没有就按F9,直到加载了为止;如果已经有了,就记下该so的start位置,然后另开一个ida分析.so库,找到JNI_ONLOAD的偏移地址,那么该JNI_OnLoad函数在进程中的真实地址就是so.start + JNI_OnLoad_Offset

图片

 

图片

  

0x753030000 + 0x1B9C = 0x75304B9C(JNI_OnLoad在App进程中的地址)

 

这里需要说明的是:有可能在快捷键CTRL + S跳出的窗口中有两个同名的so,我们应当选择权限为RX的这个,RX一般是代码段,RW一般是数据段。

 

10.得到真实地址后,在IDA中按下快捷键G跳转到这个地址,然后按下快捷键F2就完成在JNI_OnLoad函数入口处下断点了。如果想直接在native函数下断点,那么另开一个IDA进行静态分析查看函数地址,然后转换成为动态加载起来的地址,接着按快捷键G跳转到该地址下断点即可

图片

 

11.再次按下F9,则在JNI_OnLoad断了下来,接着就可以进行动态调试逆向分析功能

图片

 

第二种:附加方式调试so

 

1.拷贝android_server

adb push (android_server所在目录) /data/local/tmp

 

2.修改执行权限并执行

adb shell chmod 755 /data/local/tmp/android_server

adb shell

su

cd data/local/tmp

./android_server

 

3.转发端口

adb forward tcp:23946 tcp:23946

 

4.启动android_server

发现一个小问题,就是退出调试以后再次调试,android_server没有close,按道理是可以再一次连接的,但是这里则是无法进行再次连接调试,所以需要重新启动一下

android_server

如下:(14061是pid)

root@android:/ # ps | grep android_server

root 14061 13574 11180 9504 ffffffff 40183da0 S /data/local/tmp/android_server 

root@android:/ # kill -s 9 14061 

 

5.打开IDA,选择菜单Debugger -> Attach -> Remote ARM Linux/Android debugger

图片

 

Hostname填写127.0.0.1或者locahost

Port端口自动填23946

图片

 

选择要进行调试的App

图片

 

得到进程中的地址后,在IDA中按下快捷键G跳转到这个地址,然后按下快捷键F2就完成在JNI_OnLoad函数入口处下断点了。如果想直接在native函数下断点,那么另开一个IDA进行静态分析查看函数地址,然后转换成为动态加载起来的地址,接着按下快捷键G跳转到该地址下断点即可 

图片

 

运行程序指定功能,触发断点,接着就可以到达该函数进行动态调试逆向分析功能

图片

 

关注公众号,获取更多最新文章

图片

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哆啦安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值