从Android运行时出发,打造我们的脱壳神器

绿联NAS使用docker部署immich【pro系统】 随后去绿联你想要存放immich的地方创建一个文件夹,便于区分,如图,我创建了一个immich的文件夹。1.进入文件夹后面是有斜杠的(tips:只需要敲击前面几个字母,按tab键自动补全)cd:进入路径,1.可以是当前的下一层相对路径 2.也可以是完整的全路径。前言:好像没有绿联的教程,刚好自己也有需求,就顺便记录了。如果你的挂载实战情况比较复杂,接下来是喂到胃里的知识点。】下载文件(群晖的,别慌,能用),两份,红框的就是。首先,没什么好说的,去immich官网【点击1.终端,2.新增,3.确定。 阅读详情

原文地址: http://drops.wooyun.org/tips/9335

0x00 前言


之前对Android的两个运行时的源码做了一些研究,又加上如火如荼的Android加固服务的兴起,便产生了打造一个用于脱壳的运行时,于是便有了DexHunter的诞生(源码:https://github.com/zyq8709/DexHunter/)。今天,我就通过这篇小文聊聊我的一些简单的思路,供大家参考和讨论。

0x02 相关机制


首先,先来看一看Android运行时的一些相关机制,看看我们来怎么搞。

首当其冲,要脱壳少不了研究一下Dex文件的格式,这一点Android的官方文档写的已经很清晰了,我这里就简单再提一下。整个结构便如图1所示:

图1 Dex文件结构

其实就是分区段存储不同的内容,在头部里有指向各个区段起始的偏移值。当然我们最关心的就是class_defs和data这两个段了。

class_defs包含了所有的类,用class_def_item来描述。图2是对class_def_item展开的一个示意图:

图2 class_def_item结构

每个class_def_item指向一个class_data_item,每个class_data_item 包含了一个class的数据,每个方法用encoded_method结构来描述,它又指向了一个code_item,这个里面就保存着一个方法的所有指令。

对于ART下,安装后的dex文件会被编译为oat文件,这个oat文件其实是一个ELF文件,图3是它的一个结构:

图3 OAT文件结构

其中可以看到oatdata指向的部分包含了原有的Dex文件,这个是我们的目标。当然oatexec指向了编译后的ARM指令,但是对于我们暂时来说没有什么卵用。

0x03 四个时机


为了脱壳,我们要建立一个概念,就是“时机”。对于非虚拟机壳,从内存中转储是一个最为有效和统用的技巧,那么就必须要找到一个时机,保证内存中的数据是完全正确的。

在Android中呢,便有这么四个时机:

  1. 打开Dex文件

    就是把APK中的dex文件提取并做cache,那么最终打开的其实是odex或oat文件;

  2. 加载Class

    运行时读取存储在Dex中的每个class,并用来填充一个生成的Class对象,其中包含了class的所有成员,这样一个class才能被使用;图4表示了ART和DVM下的Class对象的结构

    图4 Class的结构

  3. 初始化Class

    如果一个class有static块,那么这个部分就会编译为类的初始化器,具体看说就是方法,在class真正需要被使用的时候就会执行它,当然,壳就可以利用它来做许多事情;

  4. 调用具体的方法

    不用多说,就是根据生成的Class对象查找到具体的代码指令并执行了。

0x04 两种加载


好,那我们怎么做呢?很简单,我们就从类的加载开始。

总的来说,有两种可以加载类的方法,一个是显示加载,主要用于反射,就是通过调用Class.forName()或ClassLoader.loadClass()方法来主动加载一个类;另一个是隐式加载,主要是通过创建第一个class的实例或在类产生前访问静态成员时发生。这些操作的背后在运行时中是有相应的函数来真正完成的。

在ART中:

显式加载:

ClassLoader.loadClass 对应DexFile_defineClassNative

Class.forName 对应Class_classForName

隐式加载:

对应artAllocObjectFromCode

图5表述了这个关系:

图5 ART中的实现

在DVM中:

显式加载:

ClassLoader.loadClass对应Dalvik_dalvik_system_DexFile_defineClassNative

Class.forName对应Dalvik_java_lang_Class_classForName

隐式加载:

对应dvmResolveClass

图6是DVM中的实现表示:

图6 DVM中的实现

0x05 开始修改


很清晰看到,我们找到了关键点,在ART中是DefineClass,DVM中是Dalvik_dalvik_system_DexFile_defineClassNative,我们就从这里动手,主要的修改就发生在这里。简单地说就是主动地一次性加载并初始化所有的类。

这样做是隐含了几条原则的:

  • 当类被加载时,dex中对应的部分必须有效;
  • 类初始化的时候,dex中的内容包括生成的Class对象是可以被修改的;
  • 只有在执行一个方法时,才要求code_item是有效的。

图7就是DexHunter的一个工作流程:

图7 DexHunter原理

下面就分这几个步骤来说:

(1) 定位内存

对于之前提到的入口函数,都有一个参数表示在操作的文件。

ART中,这个参数是DexFile对象,其中有一个location_成员,是一个字符串,可以简单的理解为此文件的路径。那么DVM中是DexOrJar,相对的字符串成员是fileName。这下我们就好整了,只要我们指定了目标字符串,我们就可以从可能使用的众多dex文件中找出我们想要的那个,而且方便的是,通过这两个对象,我们还能很容易找到操作的文件在内存中的起始地址和长度。

(2) 主动加载并初始化

这个就是遍历dex文件中class_defs区段里每一个class_def_item,并逐一加载和初始化,在ART里我们使用FindClass函数来加载类,EnsureInitialized进行初始化;在DVM中用dvmDefineClass加载,dvmIsClassInitialized 和dvmInitClass来初始化。

(3) 转储并自动修复

最后就是真正抓取dex了。把dex分为三部分:

  • Part 1: class_defs之前的内容
  • Part 2: class_defs段
  • Part 3: class_defs后边的部分

我们把Part 1存在part1文件里,Part 3存在data文件中,Part 2先不要急。

现在我们要解析class_defs的东东了。不整代码了,用文字简单来说,就是模仿Android的过程,我们把每个class_data_item解码为内存中的对象(有LEB128编码),便于我们的修复。

下边就要进行一些判断看需不需要修复:

看class_def_item中的 class_data_off是不是在之前拿到的dex文件的内存范围内,如果跑出去了,就需要把这个类的class_data_item给放到dex尾部去,修改class_def_item并保存。

比较解析出来的accessflag、codeoff和运行时生成的方法对象的accessflag、codeoff,如果不一致,以运行时中的为准,并修改保存。

同样,检查code_item_off是否出界了,一旦出界,把code_item收回来,继续向尾部添加,并修改class_def_item的相关内容重新保存。

当然了,所谓放到尾部,只是先保证偏移值从尾部开始的,真正的内容先存在extra文件了。被修改过的class_defs段,就保存在classdef文件中了。

然后我们把四个文件重新拼起来,就得到原始的dex或odex了。

0x06 有趣的现象


最后聊一下我们看到的一些有趣的现象。

360基本上是把原始的dex加密存在了一个so中,加载之前解密。

阿里把一些class_data_item和code_item拆出去了,打开dex时会修复之间的关系。同时一些annotation_off是无效的的来防止静态解析。

百度是把一些class_data_item拆走了,与阿里很像,同时它还会抹去dex文件的头部;它也会选择个别方法重新包装,达到调用前还原,调用后抹去的效果。我们可以通过对DoInvoke (ART)和dvmMterp_invokeMethod (DVM)监控来获取到相关代码。

梆梆和爱加密与360的做法很像,梆梆把一堆read,write, mmap等libc函数hook了,防止读取相关dex的区域,爱加密的字符串会变,但是只是文件名变目录不变。

腾讯针对于被保护的类或方法造了一个假的class_data_item,不包含被保护的内容。真正的class_data_item会在运行的时候释放并连接上去,但是code_item却始终存在于dex文件里,它用无效数据填充annotation_off和debug_info_off来实现干扰反编译。

0x07 参考


https://source.android.com/devices/tech/dalvik/dex-format.html
/libcore/libart/src/main/java/java/lang/ClassLoader.java
/libcore/libdvm/src/main/java/java/lang/ClassLoader.java
/libcore/dalvik/src/main/java/dalvik/system/DexClassLoader.java
/libcore/dalvik/src/main/java/dalvik/system/PathClassLoader.java
https://github.com/anestisb/oatdump_plus#dalvik-opcode-changes-in-art
避坑指南:C# OpenCvSharp调用4K摄像头常见的5个问题及解决方案 本文针对C# OpenCvSharp调用4K高清摄像头时常见的五大难题,提供了详细的解决方案。内容涵盖分辨率设置失效、帧率卡顿、内存泄漏、硬件驱动兼容性以及性能优化实战,帮助开发者高效稳定地处理4K视频流,提升智能安防监控等项目的开发效率。 阅读详情

相关推荐

从零到一:Abaqus与Matlab联合仿真的自动化流程构建指南

本文详细介绍了如何构建Abaqus与Matlab联合仿真的自动化流程,涵盖基础架构设计、关键接口技术实现、结果提取与处理技术以及高级参数化优化流程。通过Python脚本作为桥梁,实现数据传递和任务控制,帮助工程师提升仿真效率。特别强调了版本兼容性、异常处理和性能监控等实用技巧。

weixin_29090089的博客 610

DexHunter

从Android运行时出发,打造我们的脱壳神器https://juejin.im/post/5aa117e9f265da23945f0f0e DexHunter的原理分析和使用说明(一)https://blog.youkuaiyun.com/QQ1084283172/article/details/53710357 DexHunter的原理分析和使用说明(二)https://blog.csdn.ne...

zhangmiaoping23的专栏 780

别再为reg2icg的setup违例头疼了!手把手教你用ICC2/Innovus这3招搞定(附实战数据对比)

本文详细介绍了在ICC2/Innovus中解决reg2icg的setup违例的三种高效方法,包括早期时钟树预估、精准控制时钟延迟与门控检查以及ICG专用优化选项组合。通过实战数据对比,展示了不同策略的效果差异,帮助工程师快速优化时序路径,提升芯片性能。

weixin_42569329的博客 404

DexHunter:Android逆向工程的新锐工具

DexHunter:Android逆向工程的新锐工具 项目简介 是一个强大的Android应用逆向工程工具,由开发者Mufanc创建并维护。该项目旨在为安全研究人员、软件开发人员和安卓应用审计者提供方便的Dalvik字节码静态分析和动态调试支持。 技术分析 DexHunter 结合了多种高级特性: 多格式支持:不仅处理原始的.dex文件,还能够处理APK、AAB(Android App Bun...

gitblog_00047的博客 624

ArcGIS Maps SDK for Unity实战:把真实世界地形‘搬进’游戏场景的保姆级教程

本文详细介绍了如何使用ArcGIS Maps SDK for Unity将真实世界地形导入游戏场景的完整流程。从高程数据获取、TPKX格式转换到Unity中的地形集成与优化,提供了保姆级教程,帮助开发者快速实现高精度地形建模,特别适用于开放世界游戏和数字孪生项目。

weixin_30621465的博客 345

手把手教你用VM实现欧姆龙PLC数据采集(含Fins协议配置详解)

本文详细介绍了如何使用VM(VisionMaster)实现与欧姆龙PLC的数据采集,重点解析了Fins协议(包括Fins TCP/UDP)的配置步骤。从网络环境搭建、PLC的IP地址设置,到VM端Fins通讯通道的详细配置与数据点映射,提供了完整的实战指南。文章还涵盖了数据收发解析、常见问题排查清单,帮助工程师快速完成视觉系统与PLC的稳定集成。

weixin_29171087的博客 188

DexHunter的原理分析和使用说明(一)

Android通用脱壳工具DexHunter是2015年下半年,大牛 zyqqyz最先在看雪论坛放出来的,见《Android dex文件通用自动脱壳器》这篇文章的说明。作者 zyqqyz在放出DexHunter通用脱壳工具代码的同时还专门在乌云网站上写了一篇文章《 从Android运行时出发,打造我们的脱壳神器》,更详细的对DexHunter通用脱壳工具的原理进行了详细的说明。当时看了几遍作者

Fly20141201. 的专栏 1万+

金蝶个版本下载地址,记得保存收藏。

专业版 V10.0 http://downloads.cmcloud.cn/kis/kis_pro/10.0/kiszybV10sp1.rar V11.0 http://downloads.cmcloud.cn/kis/kis_pro/11.0/KISV11Setup.rar V12.0 http://dow...

饺子的博客 2491

【亲测免费】 探秘DexHunter:安卓应用加固解密利器

DexHunter,一个自动解压加固DEX文件的神器,源自对Android运行时源码的深度改造。这个项目旨在帮助开发者和安全研究者绕过复杂的安卓应用保护机制,提取出隐藏在打包应用内的原始代码。DexHunter由修改后的ART和DVM运行时组成,适用于Android 4.4.3版本。 ### 项目技术分析 DexHunter的核心在于其对Android系统运行时的定制。它利用了对`class_...

gitblog_00021的博客 889

AI漫剧全套万能提示词合集

今天给大家整理一套已经跑通爆款漫剧的万能提示词库!覆盖:豆包剧本人设词 + 分镜生成词 + 即梦绘图词 + 动态优化词 + 防翻车固定词直接复制粘贴,新手也能做出稳定、高清、统一、有质感的AI漫剧!你是资深短视频漫剧编剧,擅长制作60秒竖屏爆款AI漫剧,请为我创作一集完整漫剧内容。要求:开头3秒高能抓眼,中段有冲突转折,结尾留强悬念钩子,节奏紧凑、适合短视频流量。首先生成固定统一人物人设:包含脸型、五官、发色、发型、穿搭、身材、气质、画风、光影细节,要求足够精细,保证全程角色不变脸。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 1853

从模糊到清晰:让AI教相机自动对焦的实战指南

AI自动对焦技术:让模糊照片成为过去式 深度学习驱动的自动对焦技术正颠覆传统摄影,使相机能在复杂场景下智能锁定焦点。相比传统对焦方法在弱光、低对比度环境下的失效,AI通过学习"清晰-模糊"规律,实现全场景精准对焦。本文详细解析了该技术的三大优势: 自适应各种光线条件; 毫秒级对焦速度; 突破物理限制的精度。 通过PyTorch搭建的CNN模型,展示了从数据采集到模型训练的全流程实战方案,包括使用拉普拉斯算子评估图像清晰度等关键技术。该技术已成功应用于手机摄影、工业检测、无人机航拍和安防监

LXY_LOVE36的博客 346

从Android运行时出发,打造我们的脱壳神器 - zyq8709--dexhunter(二代抽取壳)

转:http://www.vuln.cn/6683 原文地址:http://drops.wooyun.org/tips/9335 0×00 前言 之前对Android的两个运行时的源码做了一些研究,又加上如火如荼的Android加固服务的兴起,便产生了打造一个用于脱壳的运行时,于是便有了DexHunter的诞生(源码:https://github.com/zyq8709/DexHunt...

zhangmiaoping23的专栏 1217

数据科学技术与应用【中国大学MOOC】:数据可视化_第五次作业_答案

数据科学技术与应用 数据可视化 第五次作业 答案 题目来源:中国大学MOOC-东华大学-宋晖等-数据科学技术与应用 1 ( 30分 ) 2012—2017年我国人均可支配收入为[1.47, 1.62, 1.78, 1.94, 2.38, 2.60](单位:万元)。按照要求绘制以下图形。 1)模仿例4-1和例4-3,绘制人均可支配收入折线图。用小矩形标记数据点,黑色虚线,用注解标注最高点,图标题为“Income chart”,设置坐标轴标题,最后将图形保存为JPG文件。 2)模仿例4-2,使用多个子图分别绘制

