【胖虎的逆向之路】03——Android一代壳脱壳办法罗列实操

news2024/11/27 9:56:37

【胖虎的逆向之路】03——Android脱壳办法罗列&脱壳原理详解

【胖虎的逆向之路】01——动态加载和类加载机制详解
【胖虎的逆向之路】02——Android整体加壳原理详解&实现


文章目录

  • 【胖虎的逆向之路】03——Android脱壳办法罗列&脱壳原理详解
  • 前言
  • 一、主流脱壳方法
    • 1.工具脱壳法
      • 1) Frida-DexDump
      • 2) Fart
      • 3) Youpk
      • 4) 常用脱壳工具对比
    • 2.Hook脱壳法
    • 3.插桩脱壳法
    • 4.插桩脱壳法
    • 5.动态调试脱壳法
    • 6.特殊API调试法
  • 二、实验总结
  • 三、参考文献


前言

在上文中,我们讲解了关于Android整体加壳的原理和实际操作,现在我们来针对目前主流的脱壳工具以及流程进行讲解,由于作者能力有限,会尽力的详细描述 整体壳脱壳 的流程及原理,如本文中有任何错误,烦请指正,感谢~


一、主流脱壳方法

在这里插入图片描述

1.工具脱壳法

工具脱壳是指的利用现有的工具进行脱壳,很多的大佬已经开发了很多实用的工具,我们可以直接搞来使用(嘻嘻嘻)~

1) Frida-DexDump

得益于Frida, 在电脑上面进行内存搜索、转储的时候都变得十分方便,不再去通过繁琐的Xposed代码来获取Dex中对应的类与方法,仅需要关注如何去搜索想要的函数即可,对于完整的 dex,采用暴力搜索 dex035 即可找到。而对于抹头的 dex,通过匹配一些特征来找~

  • 支持模糊搜索断头dex(深度搜索模式)。
  • 兼容所有安卓版本(支持frida)。
  • 一键安装,无需修改系统,易于部署和使用

项目地址: https://github.com/hluwa/FRIDA-DEXDump

使用方法也变得简单很多,在这里借助一个大佬的使用流程图,可以快速进行脱壳
在这里插入图片描述

我们简单演示一下,这里结合objection一起使用
在这里插入图片描述
然后再次打开脱下来的dex,即可~

ps:获取到dex后,推荐使用Jadx进行反编译,dex2jar有点过时了…

另外附上深度介绍: 深入 FRIDA-DEXDump 中的矛与盾

2) Fart

Fart 的制作过程略显繁琐,主要是FART的代码是通过修改少量Android源码文件而成的,经过修改的Android源码编译成系统镜像,刷入手机,这样的手机启动后,针对Apk可以进行脱壳~
基于此,我更愿意称之为是脱壳鸡,因为是把经过修改的Android源码编译成了系统镜像,刷入了手机~

官方介绍:
ART环境下基于主动调用的自动化脱壳方案,基于Android 6.0实现,理论上可以移植到任何系统上~

项目地址:https://github.com/hanbinglengyue/FART

具体的实现原理和步骤在看雪:

  • 拨云见日:安卓APP脱壳的本质以及如何快速发现ART下的脱壳点
  • FART正餐前甜点:ART下几个通用简单高效的dump内存中dex方法
  • FART:ART环境下基于主动调用的自动化脱壳方案

脱壳流程:

1、安装待脱壳apk,并到设置中授予sd卡读写权限(否则dump下的文件无法写入到sdcard)

2、点击app图标,开始进入fart脱壳过程

接下来可以对logcat中的tag为ActivityThread的log进行过滤,等待待脱壳app进程出现"fart run over",此时fart主动调用过程结束。脱壳下来的

dex文件和函数体bin文件均在/sdcard/fart/app包名的目录下~

下面截图为fart的运行流程和脱壳结果
在这里插入图片描述

在这里插入图片描述

官方Ps:添加frida版的fart的两种不同实现,各有特色。可以实现具体到对某一个类下的所有函数甚至是对某一个函数的CodeItem的dump。需要的可以去体验下其强大的脱壳能力。(注意,测试环境为pixel Android8.0,frida-server 12.8.0)

在这里插入图片描述

3) Youpk

Youpk基于ART的主动调用的脱壳机,主要针对dex整体加固和各式各样的dex抽取加固,但是目前 Youpk 只支持 pixel 1代。所以必须需要 pixel 1代手机,而且需要刷入对应的系统~

基本流程如下:

  1. 从内存中dump DEX
  2. 构造完整调用链, 主动调用所有方法并dump CodeItem
  3. 合并 DEX, CodeItem

项目地址:https://github.com/youlor/unpacker

