国外加固Appdome环境检测与绕过

news2024/9/23 5:28:20

文章目录

    • 前言
    • 第一部分:定位检测逻辑的通用思路
      • 1. 通过linux“一切皆文件”思路定位
      • 2. 分析现有检测软件猜测可能检测点
      • 3. 通过正向开发思路定位
      • 4. 通过activity及弹窗定位
    • 第二部分:检测结果展示整体流程
      • 1. Jni反射调用doDispath完成广播发送
      • 2. NativeBridge接口完成数据交互
      • 3. Appdome注册registerAppDomeBroadCastReceiver接受广播
      • 4. LoginActivity将接受事件进行活动展示
    • 第三部分:native流程分
      • 1. Native层如何分析?
    • 第四部分:绕过方案
      • 1. 不让app退出
      • 2. 使检查线程创建失败
      • 3. 粒度更小的绕过方式
      • 4. 通用绕过方案
    • 第五部分:后记
      • 1. 遇到的一些困难

前言

偶然发现使用shamiko模块无法绕过某国外加固厂商的环境检测,那么就需要具体分析一下它检测了哪里。

博主可以帮忙过AppDome的签名校验,各种签名校验,算法还原,滑块,风控的突破. 需要可以联系博主. v: cjh-18888
类 HH Poker, gcash 应用

第一部分:定位检测逻辑的通用思路

都深有感触的便是定位检测代码是个体力活;那么便先尝试用一些常用的定位思路来分析一波

1. 通过linux“一切皆文件”思路定位

通过对底层系统库函数诸如openat、readlinkat、fstatat等进行hook监控,结果如下:
在这里插入图片描述

看到打开的都是sbin目录的特征文件然而此方式shamiko便能绕过,那么便还有其余的检测点。

2. 分析现有检测软件猜测可能检测点

分析momo发现它是通过读取pts/2 下内容的方式发现su进程(此时su进程必须在运行状态下才能检测出来),然而此时su必须是运行方式才能检测出来很明显与分析app检测方式不符合。
在这里插入图片描述

3. 通过正向开发思路定位

通过普遍cv的思想在github查找开源的代码块进行定位,下面代码在检测ld_prlaods符号存在于ro.data段,那么便可以使用gdb的awatch来观察ld_prlaods所在内存是否被读写。
在这里插入图片描述

最后发现Shimako对这片进行了隐藏。因此便需要针对app的特定特征进行分析了

4. 通过activity及弹窗定位

此app有非常明显的窗口点击事件,通过hook点击事件来定位到是哪个activity进行的活动展示
在这里插入图片描述

通过对activity一步一步分析出一些整体流程

第二部分:检测结果展示整体流程

整体流程就粗略带过一下

1. Jni反射调用doDispath完成广播发送

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

2. NativeBridge接口完成数据交互

通过这些api接口完成java到native 层的数据交互,native层会根据这些信息拼接发送信息
在这里插入图片描述

3. Appdome注册registerAppDomeBroadCastReceiver接受广播

从以下代码便能看出接收器接受到检测到的各种事件
在这里插入图片描述

4. LoginActivity将接受事件进行活动展示

在这里插入图片描述

第三部分:native流程分

重点来到native的检测流程

1. Native层如何分析?

通过Jnitrace后发现以下关键字符串,因为已经知道了整体流程最终都是通过dosidpatch来发送消息,那么对最终dodispatch地址打调用栈就可以分析出完整的检测流程。
在这里插入图片描述

有了这些调用关系,接下来便是一路调试验证的体力活了,最终检测流程如下:
0x3c2920线程创建线程检测函数

在这里插入图片描述

0x97568开启安全线程检查
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

0x105704magisk detect: 路径比较,动态链接库符号比较
函数体混淆之后非常庞大,因此只关注关键地方进行分析即可
在这里插入图片描述

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

在这里插入图片描述

通过对这些函数查看参数,就可以看到一些对magiks的一些传统检测

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

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

然而这里还没有跟开头发出的json字符串有关系,所以需要接着向下分析