Herbert胡不归 6140

终极Android脱壳神器:BlackDex一键破解5.0-12版本APK全攻略

BlackDex是一款专为Android逆向工程师和开发者打造的脱壳工具,支持Android 5.0至12全版本系统,无需复杂环境配置即可快速对APK文件进行脱壳处理。无论是学习Android应用开发还是进行安全分析,这款工具都能帮助你轻松获取应用的原始代码,是移动安全领域不可或缺的实用工具。 ## 🚀 为什么选择BlackDex?三大核心优势解析 ### 1. 全版本覆盖,无需Root权限

gitblog_01184的博客 2172

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

DexHunter脱壳神器分析

0x00 这篇文章我们分析Android脱壳神器DexHunter的源码。DexHunter作者也写了一篇介绍它的文章从Android执行时出发。打造我们的脱壳神器。DexHunter源码位于https://github.com/zyq8709/DexHunter。 0x01 DexHunter 实现中,仅仅须要改动一处文件:dalvik\vm\native\dalv...

weixin_30908941的博客 101

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

易开发(DeveloperHelper)完全指南:一站式Android开发效率神器,支持界面分析与脱壳

易开发(DeveloperHelper)是一款专为Android开发者打造的一站式开发效率工具,集成了界面分析、页面信息查看、加固脱壳等核心功能,完美支持Android 9.0系统,帮助开发者快速解决开发过程中的各种难题。 ## 🌟 核心功能解析 ### 📱 界面分析与布局查看 易开发提供强大的界面分析能力,通过无障碍服务获取应用界面结构。当无障碍辅助功能开启后,开发者可以实时查看当前页面