在该地址中,有较多的流程及方法、注意问题等,有需要的可以去看一哈

4) 常用脱壳工具对比

在这里插入图片描述

2.Hook脱壳法

我们上面有写到,只要函数中包含DexFile对象,其实就可以通过Hook拿到该对象,然后取到begin和size,从而进行脱壳,目前使用较多的Hook框架是Xposed和frida两种,感觉Frida使用人数较多也方便,在这里用frida进行演示~

首先使用GDA识别加壳程序~
在这里插入图片描述
看起来很明显是进行了整体加壳,有没其他加壳暂时不知道,我们先进行脱壳处理

首先找到脱壳点~

通过IDA打开libart.so,搜索DexFile,我们可以找到海量的脱壳点
在这里插入图片描述

然后我们编写hook脚本

在这里插入图片描述

这里之所以获取begin加上一个指针,是因为我们前面讲了dexfile含有一个虚函数地址,所以加上一个指针偏移

然后在手机中启动frida_server
在这里插入图片描述
附加进程进行dump,这里我们存在sdcard下面,所以需要提前赋予读写文件权限

在这里插入图片描述
从图中可以看得出来,到这里就已经脱壳成功~
在这里插入图片描述
然后使用jadx打开对应的dex,进行查看
在这里插入图片描述

此时说明我们整体脱壳成功,不过应用看起来还有抽取壳,抽取壳后续会单开一篇文章进行记录~

3.插桩脱壳法

插桩脱壳法,就是在Android源码里面定位到相应的脱壳点,然后插入相应的代码,重新编译源码生成系统镜像,最后就可以使用定制的系统进行脱壳~

其原理感觉跟youpk比较像,如何编译源码不再进行赘述,有需要的小伙伴可以看下这篇文章~
源码编译(1)——Android6.0源码编译详解

那么还是借助大佬已经完成的图片进行讲解,同理、还是定位脱壳点,我们还是随便定位一个脱壳点LoadMethod 然后进行插桩
在这里插入图片描述

//add
char dexfilepath[100]=0;
memset(dexfilepath,0,100);
sprintf(dexfilepath,"%d_%zu_LoadMethod.dex",getpid(),dex_file.Size());
int dexfd = open(dexfilepathm,O_CREAT|O_RDWR,666);
if(dexfd>0){
    int result = write(dexfd,dex_file.Begin(),dex_file.Size());
    if(result>0){
        close(dexfd);
        LOG(WARNING)<<"LoadMethod"<<dexfilepath;
    }
 
}
//add

同理我们在execute同样插桩此段代码,最后进行编译,编译成功

在这里插入图片描述
然后给程序授权sdcard权限,再次启动应用,就可以看见脱取的dex文件就保存在sdcard目录下

然后在使用jadx,打开dex,就会得到跟上面一样的结果~

在这里插入图片描述
Ps:由于该方法需要进行Android源码修改编译,本文作者没有进行实现,若有任何问题欢迎随时沟通(有问题了我再去编译)

4.插桩脱壳法

反射脱壳我自己的理解是利用反射得到一系列的classloader,最后得到DexFile结构,然后获取变量mCookie&mFileName这两个属性后,得到dexFile内存指针,然后该指针转换为dexfile,再通过findClassDef来匹配寻找的dex,最后dump写入文件~
借助前人的总结,流程如下:

在这里插入图片描述
那么还是做一下演示~
mCookie是在native层的dexfile的指针,然后我们利用反射原理来获取到mCookie,就可以进行脱壳了,在这里还是使用frida进行代码演示~

编写hook代码ing

在这里插入图片描述
打印出相关值

在这里插入图片描述
就可以看到相同大小的dex
在这里插入图片描述

然后使用jadx打开,发现同样的界面又出现了!

在这里插入图片描述

5.动态调试脱壳法

动态调试法,其核心原理还是要得到DexFile的起始地址和大小,不过所有的方式不同, 如果说上面是针对代码做修改得到一些值,那么接下来就是利用IDA工具获取对应的起始地址和大小,然后再通过脚本进行dump~

请欣赏!
首先选一个脱壳点,我们还是选择DexFile::DexFile
在这里插入图片描述
然后手机启动android_servcer,记得要以Root启动
在这里插入图片描述
然后使用IDA进行附加进程
在这里插入图片描述

在这里插入图片描述

然后ida开始介入
在这里插入图片描述
然后我们打开libart.so,并定位到DexFile::DexFile

在这里插入图片描述
然后在该函数下断点,然后F9过来看一哈

在这里插入图片描述
在这里就可以很明显看到X1就是DexFile的起始地址,X4是偏移值

然后利用Frida进行dump~

在这里插入图片描述
直接运行run即可
在这里插入图片描述
然后使用gda查看本地的dump.dex文件

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

