[安卓逆向]一步到位动态调试AliCrackme的so文件

news/2024/7/7 14:32:39

[安卓逆向]一步到位动态调试AliCrackme的so文件

写在前面

续文章 [超级详细]实战分析一个Crackme的过程:https://blog.csdn.net/yi_rui_jie/article/details/122664078

之前分析这个AliCrackme后总结过程有些繁琐,需要几次替换APK内文件及签名和不断重复调试才可以,这次直接在不动原始APK包的情况下,通过动态调试JNI_OnLoad及目标函数,直接一步到位过反调试及分析最后Flag。非常Nice!!!

动态调试

真机动态调试前一定要给APP加上可调试权限,android:debuggable="true",Android修改ro.debuggable 的四种方法,推荐以下几种可长期使用的方法:

方法一(重启失效):

已 root 的手机修改手机系统的全局debuggable标志值为 true(即将/default.prop中的ro.debuggable的默认字段值0修改为 1),这样此手机上各种AP都可以调试了,若手机重启后需要再次进行修改操作。修改 ro.debuggable 的步骤:

连接Google Nexus 真机: adb devices

检查Google Nexus 架构: adb shell getprop ro.product.cpu.abi

下载架构相同的mprop: https://github.com/wpvsyou/mprop

将文件push 进手机的指定目录下: adb push mprop /data/local/tmp

进入手机端命令: adb shell

切换获取手机的root权限: su

查找push的文件是否在手机中: cd /data/local/tmp/

查看路径下的文件以及权限: ls -l

拥有root权限更改文件的权限为777: chmod 777 mprop

修改 ro.debuggable的值为 1: ./mprop ro.debuggable 1

获取 ro.debuggable值: getprop ro.debuggable

在这里插入图片描述
在这里插入图片描述

方法二(永久有效):

前提:手机需要有magisk环境,可通过安装MagiskHide Props Config 模块修改(永久有效)

开源地址: https://github.com/Magisk-Modules-Repo 请下载使用 MagiskHide Props Config5.3.6版本

1.通过命令推送到手机 adb push MagiskHidePropsConf-v5.3.6.zip /sdcard/ 从Magisk→模块→本地安装→选择压缩包安装即可!
2.重启于机,手机进入adb shell模式
3.执行props
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KSic1FbF-1668410694729)(Photo/image-20221111114642129.png)]

4.选择需要操作的选项,首先选择4 - Edit MagiskHide props 之后选择1- ro.debuggable
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KLHdSEO9-1668410694729)(Photo/image-20221111114713038.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KJQBLJpr-1668410694730)(Photo/image-20221111114844496.png)]

5.最后查看getprop ro.debuggable 重启手机后再次查看getprop ro.debuggable查看是否仍然为1。

接下来先需要配置IDA调试的一些环境,步骤如下:
在这里插入图片描述

连接Google Nexus 真机: adb devices

检查Google Nexus 架构: adb shell getprop ro.product.cpu.abi

将文件push 进手机的指定目录下: adb push android_server /data/local/tmp/

进入手机端命令: adb shell

切换获取手机的root权限: su

查找push的文件是否在手机中: cd /data/local/tmp/

查看路径下的文件以及权限: ls -l

拥有root权限更改文件的权限为777: chmod 777 android_server

在手机中启动运行该文件: ./android_server

windows运行 端口转发到PC: adb forward tcp:23946 tcp:23946

在这里插入图片描述

再开启一个 命令行 做一下端口的转发,如下图所示:
在这里插入图片描述

全部执行完毕之后,可以看到正在监听这个端口,这时候我们打开 IDA 并且点击GO 然后按照下图选择所使用的
在这里插入图片描述

并输入 127.0.0.1 后面的端口是默认的,上面的命令也在监听这个端口。
在这里插入图片描述

找到要动态调试的软件的包名,直接选中,点击 ok 打开即可!
在这里插入图片描述

打开之后,直接使用下图的方式,或者 快捷键 Ctrl+s 找到到要调试的libcrackme.so文件 带x权限的文件。
在这里插入图片描述

在所有的so文件中直接使用快捷键Ctrl+f 搜索,并找到 Start地址先执行且有 X(可执行权限) 的 选中点击OK进入,
在这里插入图片描述

