安卓逆向踩坑记录
前期准备
要完整完成该文章的内容至少需要硬件:
一台安卓机(root不root都行) 一条数据线 一个wifi以及网卡
软件:
ida、adb、jeb、vmos、v&nctf公开赛crackme1.apk
adb的两种连接方式
usb连接
(手机需要root 小米谷歌比较好root 其他…)
一般情况是这样的
usb连接电脑选择传输文件
打开手机的设置 选中关于手机 然后点很多下版本号
就会出现开发者模式(如果找不到可以在设置里搜索)
进去打开USB调试选项
然后cmd输入指令
adb kill-server 这句的意思是终止adb服务
adb devices 意思是查看现在所连接的设备 如果adb服务没开会帮你打开
adb shell 就是拿到设备的shell了
vmos无线adb
vmos最大的好处就是
即使主机没有root vmos虚拟机内也可以获得root权限
电脑和手机连接同一wifi
然后打开虚拟机
在vmos的设置里找到网络adb并打开
然后输入如图指令
adb connect 192.168.123.193:5666 这句是连接这个ip
如果没连接上重新打开一下网络ADB就行
so层调试
我这边提前把服务丢进去了
如果没丢进去 一般就像这种这样
打开之后还要转发一下tcp端口
这里我是这样理解的
前一个23946是主机这边所连接的端口
而后一个23946是虚拟机里ida服务所使用的默认的端口
而这里所实现的就是将192.168.123.193:23946转发到了127.0.0.1:23946端口
所以这一步也不是必须做的
如果转发了端口,ida里就可以这样设置了
而如果没有转发端口
这样设置也是可以的
然后attach
如果在modules里找不到.so而是.apk
这样根本调试不了
经过排查以后,发现如果使用mt管理器安装apk,会将so文件解压到了本地
而直接用系统安装的时候这个装so的文件夹是空的,是临时从base.apk里解压出来的
所以解决办法就是将so移动到app运行的位置
或者直接用mt管理器安装就可以了
我提前将断点下在了主要函数上
F9运行之后点一下check就可以在关键逻辑下断下来了
java层调试
在确保连接了adb之后
打开jeb找到关键地方下断点
在上面点击调试器->开始
附上
点击手机check
断下来了
但是右边的变量显示的好像是一个地址
分析汇编应该是一个string对象
尝试更改显示类型
over
JNI_OnLoad断点
JNI_OnLoad这个函数是apk在加载的时候就会运行的函数
如果通过附加是不能在这里断下来的,因为早就执行完了
在看过了网上的师傅们的操作之后,我也学会了一点方法论
jdwp可以用安卓stdio的ddms替代,不过比较麻烦
由于没有root(?),没复现成,vmos也复现不了 故不分析了
am start -D -n com.ctf.crackme/com.ctf.crackme.MainActivity
./ida64
adb jdwp
adb forward tcp:23946 jdwp:5852
jdb -connect com.sun.jdi.SocketAttach:port=23946,hostname=localhost
不root调试
简单来说就是在安卓里使用run-as命令, 以被调试app的权限执行ida的服务
注意将服务push到data/local/tmp里后,用copy命令复制到执行路径下,改权限后即可以运行