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…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
