android脱壳:一种使用native进行抽取壳脱壳的方法,native版本的frida-fart

news/2024/5/18 18:59:51

前言

写rxposed的时候,搞了很多模块,其中有一个远程调用脱壳的,但是当时使用的是rmi远程调用,因为一些问题无法使用,可能是对抗问题,也有可能是技术问题,所以我又换了一种远程调用方式。

概述

android的dex加固,有整体dex加固,抽取加固,dex vmp,java2c,虽然有这么多,但是其实就脱壳主要是两个方面,第一个是整体dex脱壳,第二个就是在整体dex脱壳的基础上进行dex加密函数还原。抽取加固,dex vmp,java2c这些加固方式都以函数为粒度,进行函数代码的保护。

整体加固脱壳

这个比较简单,有一些dex的文件是不进行加固的,直接解压apk就行,有些dex是加固过的,常用的dex不落地的内存加载,对于这种dex的脱壳都有个通用的方案,就是内存dump。dex在运行时总是要加载到内存中的,所以选择合适的时机是可以dump下来完整的dex的。

抽取壳脱壳

dexvmp,java2c,dex抽取,这些加固方案,在我看来其实都是函数方法抽取,dex抽取是代码抽取了以后,在运行时还原,dexvmp,java2c这些方案是抽取了以后将抽取的代码转变成了另一种代码,导致了无法自动还原,code_item消失。

dex抽取还原与防护的问题

如上所属,整体加固的脱壳,在运行时dump下来,而dex抽取,我也说了,在运行时还原,那么可以不可以将dex整体dump和dex抽取还原放到一起那

可以,这种可执行文件加固,本质上就是一种静态加密,动态运行时解密,理论上只要在动态运行解密后dump下来就可以了。

为什么fart和frida-fart都是先脱dex然后在修复code_item的方案

因为直接在内存dump整体dex,然后在获取解密的code_item的修复到dex的方案,对于某些有针对性对抗的安全方案是无效的,对于比较简答的dex抽取确实没有问题

为什么对于某些有针对性对抗的安全方案,内存直接修复dex无效(没有完全分析完成)

因为内存中dump下来的dex在修复code_item的时候,都是将dump下来的code_item,写到dex中code_item被抽取出来的位置,但是内存中dump出来的dex中,可能没有code_item的位置,可能是dex文件进行了重新编译的时候抽出来,也可能是定制了dex重编译,将特定的code_item抽出来,也有可能是修改了偏移位置等等

fart和frida-fart异同

fart和frida-fart都是基于主动加载脱壳,但是fart是基于函数级别的主动加载,会在dex方法执行前夕进行dump,frida-fart是基于类加载的主动加载,颗粒度没有fart细,但是他们有同属于dex内存加密函数自动还原方式的脱壳,如果frida-fart不行,可能是有一些别的问题,如果fart,那么可能就是真的不行,这种方案就本身不行了。甚至可能不是dex抽取壳。

frida-fart 能不能做到和fart一样

理论上可以,hook一些fart中dex函数主动调用需要用到的函数,确实可以,但是目前没有实践

修复问题

fart和frida-fart具体怎么修复的我没有去了解,但是如果内存位置不够的话,先反编译dex,将code_item的字节码反编译然后写入到dex中(可能需要用smail写),然后在回编译,可能就可以了。当然,如果可以做到dex内存重组,也可以。

dex抽取壳的强度好像有点低,有没有更高强度的方案

dex抽取相比于dex内存不落地加载,实现的难度高很多,但是在保护方面,强度确实好像并没有很高,有些确实有修复问题,但是实际上内存中都解密了。

网上说fart是主动调用,但是我觉得不太准确,far和frida-fart其实都像是主动加载,博客里说的这些函数需要真正执行一次在dump,更像是主动调用

借鉴一段他的代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