打开so文件之后我们要定位到要调试函数Java_com_yaotong_crackme_MainActivity_securityCheck的一个内存的绝对地址=so文件的基地址+函数的偏移量
在这里插入图片描述

经计算可知,函数的绝对地址就是F49591A8在IDA中 使用快捷键G跳转到地址的位置,也就是要调试的函数位置
在这里插入图片描述

找到函数名之后,鼠标右键 选择 Add breakpoint 或者 直接使用快捷键F2打断点,然后让程序恢复执行,使用快捷键F8往下走。
在这里插入图片描述

点击 F8 给so文件中已打断点的函数单步调试,结果直接就退出或出现错误弹窗等等!如下图所示:
在这里插入图片描述

证明软件有反调试的机制,先看一下软件是通过何种方式反调试的,又是如何检测被调试的呢?

检测是否被调试: 利用Linux系统 ptrace 来实现,当应用被调试时应用内存里的TracerPid字段就不为0,只要是不为0的时候,就会直接的退出程序达到反调试的目的。

接下来进入设备查看一下ptrace字段:

进入设备: adb shell

获取Root权限: su

获得APP的进程ID: ps | grep 软件的包名

查看进程的信息及TracerPid值: cat /proc/进程ID/status | grep TracerPid

在这里插入图片描述

知道了软件有反调试之后,接下来就需要对其反反调试了。

反反调试

如何反反调试: 程序的so文件在加载阶段会先执行JNI_OnLoad,之后就不再执行,在程序的so文件加载阶段才能给JNI_OnLoad打断点调试即可!

//调试APP挂在加载界面

adb shell am start -D -n 包名/.类名

adb shell am start -D -n com.yaotong.crackme/.MainActivity

用调试模式启动APP,APP此时会挂在启动界面,现在并没有开始加载so文件。
在这里插入图片描述

打开 IDA 并动态调试上面挂载的程序,进入之后点击Debugger->Debugger options… 选项如下图:
在这里插入图片描述

勾选这两项Suspend on thread start/exit、Suspend on library load/unload,之后ok,之后点击下图左上角的运行符号,让它运行起来。
在这里插入图片描述

然后让APP也运行起来,用过下面的这些命令运行APP,即可

进入设备: adb shell

获取Root权限: su

获得APP的进程ID: ps | grep com.yaotong.crackme

监听进程的ID: adb forward tcp:8700 jdwp:4495(4495为上面获得的APP进程ID)

运行进程: jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

获取APP的进程的ID以及再开启一个命令行,直接做端口的监听转发,并直接的运行进程,如下图:
在这里插入图片描述

注意:卡在运行进程这一步的不出现上图的正在初始化jdb…,应该是你漏掉了一个步骤,我就是因为截图过之后忘记了在IDA 动态调试的时候,忘记点击了一下IDA左上角的运行符号,而导致的一致不出来**正在初始化jdb…**的情况,出现初始化后,APP处于这个没有控件的界面,此时的APP并没有完全的运行起来,只是挂在这里。
在这里插入图片描述

然后我们回到 IDA 的动态调试 找到要调试的crackme.so 文件,按Ctrl+s找so文件,之后按Ctrl+f搜索crackme,如果没有就点击左上角的运行 运行一步继续操作,直到可以在所有的so文件中搜索到crackme.so文件,并且找到可执行的X权限的文件。如下图:
在这里插入图片描述

然后我们要进入 JNI_ONLoad ,接下来算绝对地址=执行so文件的基地址+函数的偏移量 最终如下图所示:
在这里插入图片描述
最终的计算结果如下图所示:
在这里插入图片描述

跳转到 JNI_ONLoad 里去了,先结合静态分析看一下这个文件流程图的大致逻辑,然后在动态调试里给 JNI_ONLoad 打断点,点击IDA左上角的运行恢复程序的运行,并一直F8调试往下走,如下图所示:
在这里插入图片描述

一直到BLX R7的位置跳了出去,很可疑的位置需要重点注意,尝试修补so文件的这个位置,看一下,如下图所示:
在这里插入图片描述

然后在IDA 动态调试中点击BLX,找到导航栏的Edit→Patch program→Changer byte
在这里插入图片描述

3F FF 2F E1修改为00 00 00 00,然后直接ok即可!
在这里插入图片描述