可以发现这里竟然是代理类,对比大小不是我们想要的dex,再来一遍F9,可以看到地址再次改变,再次结合长度来计算,试了几次还是没有出来,后来就没有在进行了,不过感觉是可以得出来的,作为演示没有废太多的功夫~

6.特殊API调试法

特殊API调试意思是指的通过Android系统提供的API方法,来获取Dex,在Android 7.0 及以下系统提供了getDex及getBytes这两个API,所以如果我们想要获取对象,可以直接调用这两个API~

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

但是在实际测试中,发现在Android 高版本中Dex的getBytes方法依然存在,但是核心的Class类中的getDex方法已经消失不见了~

编写hook代码:

在这里插入图片描述

操作流程:

在这里插入图片描述
然后我们查看程序的类对象,随便dump一个类对象

在这里插入图片描述
在这里插入图片描述
得到dex之后,我们再次使用jadx工具打开~

在这里插入图片描述

发现就可以成功的dump~

二、实验总结

本文总结了当下dex整体加壳的常用的一些脱壳方案,并进行复现,但是在这里仅作为实验加深自己的理解为主(目前也不会这么简单的就可以拿到源Dex)但是有兴趣的朋友可以像我一样去把整个流程走一遍,加深自己的理解~

三、参考文献

https://bbs.kanxue.com/thread-273293.htm#msg_header_h2_6

文中所述图片部分取自该文章,栓Q~

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

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

相关文章

uefi和legacy的区别对比

legacy&#xff1a;[ˈleɡəsi]&#xff0c;遗产、遗留。 uefi&#xff1a;Unified Extensible Firmware Interface&#xff0c;统一可扩展固件接口。 当我们自己重装或安装操作系统的时候&#xff0c;可能会遇到硬盘的uefi和legacy两种&#xff0c;不过大多数人并不知道uefi和…

低代码开发前景如何?大家都真的看好低代码开发吗?

栖低代码开发前景如何&#xff0c;大家都真的看好低代码开发吗&#xff1f;之前有些过很多关于低代码的内容&#xff0c;这篇就来梳理下国内外低代码开发平台发展现状及前景。 关于低代码解读看这篇>> 什么是低代码&#xff08;Low-Code&#xff09;&#xff1f; 关于低…

SpreadJS.Release.16.0.2 Crack by Xacker

SpreadJS拥有 500 多个 Excel 函数的世界销量第一的 JavaScript 电子表格 快速提供真正类似 Excel 的电子表格体验 - 对 Excel 零依赖。创建财务应用程序&#xff0c;仪表板,图表,数据透视表,性能基准,科学实验室笔记本&#xff0c;以及其他类似的 JavaScript 电子表格应用程序…

77. 语言模型以及代码实现

1. 语言模型 给定文本序列 x1,…,xT,语言模型的目标是估计联合概率p&#xff08;x1,…,xT&#xff09;它的应用包括 做预训练模型&#xff08;eg BERT&#xff0c;GPT-3&#xff09;生成文本&#xff0c;给定前面几个词&#xff0c;不断使用xt~p(x1,…,xt-1) 来生成后续文本判…

CSS选择器整理学习(上)

在前端项目开发中&#xff0c;有时候需要对特殊的元素进行特殊的处理&#xff0c;但有时候元素的位置不确定、层级不确定、数量不确定等问题&#xff0c;导致我们没办法进行元素的选择&#xff0c;这个时候我们就需要用到元素选择器了。 一、CSS选择器 1、.class 选择器例子…

图像处理解决流程--外观检测

一、图像外观检测和面积计算 1、获取标准图像&#xff0c;提取要测定的区域&#xff08;截取成多个ROI&#xff09; 2、将目标图像的位置进行平移和旋转&#xff08;将目标图像和标准图像进行重叠&#xff09; 3、根据标准图像的区域进行以此计算目标图像的信息 4、判断统计 二…

Ajax基础

Ajax 是 Asynchronous JavaScript and XML&#xff08;异步 JavaScript 和 XML&#xff09;的简写 Ajax 中的异步&#xff1a;可以异步地向服务器发送请求&#xff0c;在等待响应的过程中&#xff0c;不会阻塞当前页面&#xff0c;浏览器可以做自己的事情。直到成功获取响应后…

Maven高级进阶

文章目录1&#xff0c;分模块开发1.1 分模块开发设计1.2 分模块开发实现1.2.1 环境准备1.2.2 抽取domain层步骤1:创建新模块步骤2:项目中创建domain包步骤3:删除原项目中的domain包步骤4:建立依赖关系步骤5:编译maven_02_ssm项目步骤6:将项目安装本地仓库1.2.3 抽取Dao层步骤1:…