.method public constructor <init>()V

    .registers 2

    goto :goto_c

    :goto_1

    nop

    nop

    nop

    nop

    nop

    nop

    nop

    nop

    nop

    nop

    return-void

    :goto_c

    const v0, 0x1669

    invoke-static {v0}, Ls/h/e/l/l/H;->i(I)V

    goto :goto_1

.end method

函数本身就是壳代码,需要先执行一次,对本身进行解密。

还有一些强度更高的,被加密的函数执行以后,会先调用壳代码解密,然后调用执行原函数,然后在加密回去。甚至可以将dex指令揭秘一条,执行一条,循环解密,这些可能会需要一些技巧,但是都是fart或者说自动脱壳所无法做到的。

抽取方案的问题

确实可能存在更高强度的抽取,我在研究的时候也一堆纠结,但是转换思路想写,抽取壳本身的兼容问题,写的强队越高,越复杂,兼容问题越严重,而且还有性能问题,一般越复杂的加密和解密,都意味着性能成倍的损耗。另外方案价值的问题,如果抽壳的方案写的如此复杂,就像我前面说的,解密要好几层,那么为什么不用dex vmp。

学到了点东西

安全对抗中技术确实是一个问题,但是一个安全产品不是技术的高低问题,而是他是否能符合客户要求,在符合用户要求和最大化利益的情况下,提高技术上线。毕竟要吃饭,这也是对抗中防守方的弱势问题。

native版本的frida-fart

我在上一次写博客推荐我的rxposed的工具的时候,埋了个脱壳的坑,但是有些事没搞完。

讲个笑话:

当时我觉得fart这类工具确实是可以做到内存自动修复的,然后我屁颠屁颠的去找肉丝说我给你修一下,然后肉丝说你去搞搞银行app,然后我去了,我才发现这种code_item偏移位置有问题的dex,理论上确实能做,但是工程里估计很大,只能说,真是尴尬。

网上说fart是主动调用,但是我觉得不太准确,far和frida-fart其实都像是主动加载,博客里说的这些函数需要真正执行一次在dump,更像是主动调用

借鉴一段他的代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

.method public constructor <init>()V

    .registers 2

    goto :goto_c

    :goto_1

    nop

    nop

    nop

    nop

    nop

    nop

    nop

    nop

    nop

    nop

    return-void

    :goto_c

    const v0, 0x1669

    invoke-static {v0}, Ls/h/e/l/l/H;->i(I)V

    goto :goto_1

.end method

函数本身就是壳代码,需要先执行一次,对本身进行解密。

还有一些强度更高的,被加密的函数执行以后,会先调用壳代码解密,然后调用执行原函数,然后在加密回去。甚至可以将dex指令揭秘一条,执行一条,循环解密,这些可能会需要一些技巧,但是都是fart或者说自动脱壳所无法做到的。

抽取方案的问题

确实可能存在更高强度的抽取,我在研究的时候也一堆纠结,但是转换思路想写,抽取壳本身的兼容问题,写的强队越高,越复杂,兼容问题越严重,而且还有性能问题,一般越复杂的加密和解密,都意味着性能成倍的损耗。另外方案价值的问题,如果抽壳的方案写的如此复杂,就像我前面说的,解密要好几层,那么为什么不用dex vmp。

学到了点东西

安全对抗中技术确实是一个问题,但是一个安全产品不是技术的高低问题,而是他是否能符合客户要求,在符合用户要求和最大化利益的情况下,提高技术上线。毕竟要吃饭,这也是对抗中防守方的弱势问题。

native版本的frida-fart

我在上一次写博客推荐我的rxposed的工具的时候,埋了个脱壳的坑,但是有些事没搞完。

讲个笑话:

当时我觉得fart这类工具确实是可以做到内存自动修复的,然后我屁颠屁颠的去找肉丝说我给你修一下,然后肉丝说你去搞搞银行app,然后我去了,我才发现这种code_item偏移位置有问题的dex,理论上确实能做,但是工程里估计很大,只能说,真是尴尬。


http://www.mrgr.cn/p/03052624

