Dex文件混淆(一):BlackObfuscator
Dex文件混淆(一):BlackObfuscator
首发地址:http://zhuoyue360.com/crack/105.html
文章目录
- Dex文件混淆(一):BlackObfuscator
- 1. 前言
- 2.小试牛刀
- 3. 参考学习
- 1. dex2jar源码简析
- 2. BlackObfuscator简析
- 1. 控制流平坦化
- 1. 控制流平坦化基本介绍
- 2. Dex解析
- 3. YPObfuscator制作
- 1. 祖安混淆(娱乐)
- 4.定制修改
- 5. 总结
1. 前言
由于工作需要,最近有比较多的需求需要我研究应用的保护手段。但是我本身又没有做个代码保护 相关的经验。最快的学习手段是参考前人优秀的项目进行学习。所以,我们今天的主角是 BlackObfuscator
https://github.com/CodingGay/BlackObfuscator
2.小试牛刀
使用AndroidStudio打开工程,运行main/src/main/java/Main
public class Main {public static void main(String[] args) {System.out.println("Hello Black");BlackObfuscatorCmd.main("d2j-black-obfuscator","-d", "2","-i", "testDir/classes.dex","-o", "testDir/classes_out.dex","-a", "filter.txt");}
}
filter.txt内容
#it is annotation
#cn.kaicity#class
#cn.kaicity.gk.cdk.BuildConfig#package
com.alipay.sdk.pay.demo#blackList
!cn.kaicity.gk.cdk#blackList中的包或者类不会进行混淆
运行完成以后,看到了classes_out.dex 文件

使用jadx反编译原版classes.dex 和通过Ob混淆后的dex文件classes_out.dex .
可以看到下图的效果非常的恶心.效果也很好,那么我们进入源码的分析学习阶段.

3. 参考学习
由于该项目是由dex2jar的修改版,我们要把它全部实现一遍,所以我们需要对它进行从0-1 的复现
1. dex2jar源码简析
为了更好的理解,我们有必要对dex2jar的源码进行研究.
https://github.com/pxb1988/dex2jar
https://blog.csdn.net/new_abc/article/details/53742436
2. BlackObfuscator简析
https://blog.niunaijun.top/index.php/archives/35.html
1. 控制流平坦化
由于原作者的介绍较为简单,同时自己对这些混淆手段也不是特别清楚,只是知道有这么一个东西. 所以这边在其他地方查阅一些资料,补充下基础的理论知识.
1. 控制流平坦化基本介绍
控制流平坦化是指将正常程序控制流中基本块之间的跳转关练删除,用一个集中的主分发块来调度基本块的执行顺序。相当于把原有程序正常的逻辑改为一个循环嵌套一个switch的逻辑。
正常情况:

控制流平坦化之后:

控制流平坦化的基本结构如下:

- 入口块:进入函数第一个执行的基本块
- 分发块:负责跳转到下一个要执行的原基本块
- 原基本块:混淆之前的基本块,实际完成程序工作的基本块
- 返回块:返回到主分发块
修改了程序的控制流,导致逆向分析人员不容易直接的理清程序执行流程,增加分析难度。
2. Dex解析
提取出关键Dex为 {timestamp} + split.dex . 它是由DexLib2Utils.splitDex(input.toFile(), splitDex, whileList, blackList); 实现的.

分割完Dex以后,程序就进入了第一个核心内容
new Dex2jarCmd(new ObfuscatorConfiguration() {@Overridepublic int getObfDepth() {return depth;}}).doMain("-f", splitDex.getPath(), "-o", tempJar.toString());
convert -> reBuildInstructions -> IRObfuscator.get(obf).reBuildInstructions(ir);
public void ir2j(IrMethod irMethod, MethodVisitor mv, ClzCtx clzCtx) {new IR2JConverter().optimizeSynchronized(0 != (V3.OPTIMIZE_SYNCHRONIZED & v3Config)).clzCtx(clzCtx).ir(irMethod).asm(mv).obf(obfuscatorConfiguration).convert();
}
- ir.stmts : 方法主要的IR指令
- chain.reBuildEnd : 混淆的主要方法. 这里会走到各个混淆的真正实现的地方.
for (ObfuscatorChain chain : chains) {for (int i = 0; i < configuration.getObfDepth(); i++) {List<Stmt> newStmts = new ArrayList<>();List<Stmt> origStmts = new ArrayList<>();for (Stmt value : ir.stmts) {origStmts.add(value);}RebuildIfResult rebuildIfResult;for (Stmt stmt : ir.stmts) {if (chain.canHandle(ir, stmt)) {rebuildIfResult = chain.reBuild(ir, stmt, origStmts);if (rebuildIfResult != null) {newStmts.addAll(rebuildIfResult.getResult());}} else {newStmts.add(stmt);}}chain.reBuildEnd(ir, newStmts, origStmts);ir.stmts.clear();ir.stmts.addAll(newStmts);if (!chain.canDepth()) {break;}}
}
3. YPObfuscator制作
1. 祖安混淆(娱乐)

