安卓逆向踩坑记录

安卓逆向踩坑记录

前期准备

要完整完成该文章的内容至少需要
硬件:
一台安卓机(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并打开

然后输入如图指令

image-20210318163133827

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

image-20210318155827056

这样根本调试不了

经过排查以后,发现如果使用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命令复制到执行路径下,改权限后即可以运行

https://bbs.pediy.com/thread-262524.htm

文章作者: Usher
文章链接: https://usher2008.github.io/2021/03/21/%E5%AE%89%E5%8D%93%E9%80%86%E5%90%91%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Usher