相关文章

视频批量采集下载软件|短视频爬虫提取工具

一款短视频批量下载工具&#xff0c;为用户提供了便捷高效的视频获取解决方案。与市面上其他工具不同的是&#xff0c;工具不仅支持单个视频链接提取&#xff0c;更可通过关键词进行批量搜索&#xff0c;满足用户多样化的需求&#xff0c;实现视频下载的一键快捷操作。 操作简单…

Flink CDC详解

文章目录 Flink CDC一 CDC简介1.1 CDC定义1.2 CDC应用场景1.3 CDC实现机制1.4 开源CDC工具对比 二 Flink CDC简介2.1 Flink CDC介绍2.2 Flink CDC Connector(连接器)2.3 Flink CDC && Flink版本2.4 Flink CDC特点 三 Flink CDC发展3.1 发展历程3.2 背景Dynamic Table &…

七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接

前言 上一章节我们引入BootstrapBlazor UI组件完成了EasySQLite后台界面的基本架子的搭建,本章节的主要内容是Blazor班级管理页面编写和接口对接。 七天.NET 8 操作 SQLite 入门到实战详细教程第一天 SQLite 简介 第二天 在 Windows 上配置 SQLite 环境 第三天 SQLite 快速入门…

BOS协同开发平台打开方案或者刷新列表时异常报错

在应用开发方案更新SVN也偶发性出现无法访问金蝶SVN路径原因: 有线网络适配器配置的DNS域名是8.8.8.8 解放方案:修改有线网络适配器DNS域名,如下截图

面试遇到算法题:实现LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存约束的数据结构。 这是一道大厂面试高频出现的算法题&#xff0c;难度为⭐️⭐️⭐️&#xff0c;属于中等&#xff0c;老铁们来一起看看这个题该怎么解&#xff1f; 1. 原题再现 没有废话&#xff0c;翠花&#xff0c;上酸菜&…

数据结构系列-堆排序当中的T-TOK问题

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 之前我们讲到了堆排序的实现逻辑&#xff0c;那么接下来我们重点关注的就是其中的T-TOK问题 T-TOK说简单点&#xff0c;就是说&#xff0c;假如有10000个数据&#xff08;随机的…

揭开ChatGPT面纱(3):使用OpenAI进行文本情感分析(embeddings接口)

文章目录 一、embeddings接口解析二、代码实现1.数据集dataset.csv2.代码3.运行结果 openai版本1.6.1 本系列博客源码仓库&#xff1a;gitlab&#xff0c;本博客对应文件夹03 在这一篇博客中我将使用OpenAI的embeddings接口判断21条服装评价是否是好评。 首先来看实现思路&am…

golang学习笔记(defer基础知识)

什么是defer defer语句用于golang程序中延迟函数的调用&#xff0c; 每次defer都会把一个函数压入栈中&#xff0c; 函数返回前再把延迟的函数取出并执行。 为了方便描述&#xff0c; 我们把创建defer的函数称为主函数&#xff0c; defer语句后面的函数称为延迟函数。延迟函数…

重回铁王座!时隔5年!Quill 2.0 终于发布啦

2024年4月17日,Quill 2.0 正式发布🎉期待了5年,我怀着激动的心情立马升级体验了下,本文我就带大家一起看看 Quill 2.0 有哪些重大更新。你好,我是 Kagol。 2024年4月17日,Quill 2.0 正式发布🎉 最后一个 1.0 版本 1.3.7 发布于 2019年9月9日,时隔4年零7个月。 富文本…

Adobe Illustrator 2024 v28.4.1 (macOS, Windows) - 矢量绘图

Adobe Illustrator 2024 v28.4.1 (macOS, Windows) - 矢量绘图 Acrobat、After Effects、Animate、Audition、Bridge、Character Animator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、Lightroom Classic、Media Encoder、Photoshop、Premiere Pro、Adobe XD 请…

Git之merge与rebase操作命令及问题