0x284638通过927c0和dbba0设置eventid
在这里插入图片描述

找到当前关键函数后向前打调用栈会发现有两个分支

在这里插入图片描述

0x24c164:927c0分支读取/data/data/com.mobile.co.th/cached_prefs的值判断是否设置eventid
在这里插入图片描述

这里发现cached_prefs没有任何的写入,删除便可绕过

0x253a38:dbba0分支以malloc为标志计算0x7f2190偏移处的dladdr是否为0
这里的检测思路可以参考:
https://github.com/5ec1cff/my-notes/blob/master/new-idea-detect-zygisk.md#%E6%95%B0%E5%AD%97%E4%B8%AD%E6%9A%97%E8%97%8F%E7%8E%84%E6%9C%BA
在这里插入图片描述

找到检测的关键点以后接下来的流程已经不重要了

0x20c4f4处通过看参数和结果确定是在构造json字符串
在这里插入图片描述

在0x203ac4的函数 通过eventid发送对应envent
在这里插入图片描述

0x17e8e4反射调用doDispath发送广播

在这里插入图片描述

第四部分:绕过方案

有了以上分析之后那么接下来随便绕

1. 不让app退出

分析退出流程是需要点击才能退出,于是可以通过lunch到想要的activity来进行绕过
在这里插入图片描述

2. 使检查线程创建失败

既然是创建线程来检测, 那么就可以将检测线程创建失败进行绕过
在这里插入图片描述

3. 粒度更小的绕过方式

使线程创建失败,粒度太大。也有许多对线程保护(如:将释放dex与检测放到一起,process_vm_write读取线程等)更多时候往往需要粒度更小的绕过方式,这时便可以对关键判断进行patch。

4. 通用绕过方案

rom定制root方案
kernelsu方案
漏洞root方案

第五部分:后记

1. 遇到的一些困难

分析时,检测到环境异常会退出严重干扰分析通过动态调试发现检测到环境异常后会执行非法指令进行退出。
在这里插入图片描述

使用gdb调试,追踪所有线程可以看到每个线程的行为
在这里插入图片描述

查看0x7b8段所属内存为匿名可执行段,将其dump下来可以查看syscall实现(以为在找到了7寸),分析这个可以对所有系统调用全部hook住。因为时机原因每次只hook到nano_sleep,然而真正退出并不是在这里,所以在这里倒推分析流程走了不少弯路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1335573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis案例实战之Bitmap、Hyperloglog、GEO

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…

数据安全技术措施

目录 数据安全技术的控制点 数据完整性 数据保密性 数据备份与恢复 数据安全技术的控制点 数据完整性 数据保密性 数据备份与恢复 ~over~

开发利器——C语言必备实用第三方库

​ 对于广大C语言开发者来说,缺乏类似C STL和Boost的库会让开发受制于基础库的匮乏,也因此导致了开发效率的骤降。这也使得例如libevent这类事件库(基础组件库)一时间大红大紫。 今天,码哥给大家带来一款基础库&#…

Mybatis如何兼容各类日志?

文章目录 适配器模式日志模块代理模式1、静态代理模式2、JDK动态代理 JDBC Logger总结 Apache Commons Logging、Log4j、Log4j2、java.util.logging 等是 Java 开发中常用的几款日志框架,这些日志框架来源于不同的开源组织,给用户暴露的接口也有很多不同…

Ascon加解密算法分析

