我使用的ida版本为爱盘的ida7.0,手机为小米cc9e安卓10未root,调试的应用为原文附的crackme。
手机是arm64


目录

  • 静态分析
  • 动态分析
  • 准备工作
  • android_server
  • adb命令
  • ida连接
  • 开始调试
  • 查看so内函数
  • 分析,下断点
  • 修改内存


静态分析

因为主要是想动态调试,静态就不多做介绍了,打开apk里的libJniTest.so,左侧找到这个函数进去,f5变为c代码,可以看到有三个字符串比较,第一个是签名校验,第二个是输入的用户名对比,第三个是输入的密码对比。

如果签名不对直接退出程序。

如果输入的用户名或者密码不对都会弹出登录失败,否则弹出登录成功。

(这个ida中文字符串不显示但是我也懒得折腾了。)

android 绕过R获取布局 判断安卓是否绕过src_ida

动态分析

动态调试就是在应用运行的时候边运行边调试,想做到动态调试就要借助adb、android_sesrver将ida与手机连接起来。先安装好要调试的apk(即原文中附的crackme)

准备工作

android_server

将android_server放到手机目录下并运行。如果你有root权限那么就好说了,不过像我这种没有root的,也有办法解决——就需要用到android studio。
首先手机数据线连上电脑,手机弹出连接选项选传输文件,手机设置开发者选项开启usb调试(待会如果手机弹出是否允许调试,选一律允许就行)。
然后安装android studio并打开,点开右下角的device file explorer

android 绕过R获取布局 判断安卓是否绕过src_ida_02


显示的应该是根目录,找到data/data目录下调试用的apk的包名,右键-Upload,然后选择ida目录下的android_server文件

android 绕过R获取布局 判断安卓是否绕过src_android_03


android 绕过R获取布局 判断安卓是否绕过src_动态调试_04


正常没有root的手机是没有把文件传到根目录的权限的,但是借助android studio就可以。

为什么一定要传到待调试应用的包名下?因为adb有个命令run-as+应用包名 ,可以获取应用数据,但仅限这个应用。

run-as还有一个要求,apk的AndroidManifest.xml文件中debuggable应该为“true”,待调试的apk已经是true了无需修改,如果修改了那么签名会变,待会调试的时候记得也要给签名下断点。

adb命令

现在就来用adb运行android_server。

打开cmd,输入adb shell,连上手机。

android 绕过R获取布局 判断安卓是否绕过src_移动安全_05


输入 run-as demo2.jni.com.myapplication,获取该包名下的数据

android 绕过R获取布局 判断安卓是否绕过src_移动安全_06


输入chmod 777 android_server将文件权限改为777

输入./android_server 运行

android 绕过R获取布局 判断安卓是否绕过src_ida_07


新打开一个cmd,输入adb forward tcp:23946 tcp:23946

android 绕过R获取布局 判断安卓是否绕过src_android_08

ida连接

新打开一个ida,选择debugger-attach-remote armlinux/android debugger

填好hostname和port,点ok

android 绕过R获取布局 判断安卓是否绕过src_移动安全_09


android 绕过R获取布局 判断安卓是否绕过src_移动安全_10


出现当前正在运行的应用的包名,这里只有待调试应用的包名,其他应用没权限获取不到。选择这个应用。

如果没有出现这个包名,说明你没有打开这个应用,关掉这个页面,打开应用之后再attach一次。

android 绕过R获取布局 判断安卓是否绕过src_移动安全_11


进入调试界面

android 绕过R获取布局 判断安卓是否绕过src_动态调试_12

开始调试

查看so内函数

刚才静态分析查看的是libJniTest.so文件里的函数,所以我们去右侧modules中ctrl f 搜索找到这个so,双击进入找到那个函数

android 绕过R获取布局 判断安卓是否绕过src_ida_13


android 绕过R获取布局 判断安卓是否绕过src_android 绕过R获取布局_14

分析,下断点

双击进入函数,f5反编译,发现strcmp没识别出来,没关系,我们记住他就行

android 绕过R获取布局 判断安卓是否绕过src_移动安全_15


回到IDA View-PC,鼠标点一下这个没识别出来的strcmp,,相同的strcmp都会变黄,然后右键text view,给变黄的函数前面加上断点

如图。上面还有一个检测签名的字符串比较,如果没动过apk那个不用下断点。

android 绕过R获取布局 判断安卓是否绕过src_ida_16

修改内存

到目前为止,手机上的应用应该是卡住的。点击debugger中的continue process就可以正常运行了。然后输入用户名,密码,点击登录。

点击登录之后应该会卡住,然后看我们的ida,停在strcmp这一步

android 绕过R获取布局 判断安卓是否绕过src_ida_17


按f8单步执行,到下一步ldr,我们可以看到再下一步就是cbz,cbz R0, loc_C31B7F40百度一下就知道是R0寄存器为0的时候跳转。

还是转换到graphic view看吧

android 绕过R获取布局 判断安卓是否绕过src_android_18


图中可以很明显看出,如果跳转的话,会跳到左边,进行密码的比较,那么右侧的就应该是显示登陆失败了。

所以我们是希望它跳转的,也就是希望R0寄存器为0.

那么现在r0是多少呢,在ida右上角General registers查看寄存器R0的值,可以看到是1。右键r0,点zero value,将其强制置为0.

android 绕过R获取布局 判断安卓是否绕过src_android 绕过R获取布局_19


再按f8单步执行,可以看到已经跳转到左侧。

android 绕过R获取布局 判断安卓是否绕过src_android_20


按f9执行到下一个断点,再f8下一步,看到是cbnz,这个就是不为0才跳转。

虽然中文字符串没显示出来,但是也能看到刚才如果用户名比较不对,会跳到右侧,右侧函数连着下面的右侧,也就是下面右侧是显示 登录失败,那么也就是说我们这次不希望它跳转,希望r0还是0.

android 绕过R获取布局 判断安卓是否绕过src_android 绕过R获取布局_21


再看一下r0,还是1,那么再zero value一下,然后按f9继续往下执行,这时候看看手机上的应用,就会弹出登录成功的提示。

android 绕过R获取布局 判断安卓是否绕过src_android_22


结束=-=