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_server64armeabi-v7a对应32位的android_server,这两个文件可以在idadbgsrv里面找到

4. 使用adb来连接手机,搭建环境

查看已经连接的设备

1
adb devices

上传debugger

1
2
adb push android_server /data/local/tmp/
adb shell chmod 755 /data/local/tmp/android_server

非root情况下(根本不需要root)使用runas来运行debugger

1
2
run-as <包名>
/data/local/tmp/android_server64

在另一个终端运行端口转发

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来附加到进程上面,下断点,就可以调试了