祖安混淆主要来源于这位哥.在群里面说了一声,骂人混淆 == 祖安混淆. 那么经过对BlackObfuscator的简单查阅后,发现了一个ObfDic.java文件,里面存放的内容就是混淆的字典,我们稍微的修改修改
public static String[] dic =("小\n胖\nYP\nfont\na\nb\nc\nd\n白\n树\n海\n小\n坤\n坤\n坤\n操你妈\n反编译你妈死了\n草你妈隔壁\n回头是岸\n车公庙\n反编译\n逆向\n编辑框\nab\ncccccccc\ndakakk\nasjdajdj\nasdjawlk1j\nq\nmmm\nsdasd\nnnnn\n坤哥牛逼\n花花\n王旺\n反编译哈哈哈\n你破解不了的\n嘻嘻嘻拜拜\n芜湖\nggggg").split("\n");
然后就成果了~ 成果的问候了各位逆向工作者,无恶意无恶意!

4.定制修改
5. 总结
相关文章:
Dex文件混淆(一):BlackObfuscator
Dex文件混淆(一):BlackObfuscator 首发地址:http://zhuoyue360.com/crack/105.html 文章目录 Dex文件混淆(一):BlackObfuscator1. 前言2.小试牛刀3. 参考学习1. dex2jar源码简析2. BlackObfuscator简析1. 控制流平坦化1. 控制流平坦化基本介绍 2. Dex解析…...
Linux下编译arm 32 出错(/bin/bash: arm-none-linux-gnueabi-gcc: command not found )
一、arm-none-linux-gnueabi-gcc不能再64位系统下下编译ARM的32位库的问题解决方法如下: sudo apt-get install lib32stdc6 sudo apt-get install lib32ncurses5 sudo apt-get install lib32z1 二、交叉编译工具没有写入环境变量或写错,重新写入环境变量…...
最近遇到的两个小问题总结:git问题和node问题
这两个问题都是我帮别人看问题的解决的,在windows系统上遇到的: 1、git没有配置全局变量 在使用git的时候,报’git‘不是内部或外部命令,也不是可运行的程序。然后再在其他文件下面试一下(git --version)…...
Java # Spring(1)
一、概念 1、核心技术:依赖注入(DI),AOP,事件(events),资源,i18n,验证,数据绑定,类型转换,SpEL。 2、测试:模…...
SCL更换阿里数据源
问题: zabbix安装前端环境报错 yum install zabbix-web-mysql-scl zabbix-apache-conf-scl -y 报错:Could not retrieve mirrorlist http://mirrorlist.centos.org/ 能上网 但是不能ping通http://mirrorlist.centos.org/ 解决: 修改repo数…...
【web逆向】全报文加密流量的去加密测试方案
aHR0cHM6Ly90ZGx6LmNjYi5jb20vIy9sb2dpbg 国密混合 WEB JS逆向篇 先看报文:请求和响应都是全加密,这种情况就不像参数加密可以方便全文搜索定位加密代码,但因为前端必须解密响应的密文,因此万能的方法就是搜索拦截器,…...
Django实现音乐网站 ⑼
使用Python Django框架制作一个音乐网站, 本篇主要是后台对专辑、首页轮播图原有功能的基础上进行部分功能实现和显示优化。 目录 专辑功能优化 新增编辑 专辑语种改为下拉选项 添加单曲优化显示 新增单曲多选 更新歌手专辑数、专辑单曲数 获取歌手专辑数 保…...
【脚踢数据结构】
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,Linux基础,ARM开发板,软件配置等领域博主🌍快上🚘,一起学习,让我们成为一个强大的攻城狮!送给自己和读者的一句鸡汤🤔&…...
uni-app使用vue语法进行开发注意事项
目录 uni-app 项目目录结构 生命周期 路由 路由跳转 页面栈 条件编译 文本渲染 样式渲染 条件渲染 遍历渲染 事件处理 事件修饰符 uni-app 项目目录结构 组件/标签 使用(类似)小程序 语法/结构 使用vue 具体项目目录如下: 生命…...
数据结构---B树
目录标题 B-树的由来B-树的规则和原理B-树的插入分析B-树的插入实现准备工作find函数insert中序遍历 B-树的性能测试B-树的删除B树B树的元素插入B*树的介绍 B-树的由来 在前面的学习过程中,我们见过很多搜索结构比比如说顺序查找,二分查找,搜…...
c++11以后c++标准库定义的固定位宽的整数类型(Fixed width integer types)
Fixed width integer types Fixed width integer types (since C11) - cppreference.com 相关定义文件如下: Windows系统MSVC: Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\cstdint Linux系统GCC: gcc\libstdc-v3\include\c_g…...
Object.values()
Object.values() 是ES2017新增的一个对象方法,它可以将一个对象自身的所有可枚举属性值,组成一个数组返回。 基本语法: Object.values(obj)示例: jsCopy codeconst obj {foo: bar,baz: 42 };Object.values(obj); // [bar, 42]Object.values()的特点: 只返回可枚举的属性值…...
Oracle 开发篇+Java调用OJDBC访问Oracle数据库
标签:JAVA语言、Oracle数据库、Java访问Oracle数据库释义:OJDBC是Oracle公司提供的Java数据库连接驱动程序 ★ 实验环境 ※ Oracle 19c ※ OJDBC8 ※ JDK 8 ★ Java代码案例 package PAC_001; import java.sql.Connection; import java.sql.ResultSet…...
linux 查询后台任务及杀掉进程
查看后台任务命令 jobs -l删除后台进程命令 kill -9 28719...
【Vue3 博物馆管理系统】使用Vue3、Element-plus菜单组件构建前台用户菜单
系列文章目录 第一章 定制上中下(顶部菜单、底部区域、中间主区域显示)三层结构首页 第二章 使用Vue3、Element-plus菜单组件构建菜单 [第三章 使用Vue3、Element-plus菜单组件构建轮播图] [第四章 使用Vue3、Element-plus菜单组件构建组图文章] 文章目…...
Windows 11清除无效、回收站、过期、缓存、补丁更新文件
Windows 11与之前的Windows版本类似,也需要定期清理无效、垃圾、过期、缓存文件来保持系统性能和存储空间的优化。以下是在Windows 11中进行这些清理操作的一些建议方法: 磁盘清理工具 Windows 11内置了磁盘清理工具,可以帮助你删除临时文件…...
栈和队列详解(2)
目录 一、什么是队列? 二、创建一个我们自己的队列 1.前置准备 1.1需要的三个文件 1.2结构体的创建和头文件的引用 2.接口的实现 2.1初始化队列 2.2入队 2.3队列元素个数和判空 2.4取队头元素和队尾元素 2.5出队 2.6摧毁队列 2.7测试接口 三、所有代码 1.…...
EMC传导干扰滤波电路设计
1.EMC概念 2.EMC 传导干扰详解 EMC传导滤波电路的设计--传导干扰详解 3.EMC 传导干扰的测量方法 4.EMC 滤波电路设计 5.浪涌抑制电路设计 6.开关电源的安全要求 7.当前开关电源灯的应用...
【win10专业版远程控制】 自带远程桌面公司内网电脑
使用win10专业版自带远程桌面公司内网电脑 文章目录 使用win10专业版自带远程桌面公司内网电脑 在现代社会中,各类电子硬件已经遍布我们身边,除了应用在个人娱乐场景的消费类电子产品外,各项工作也离不开电脑的帮助,特别是涉及到数…...
Ubuntu 20.04 中安装docker一键安装脚本
直接上脚本,依次执行如下命令即可 wget http://apollo-pkg-beta.bj.bcebos.com/docker_install.sh bash docker_install.shdocker install docker operation system Ubuntu 18.04 直接上脚本,依次执行如下命令即可 ways1 : wget https://github.com…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
