我使用的ida版本为爱盘的ida7.0,手机为小米cc9e安卓10未root,调试的应用为原文附的crackme。
手机是arm64
目录
- 静态分析
- 动态分析
- 准备工作
- android_server
- adb命令
- ida连接
- 开始调试
- 查看so内函数
- 分析,下断点
- 修改内存
静态分析
因为主要是想动态调试,静态就不多做介绍了,打开apk里的libJniTest.so,左侧找到这个函数进去,f5变为c代码,可以看到有三个字符串比较,第一个是签名校验,第二个是输入的用户名对比,第三个是输入的密码对比。
如果签名不对直接退出程序。
如果输入的用户名或者密码不对都会弹出登录失败,否则弹出登录成功。
(这个ida中文字符串不显示但是我也懒得折腾了。)
动态分析
动态调试就是在应用运行的时候边运行边调试,想做到动态调试就要借助adb、android_sesrver将ida与手机连接起来。先安装好要调试的apk(即原文中附的crackme)
准备工作
android_server
将android_server放到手机目录下并运行。如果你有root权限那么就好说了,不过像我这种没有root的,也有办法解决——就需要用到android studio。
首先手机数据线连上电脑,手机弹出连接选项选传输文件
,手机设置开发者选项开启usb调试
(待会如果手机弹出是否允许调试,选一律允许就行)。
然后安装android studio并打开,点开右下角的device file explorer
显示的应该是根目录,找到data/data目录下调试用的apk的包名,右键-Upload,然后选择ida目录下的android_server文件
正常没有root的手机是没有把文件传到根目录的权限的,但是借助android studio就可以。
为什么一定要传到待调试应用的包名下?因为adb有个命令run-as+应用包名 ,可以获取应用数据,但仅限这个应用。
run-as还有一个要求,apk的AndroidManifest.xml文件中debuggable
应该为“true”,待调试的apk已经是true了无需修改,如果修改了那么签名会变,待会调试的时候记得也要给签名下断点。
adb命令
现在就来用adb运行android_server。
打开cmd,输入adb shell
,连上手机。
输入 run-as demo2.jni.com.myapplication
,获取该包名下的数据
输入chmod 777 android_server
将文件权限改为777
输入./android_server
运行
新打开一个cmd,输入adb forward tcp:23946 tcp:23946
ida连接
新打开一个ida,选择debugger-attach-remote armlinux/android debugger
填好hostname和port,点ok
出现当前正在运行的应用的包名,这里只有待调试应用的包名,其他应用没权限获取不到。选择这个应用。
如果没有出现这个包名,说明你没有打开这个应用,关掉这个页面,打开应用之后再attach一次。
进入调试界面
开始调试
查看so内函数
刚才静态分析查看的是libJniTest.so文件里的函数,所以我们去右侧modules中ctrl f 搜索找到这个so,双击进入找到那个函数
分析,下断点
双击进入函数,f5反编译,发现strcmp没识别出来,没关系,我们记住他就行
回到IDA View-PC,鼠标点一下这个没识别出来的strcmp,,相同的strcmp都会变黄,然后右键text view,给变黄的函数前面加上断点
如图。上面还有一个检测签名的字符串比较,如果没动过apk那个不用下断点。
修改内存
到目前为止,手机上的应用应该是卡住的。点击debugger中的continue process
就可以正常运行了。然后输入用户名,密码,点击登录。
点击登录之后应该会卡住,然后看我们的ida,停在strcmp这一步
按f8单步执行,到下一步ldr,我们可以看到再下一步就是cbz,cbz R0, loc_C31B7F40百度一下就知道是R0寄存器为0的时候跳转。
还是转换到graphic view看吧
图中可以很明显看出,如果跳转的话,会跳到左边,进行密码的比较,那么右侧的就应该是显示登陆失败了。
所以我们是希望它跳转的,也就是希望R0寄存器为0.
那么现在r0是多少呢,在ida右上角General registers
查看寄存器R0的值,可以看到是1。右键r0,点zero value
,将其强制置为0.
再按f8单步执行,可以看到已经跳转到左侧。
按f9执行到下一个断点,再f8下一步,看到是cbnz,这个就是不为0才跳转。
虽然中文字符串没显示出来,但是也能看到刚才如果用户名比较不对,会跳到右侧,右侧函数连着下面的右侧,也就是下面右侧是显示 登录失败,那么也就是说我们这次不希望它跳转,希望r0还是0.
再看一下r0,还是1,那么再zero value一下,然后按f9继续往下执行,这时候看看手机上的应用,就会弹出登录成功的提示。
结束=-=