IDA动态调试APK
1. 使用apktools来解压apk
1 | java -jar apktools.jar d <yourapk> -f -o <output_dir> |
然后就会在你的输出目录下面找到apk文件,apk文件结构网上依照一大堆,随便找个网站参考apk逆向解析
随后你就能看到你的变成文件夹的apk了,classes.dex
里面存放了里面的绝大部分java层逻辑,但是不太好看,使用dex2jar
来进行反编译
2.使用dex2jar来反编译java层
1 | d2j-dex2jar.sh -d <yourapk> |
找到你的变成jar的apk之后,使用java-decompiler
拖进去就可以直接看java层的数据,从而判断so层的函数
3. IDA载入相关so进行静态分析
一般在apktools解压出来的apk文件夹里面的lib
文件夹里面有好几种种类的so,如果有x86的就好使用android studio
里面的模拟器来调试了,如果没有,那就GG,arm64-v8a
对应64位的android_server64
, armeabi-v7a
对应32位的android_server
,这两个文件可以在ida
的dbgsrv
里面找到
4. 使用adb来连接手机,搭建环境
查看已经连接的设备
1 | adb devices |
上传debugger
1 | adb push android_server /data/local/tmp/ |
非root情况下(根本不需要root)使用runas来运行debugger
1 | run-as <包名> |
在另一个终端运行端口转发
1 | adb forward tcp:23946 tcp:23946 |
开启调试模式安装app
1 | adb install <yourapk> |
调试模式启动app
1 | adb shell am start -D -n <packageName>/.MainActivity |
这个时候手机上面就会提示等待debugger,我们使用jdb来运行它,jdb需要手动添加jdk里面的bin目录到环境变量中,查看可调试的进程
1 | adb jdwp |
这个不会自动结束,要Ctrl+C
来结束,然后转发进程到本地的调试端口
1 | adb forward tcp:8700 jdwp:<pid> |
使用jdb来传递调试信息
1 | jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700 |
好了,这个时候手机上面就应该会有你的app运行了,然后使用IDA来附加
设置ida的hostname和port,不能直接运行,使用attach process
来附加到进程上面,下断点,就可以调试了