参数定义 加密架构图 整个过程是在处理320bits的数据,所以在最开始需要对原始的数据进行一个初始化,获得320bits的数据块, 图里看到的pa和pb都是在做置换(对320bits的数据进行一个置换) 置换(Permutation&…

04|提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案

04|提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案 当你用 print 语句打印出最终传递给大模型的提示时,一切就变得非常明了。 您是一位专业的鲜花店文案撰写员。 对于售价为 50 元的 玫瑰 &…

c++使用强制转换类型

对于c中的强制转换,这里主要是讲解的是父类与子类之间的类型强制转换。对于以下的代码中,主要是父类Monkey和子类Man之间的成员函数的调用。 // 这是父类 class Monkey { public: // 定义一个纯虚函数 virtual void printFunc() { qDeb…

udp多播/组播那些事

多播与组播 多播(multicast)和组播(groupcast)是相同的概念,用于描述在网络中一对多的通信方式。在网络通信中,单播(unicast)是一对一的通信方式,广播(broad…

智能优化算法应用:基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.食肉植物算法4.实验参数设定5.算法结果6.…

算法学习系列(十一):KMP算法

目录 引言一、算法概念二、题目描述三、思路讲解三、代码实现四、测试 引言 这个KMP算法就是怎么说呢,就是不管算法竞赛还是找工作笔试面试,都是非常爱问爱考的,其实也是因为这个算法比较难懂,其实就是很难,所以非常个…

不同参数规模大语言模型在不同微调方法下所需要的显存总结

原文来自DataLearnerAI官方网站: 不同参数规模大语言模型在不同微调方法下所需要的显存总结 | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051703254378255 大模型的微调是当前很多人都在做的事情。微调可以让大语言模型适应特定领域的任…

Vue在页面上添加水印

第一步:在自己的项目里创建一个js文件;如图所示我在在watermark文件中创建了一个名为waterMark.js文件。 waterMark.js /** 水印添加方法 */ let setWatermark (str1, str2) > {let id 1.23452384164.123412415if (document.getElementById(id) …

数据库01_增删改查

1、什么是数据?什么是数据库? 数据:描述事物的符号记录称为数据。数据是数据库中存储的基本对象。数据库:存放数据的仓库,数据库中可以保存文本型数据、二进制数据、多媒体数据等数据 2、数据库的发展 第一阶段&…

H266/VVC帧内预测编码技术概述

预测编码技术 预测编码(Prediction Coding)是指利用已编码的一个或多个样本值,根据某种模型或方法,对当前的样本值进行预测,并对样本真实值和预测值之间的差值进行编码。 视频中的每个像素看成一个信源符号&#xff…

MFC读取文件数据,添加信息到列表并保存到文件

打开并读取文件信息 添加: BOOL infoDlg::OnInitDialog() {CDialogEx::OnInitDialog();// TODO: 在此添加额外的初始化AfxMessageBox("欢迎查看学生信息");SetList();return TRUE; // return TRUE unless you set the focus to a control// 异常: OCX 属…

Node 源项目定制化、打包并使用全过程讲解

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是全栈工…

分布式面试题-理论部分(十二道)

文章目录 分布式面试题(十二道)分布式理论1. 说说CAP原理2. 为什么CAP不可兼得呢?3. CAP对应的模型和应用?4. BASE理论了解吗? 分布式锁5. 有哪些分布式锁的实现方案呢?**5.1 MySQL分布式锁如何实现呢&…

[2023-年度总结]凡是过往,皆为序章

原创/朱季谦 2023年12月初,傍晚,在深圳的小南山看了一场落日。 那晚我们坐在山顶的草地上,拍下了这张照片——仿佛在秋天的枝头上,结出一颗红透的夕阳。 这一天很快就会随着夜幕的降临,化作记忆的碎片,然…

PoE交换机传输距离是多少?100米?250米?

你们好,我的网工朋友。 今天和你聊聊PoE交换机,之前有系统地给你讲解过一篇,可以先回顾一下哈:《啥样的交换机才叫高级交换机?这张图告诉你》 为什么都说PoE交换机好?它最显著的特点就是: 可…

openGauss学习笔记-173 openGauss 数据库运维-备份与恢复-导入数据-对表执行VACUUM

文章目录 openGauss学习笔记-173 openGauss 数据库运维-备份与恢复-导入数据-对表执行VACUUM openGauss学习笔记-173 openGauss 数据库运维-备份与恢复-导入数据-对表执行VACUUM 如果导入过程中,进行了大量的更新或删除行时,应运行VACUUM FULL命令&…