修改了关于程序反调试的TracerPid 指令37 FF 2F E1 改为 00 00 00 00 就不会再有反调试的防护机制了,然后找到JNI_OnLoad下断点的地方并点击F2取消之前下的断点,在IDA导航栏中点击Debugger->Debugger options... 并取消勾选下图两项:
在这里插入图片描述

接下来就是再次动态调试Java_com_yaotong_crackme_MainActivity_securityCheck

再动态调试

有了上次动态调试的经验,很快通过Ctrl+s和Ctrl+f找到了libcrackme.so的基地址,通过绝对地址=so文件的基地址+函数的偏移量定位到要调试的函数Java_com_yaotong_crackme_MainActivity_securityCheck所在的位置,如下图所示:
在这里插入图片描述
在这里插入图片描述

打断点后让程序恢复执行,让手机进入正常的界面并输入yimingrj点击输入密码将其存到寄存器,点击F8会在下断处断下,一直F8向下走找到有跳转的地方,鼠标查看寄存器的值:
在这里插入图片描述
之后我们看一下R3的值,直接使用快捷键F5看一下伪C代码,又根据之前的静态调试分析可知v6就是真实密码,最后分析出了这个软件真实的进入密码为:aiyou,bucuoo(哎呦,不错哦)!
在这里插入图片描述

输入密码在程序中验证后进入软件成功!这个软件的密码分析到这里这部分就结束了。
在这里插入图片描述


http://www.niftyadmin.cn/n/4388909.html

相关文章

asp.net 14

asp.net 生命周期转载于:https://www.cnblogs.com/youguess/p/9548881.html

《算法笔记》codeup题集——第三章

100000575-《算法笔记》3.1小节——入门模拟->简单模拟 原题解法思路问题 A: 剩下的树AC问题 B: ABAC问题 C: 特殊乘法AC问题 D: 比较奇偶数个数AC问题 E: Shortest Distance (20)AC问题 F: AB和C (15)AC问题 G: 数字分类 (20)AC问题 H: 部分AB (15)AC问题 I: 锤子剪刀布 (…

[安卓逆向]IDA Pro的认识及使用

[安卓逆向]IDA Pro的认识及使用 软件介绍 IDA Pro全称是交互式反汇编器专业版,人们其简称为IDA,IDA pro 是业界最成熟、先进的反汇编工具之一,是目前最棒的一个静态反编译软件,为众多0day世界的成员和ShellCode安全分析人士不可…

第6.6节 priority_queue 问题 A: 任务调度

问题 A: 任务调度 题目描述 读入任务调度序列&#xff0c;输出n个任务适合的一种调度方式。 输入 输入包含多组测试数据。每组第一行输入一个整数n&#xff08;n<100000&#xff09;&#xff0c;表示有n个任务。接下来n行&#xff0c;每行第一个表示前序任务&#xff0c…

CountDownLatch----线程计数器

问题 最近我在处理一批数据&#xff0c;用多线程来处理&#xff0c;我想知道大概多久能处理完。比如我先用多线程处理 100 条数据&#xff0c;统计下用时&#xff0c;然后根据总的数据量就可以大概估算出处理完这批数据要多久。 使用 CountDownLatch 计时 思路&#xff1a;用两…

PHP多进程初探 --- 开篇

[原文地址&#xff1a;https://blog.ti-node.com/blog...] 实际上PHP是有多线程的&#xff0c;只是很多人不常用。使用PHP的多线程首先需要下载安装一个线程安全版本&#xff08;ZTS版本&#xff09;的PHP&#xff0c;然后再安装pecl的pthread扩展。 实际上PHP是有多进程的&…

c++ 输入一个分数输出最简分式_分式及增长量的大小比较

大小比较。一定要结合选项&#xff01;比如题干问你&#xff0c;某一年哪个月最高&#xff0c;我们不需要从1月算到12月&#xff0c;我们只需要算选项中提到的四个月即可。分式大小比较&#xff1a;分子大分母小的大&#xff0c;分子小分母大的小&#xff1b;分子分母同大同小的…

Tachyon brief intro

作者&#xff1a;刘旭晖 Raymond 转载请注明出处 Email&#xff1a;colorant at 163.com BLOG&#xff1a;http://blog.csdn.net/colorant/ Tachyon是AmpLab的Li Haoyuan所开发的一个基于内存的分布式文件系统&#xff0c;出发点是作为AMPLAB的BDAS的一个组成部分 总体设计思想…