2020-04-24
-
学习如何进行动态调试
- 本文以截图和说明建议为主,后期如有新的想法再丰富
- 准备一部已经root过的手机,然后还要准备ida
- 第一步先将android_server push到手机的/data/local/tmp/目录下
- android_server 存放在 ida目录下的dbgsrv
- 命令为 adb push android_server /data/local/tmp
- 给android_server 修改权限 chmod 777 android_server
- 运行 ./android_server -pXXXX
- android_server 默认端口为23946
- 如果没有-pXXXX则使用默认端口
- XXXX为要监听的端口号
- -pXXXX中间没有空格
- 端口转发
- adb forward tcp:XXXX tcp:XXXX
- XXXX就是第三步设置的端口号,,
- 如果第三步默认,则此处转发端口号为23946
- 挂起应用
- adb shell am start -D -n package/ActivityName
- 如何查看包名和ActivityName
- 使用jadx-gui,将apk拖入到该软件中,查看"资源文件->AndroidManifest.xml"文件。如图
- adb shell am start -D -n com.example.javandk1/.MainActivity
- 挂起成功之后,手机界面显示如下图
- ida Attach
- 打开IDA 32位版本
- 选择 Debugger->Attach->Remote ARMLinux/Android debugger如图
- 在打开的界面设置HostName和Port,HostName=127.0.0.1 Port=上部转发的XXXX,如图
- 在打开的界面中选中需要注入的进程,可以通过ctrl+f搜索名称,找到后双击进入
- 进入ida主界面,然后选择三项,方法是依次选择Debugger->Debugger options
- 在打开的Debugger setup界面设置三项。其中
- 含义如下
- Suspend on process enter point 进程入口点挂起
- Suspend on thread start/exit 线程启动/退出时挂起
- Suspend on library load/unload 库加载/卸载时挂起
- 含义如下
- 点击左上角的绿色三角或者F9运行命令
- 打开ddms查看apk运行的端口,此时端口为8644
- 运行jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8604
- 运行成功如下图
- 此时IDA已经断下,截图:
- 此时ida成功断下,
- 在右边modules中搜索javankd1.so。so名称在包体的lib目录下,
- 找到so后双击so文件,在打开的Module: libjavankd1.so中搜索需要打断点的函数,本文以JNI_OnLoad为例,如图:
- 下好断点之后F9运行,在没有反调试的情况下,,就会正确的停在断点处。