iOS vue devtools工具的手把手安装,及Vue.js not detected的解决

使用vue插件Vue.js devtools 一.通过谷歌商店直接下载&#xff08;要翻墙&#xff09; 二.不翻墙的方法&#xff1a; 1.官网下载 git地址&#xff1a;https://github.com/vuejs/devtools git clone https://github.com/vuejs/devtools2.完成后命令行里切到该目录下&#x…

AppScan绕过登录验证码深入扫描

系列文章 AppScan介绍和安装 AppScan 扫描web应用程序 AppScan被动手动探索扫描 第四节-绕过登录验证码深入扫描 我们工作中最长碰到的工作场景是网站采用https协议&#xff0c;这时我们要用appScan进行扫描时&#xff0c;就需要先安装证书 1.证书安装 1.新建一个文件&…

渗透测试— —扫描与爆破账号

渗透测试— —扫描与爆破靶机账号 1 扫描与爆破账号流程 注意&#xff1a;仅用于教学与实验&#xff0c;不能用于攻击&#xff0c;否则后果自负 扫描&#xff1a;主机探测与端口扫描。&#xff08;主机探测&#xff1a;目标主机是存活&#xff0c;端口扫描&#xff1a;在线主…

总结 62 种在深度学习中的数据增强方式

数据增强 数据增强通常是依赖从现有数据生成新的数据样本来人为地增加数据量的过程 这包括对数据进行不同方向的扰动处理 或使用深度学习模型在原始数据的潜在空间(latent space)中生成新数据点从而人为的扩充新的数据集 这里我们需要区分两个概念&#xff0c;即增强数据和…

SpringBoot的filter过滤器

SpringBoot的filter过滤器 目录SpringBoot的filter过滤器一、过滤器的作用和概述1.1 简述1.2 使用场景二、自定义过滤的两种方式2.1 第一种方式2.1.1 启动类增加注解ServletComponentScan2.1.2 定义一个filter类2.1.3. 测试2.2 第二种方式2.2.1 自定义fitler类2.2.4 在启动类中…

《Linux Shell脚本攻略》学习笔记-第五章

5.1 简介 借助HTTP协议所提供的功能以及命令行实用工具&#xff0c;我们可以用脚本满足大量的web自动化需求。 5.2 web页面下载 wget是一个用于文件下载的命令行工具&#xff0c;选项繁多且用法灵活。 下载单个文件或web页面 指定从多个URL处进行下载 我们可以通过选项-O指定输…

centos上用nginx搭建简单的点播服务器

查看centos系统信息&#xff1a;cat /etc/centos-release配置服务器DNSecho "nameserver 114.114.114.114" >> /etc/resolv.conf 安装网络工具yum install ntpdate wget net-tools -y同步服务器时间ntpdate ntp.aliyun.com安装编译工具及依赖库yum install -y …

【原生Button和antd的Button】

1. 原生Button 1. form 与按钮所关联的form元素。此属性的值必须是同一文档中form的id。如果未设置此属性&#xff0c;则 < Button>与其祖先< form>元素相关联 此属性允许将< Button>元素关联到文档中的任意位置< form>&#xff0c;而不仅仅是< …

Jenkins配置邮箱接收构建通知

Jenkins配置邮箱接收构建通知1、开启163邮箱的POP3/SMTP服务2、配置Jenkins Location3、配置Extended E-mail Notification4、配置邮件通知选项5、任务中配置6、任务构建测试7、怎么同时给多人发邮件1、开启163邮箱的POP3/SMTP服务 这里我们用163邮箱当作发件方&#xff0c;qq邮…

aloam学习笔记(四)

对于laserMapping.cpp源码的学习&#xff0c;这部分的主要功能是接受前端传来的数据&#xff0c;构建地图。 一、main函数部分 ros::init(argc, argv, "laserMapping");ros::NodeHandle nh;float lineRes 0;float planeRes 0;nh.param<float>("mapping…

前端食堂技术周刊第 67 期:2022 State of JS、ESLint 2022、pnpm 2022、大淘宝 Web 端技术概览

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;东北大饭包 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 本期摘要 2022 State of JS 结果出炉ESLint 2022 年终总结pnpm 2022 年终总结大淘…

Win10注册表损坏进不了系统怎么U盘重装系统?

Win10注册表损坏进不了系统怎么U盘重装系统&#xff1f;有用户电脑提示注册表损坏&#xff0c;自己进行了系统的重新启动之后&#xff0c;遇到了电脑无法正常启动进行系统桌面的情况。那么遇到这样的情况&#xff0c;我们怎么去进行U盘重装系统呢&#xff1f;一起来看看具体的操…