背景&#xff1a;之前一直使用的是 merge 来实现两分支的合并代码操作&#xff0c;遇到冲突&#xff0c;解决完冲突从头 add 、commit 、push 再次操作一遍提交操作就没啥事了。但后来的大型项目是 多人协同开发&#xff0c;前端带头人提议倡导使用 rebase 来合并分支&#xff…

推荐|免费ssl通配符证书https通配符证书平台,性价比超高的证书

在网络安全日益重要的今天,选择一个可靠的SSL证书平台至关重要。Spug证书平台以其高性价比、专业服务、便捷操作,以及独有的无限免费通配符证书申请功能,成为了您的理想选择。 网址:ssl.spug.cc 为什么选择Spug证书平台?免费通配符:支持免费申请通配符证书,为您的多子站…

Pytorch手撸Attention

Pytorch手撸Attention 注释写的很详细了&#xff0c;对照着公式比较下更好理解&#xff0c;可以参考一下知乎的文章 注意力机制 import torch import torch.nn as nn import torch.nn.functional as Fclass SelfAttention(nn.Module):def __init__(self, embed_size):super(S…

架构师核心-云计算云上实战(云计算基础、云服务器ECS、云设施实战、云上高并发Web架构)

文章目录 云计算基础1. 概念1. 云平台优势2. 公有云3. 私有云4. IaaS、PaaS、SaaS 2. 云设施1. 概览2. 核心组件 云服务器ECS1. ECS介绍1. 简介2. 组件3. 概念4. 图解5. 规格6. 场景 2. ECS服务器开通1. 开通服务器2. 连接服务器 3. 云部署准备1. 1Panel介绍2. 安装1Panel3.安全…

读天才与算法:人脑与AI的数学思维笔记09_分形

分形1. 分形 1.1. 1904年,瑞典数学家科赫(Helge von Koch)首次发表了雪花图案的结构——科赫曲线(又称雪花曲线),它被认为是一种数学怪胎,一种奇怪的人工构造 1.1.1. 但实际上并不是,自然界中到处都是以分形结构存在着的图形 1.1.2. 既不能说科赫曲线是一维的,也不能说…

C/C++程序设计实验报告4 | 函数实验

本文整理自博主本科大一《C/C程序设计》专业课的课内实验报告&#xff0c;适合C语言初学者们学习、练习。 编译器&#xff1a;gcc 10.3.0 ---- 注&#xff1a; 1.虽然课程名为C程序设计&#xff0c;但实际上当时校内该课的内容大部分其实都是C语言&#xff0c;C的元素最多可能只…

[转帖] 银河麒麟系统安全机制-KYSEC

https://zhuanlan.zhihu.com/p/349663329 麒麟系统为什么称为国内最安全的Linux系统?秘密就在于KYSEC,麒麟系统安全机制。一般情况下Linux下默认的接入控制是DAC,其特点是资源的拥有者可以对他进行任何操作(读、写、执行)。当一个进程准备操作资源时,Linux内核会比较进程…

[转帖]数据库系列之简要对比下GaussDB和OpenGauss数据库

https://blog.csdn.net/solihawk/article/details/134939941GaussDB作为一款企业级的数据库产品,和开源数据库OpenGauss之间又是什么样的关系,刚开始接触的时候是一头雾水,因此本文简要对比下二者的区别,以加深了解。 1、GaussDB和OpenGauss数据库简要对比 GaussDB是华为基…

分布式与一致性协议之CAP(二)

CAP CAP不可能三角 CAP不可能三角是指对于一个分布式系统而言&#xff0c;一致性、可用性、分区容错性指标不可兼得&#xff0c;只能从中选择两个&#xff0c; 如图所示。CAP不可能三角最初是埃里克布鲁尔(Eric Brewer)基于自己的工程实践提出的一个猜想&#xff0c;后被塞斯吉…

如何在CentOS搭建docker compose ui可视化工具并无公网IP远程管理容器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…