gitblog_00628的博客 597

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android安卓逆向开发成长大纲

安卓逆向基础课程 第一章:Android Java 逆向基础 第二章:Android Hook 插件开发 第三章:阶段考核 第四章:Android 系统编译 第五章:Android arm native 逆向 第六章:Android 应用初步编程保护 第七章:Android 应用脱壳 安卓逆向进阶篇 287775944 ...

zh739115743的专栏 403

Dexhuner学习笔记

dex不落地加载

inquisiter 290

2018i春秋 零基础入门Android(安卓)逆向

教程目录: 第一章:Android JAVA 逆向基础 课时1 :Android环境配置与常用工具介绍   课时2 :调试方法及Smali文件结构 课时3 :新版本调试方法及Smali函数文件修改 实验3 新版本调试方法及Smali函数文件修改  课时4 :JD-Gui进行代码快速阅读分析 课时5 :实战演练如何去去除应用中的广告 课时6 :分析神器JEB使用方法 课时7 :常用Android快速...

mrhanyufei0的博客 1847

2019最新某 I春秋零基础入门Android安卓逆向课程

课程目录:第一章:Android Java 逆向基础课时1 :Android环境配置与常用工具介绍 课时2 :调试方法及Smali文件结构课时3 :新版本调试方法及Smali函数文件修改实验3 新版本调试方法及Smali函数文件修改课时4 :JD-Gui进行代码快速阅读分析课时5 :实战演练如何去去除应用中的广告课时6 :分析神器JEB使用方法课时7 :常用Android快速定位关键点方法介绍实验...

zjy0426的博客 1533

【备忘】零基础入门Android(安卓)逆向视频

百度网盘├─第一章:Android java 逆向基础4│ 课时1 Android环境配置与常用工具介绍.mp4│ 课时2 调试方法及Smali文件结构.mp4│ 课时3 新版本调试方法及Smali函数文件修改.mp4│ 课时4 JD-Gui进行代码快速阅读分析.mp4│ 课时5 实战演练如何去去除应用中的广告.mp4│...

weixin_34221112的博客 549
上一篇: Android Hook (2) Java2java
下一篇: 支付漏洞总结 / 在线支付流程安全分析
Omni-Space
博客等级 码龄11年 2158粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值