作者:yueji0j1anke
首发于公号:剑客古月的安全屋
字数:1479
阅读时间: 10min
声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。合法渗透,本文章内容纯属虚构,如遇巧合,纯属意外
目录
-
前言
-
分析
-
检测学习
-
总结
0x00 前言
本文针对某市面租车app进行越狱和代理绕过
先上个图
该app会对代理和越狱情况都有检测
0x01 分析
首先就是砸壳拿ida分析
python3 dump.py -H ip -p 22 -u root -P alpine appname
这里砸壳的时候直接闪退了,应该是检测到了相关函数
我们hook 一下系统的exit或者abort函数
frida-trace -U -i "exit" -i "abort" -f com.xxx.xxx
添加js代码,打印堆栈信息
但这里直接就退出了
根据经验,frida-trace可能出问题了,换frida直接跑脚本
Interceptor.attach(Module.findExportByName(null, "exit"), {onEnter: function (args) {console.log("12312");varexit_status=args[0].toInt32(); // 获取 exit 状态码console.log("[*] exit() called with status:", exit_status);// 可以选择阻止原始函数console.log("[*] Blocking exit()");console.log(Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join("n")) },onLeave: function (retval) {console.log("[*] exit() function is returning"); }});
可以看到在退出前系统执行了以下堆栈
可以看到在offset 0x4406408 处退出
ida来到0x104406408位置(还没加载完,悲,等他转完)
大约等了半个小时,总算是加载完了
这个时候我们再进行跳转
发现还是jump fail,那我们直接去跳堆栈上一层
这下成功了
跳转到这里,不出意外看名字应该是功能点:检测完毕后推出告知用户信息,比如说检测到代理越狱之内的
但我没有看到检测越狱的功能点
尝试对该地址函数进行一个hook
functionhookUserFuntion() {varbaseAddr=Module.findBaseAddress('WCCApp');varoffsetAddr=0x87CC// 0x100007464vartargetAddr=baseAddr.add(offsetAddr);console.log("WCCApp 基址: "+baseAddr);console.log("目标函数地址: "+targetAddr);Interceptor.attach(targetAddr, {onEnter: function(args) {console.log("函数hook成功!");console.log(' called from:n'+Thread.backtrace(this.context, Backtracer.ACCURATE) .map(DebugSymbol.fromAddress).join('n') +'n');this.skip=true; },onLeave: function(retval) {console.log("函数执行完毕"); } });}
堆栈执行正常
接下来就需要去找其对应执行的相关检测逻辑代码函数
这里我去找交叉引用没找到,线索好像断掉了....
那就直接搜索字符串 《检测到...》
我类个骚刚,早知道直接搜索字符串了
对应这里的7384方法
尝试直接hook 7384地址
但我发现直接hook这里程序直接退出,琢磨了一下,应该不是地址的问题。
hook 前面通知逻辑函数对应成功,hook 对应函数检测函数失败...这,让人费解
那我们对应再找交叉引用,hook
找到相关调用函数
这里相当于加入线程异步调用,继续往上层
这里的逻辑大约是调用一些swift库到进程中,其中包括了检测越狱代理、注入等逻辑链接库,这也是为什么我们之前注入到一半就退出的原因
最终在viewDidload找到对应调用,我们尝试切换其为空试试
成功进入
成功
functionreplaceCheck() {varbaseAddr=Module.findBaseAddress('WCCApp');console.log("WCCApp base address: "+baseAddr);//0x7008是sub_100007008越狱检测函数的偏移地址vartargetFunctionAddr=baseAddr.add(0x7008);console.log("Target function address: "+targetFunctionAddr);consttargetFunction=newNativeFunction(targetFunctionAddr, 'void', []);// 把sub_100007008替换成一个空函数Interceptor.replace(targetFunctionAddr, newNativeCallback(function () {console.log("[*] 我说不准加载就是不准加载"); }, 'void', []));consttargetFunctionAddrRootVC=baseAddr.add(0x8A24);Interceptor.attach(targetFunctionAddrRootVC, {onEnter: function (args) {console.log('RootViewController '); },onLeave: function (retval) {console.log('RootViewController'); } });}functionmain() {replaceCheck();}setImmediate(main);
0x02 越狱检测学习
这里是检测越狱相关敏感应用和动态链接库以及对应越狱可能出现的apk情况
如果这里直接用现在的rootless越狱不出意外的话是可以完美进行绕过的
0x03 总结
本次从脱壳分析ida入手,分析jail相关函数和字符串,最终从退出堆栈入手,层层分析直接到加载检测动态链接库的sub函数,并替换至空
原文始发于微信公众号(剑客古月的安全屋):App逆向攻防-绕过某车app越狱和代理检测
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论