当前位置: 首页 > news >正文

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 文件

image-20230808104229048

使用jadx反编译原版classes.dex 和通过Ob混淆后的dex文件classes_out.dex .

可以看到下图的效果非常的恶心.效果也很好,那么我们进入源码的分析学习阶段.

image-20230808104405720

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的逻辑。

正常情况:

正常情况

控制流平坦化之后:

混淆后

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

20220708115821

  • 入口块:进入函数第一个执行的基本块
  • 分发块:负责跳转到下一个要执行的原基本块
  • 原基本块:混淆之前的基本块,实际完成程序工作的基本块
  • 返回块:返回到主分发块

修改了程序的控制流,导致逆向分析人员不容易直接的理清程序执行流程,增加分析难度。

2. Dex解析

提取出关键Dex为 {timestamp} + split.dex . 它是由DexLib2Utils.splitDex(input.toFile(), splitDex, whileList, blackList); 实现的.

image-20230808165841720

分割完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. 祖安混淆(娱乐)

image-20230808142858516

祖安混淆主要来源于这位哥.在群里面说了一声,骂人混淆 == 祖安混淆. 那么经过对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");

然后就成果了~ 成果的问候了各位逆向工作者,无恶意无恶意!

342eb05456d5cb594fd27e9a0ba6bd0

4.定制修改

5. 总结

相关文章:

Dex文件混淆(一):BlackObfuscator

Dex文件混淆(一)&#xff1a;BlackObfuscator 首发地址:http://zhuoyue360.com/crack/105.html 文章目录 Dex文件混淆(一)&#xff1a;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位库的问题解决方法如下&#xff1a; sudo apt-get install lib32stdc6 sudo apt-get install lib32ncurses5 sudo apt-get install lib32z1 二、交叉编译工具没有写入环境变量或写错&#xff0c;重新写入环境变量…...

最近遇到的两个小问题总结:git问题和node问题

这两个问题都是我帮别人看问题的解决的&#xff0c;在windows系统上遇到的&#xff1a; 1、git没有配置全局变量 在使用git的时候&#xff0c;报’git‘不是内部或外部命令&#xff0c;也不是可运行的程序。然后再在其他文件下面试一下&#xff08;git --version&#xff09;…...

Java # Spring(1)

一、概念 1、核心技术&#xff1a;依赖注入&#xff08;DI&#xff09;&#xff0c;AOP&#xff0c;事件&#xff08;events&#xff09;&#xff0c;资源&#xff0c;i18n&#xff0c;验证&#xff0c;数据绑定&#xff0c;类型转换&#xff0c;SpEL。 2、测试&#xff1a;模…...

SCL更换阿里数据源

问题&#xff1a; zabbix安装前端环境报错 yum install zabbix-web-mysql-scl zabbix-apache-conf-scl -y 报错&#xff1a;Could not retrieve mirrorlist http://mirrorlist.centos.org/ 能上网 但是不能ping通http://mirrorlist.centos.org/ 解决&#xff1a; 修改repo数…...

【web逆向】全报文加密流量的去加密测试方案

aHR0cHM6Ly90ZGx6LmNjYi5jb20vIy9sb2dpbg 国密混合 WEB JS逆向篇 先看报文&#xff1a;请求和响应都是全加密&#xff0c;这种情况就不像参数加密可以方便全文搜索定位加密代码&#xff0c;但因为前端必须解密响应的密文&#xff0c;因此万能的方法就是搜索拦截器&#xff0c…...

Django实现音乐网站 ⑼

使用Python Django框架制作一个音乐网站&#xff0c; 本篇主要是后台对专辑、首页轮播图原有功能的基础上进行部分功能实现和显示优化。 目录 专辑功能优化 新增编辑 专辑语种改为下拉选项 添加单曲优化显示 新增单曲多选 更新歌手专辑数、专辑单曲数 获取歌手专辑数 保…...

【脚踢数据结构】

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言,Linux基础,ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的一句鸡汤&#x1f914;&…...

uni-app使用vue语法进行开发注意事项

目录 uni-app 项目目录结构 生命周期 路由 路由跳转 页面栈 条件编译 文本渲染 样式渲染 条件渲染 遍历渲染 事件处理 事件修饰符 uni-app 项目目录结构 组件/标签 使用&#xff08;类似&#xff09;小程序 语法/结构 使用vue 具体项目目录如下&#xff1a; 生命…...

数据结构---B树

目录标题 B-树的由来B-树的规则和原理B-树的插入分析B-树的插入实现准备工作find函数insert中序遍历 B-树的性能测试B-树的删除B树B树的元素插入B*树的介绍 B-树的由来 在前面的学习过程中&#xff0c;我们见过很多搜索结构比比如说顺序查找&#xff0c;二分查找&#xff0c;搜…...

c++11以后c++标准库定义的固定位宽的整数类型(Fixed width integer types)

Fixed width integer types Fixed width integer types (since C11) - cppreference.com 相关定义文件如下&#xff1a; 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数据库

标签&#xff1a;JAVA语言、Oracle数据库、Java访问Oracle数据库释义&#xff1a;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菜单组件构建前台用户菜单

系列文章目录 第一章 定制上中下&#xff08;顶部菜单、底部区域、中间主区域显示&#xff09;三层结构首页 第二章 使用Vue3、Element-plus菜单组件构建菜单 [第三章 使用Vue3、Element-plus菜单组件构建轮播图] [第四章 使用Vue3、Element-plus菜单组件构建组图文章] 文章目…...

Windows 11清除无效、回收站、过期、缓存、补丁更新文件

Windows 11与之前的Windows版本类似&#xff0c;也需要定期清理无效、垃圾、过期、缓存文件来保持系统性能和存储空间的优化。以下是在Windows 11中进行这些清理操作的一些建议方法&#xff1a; 磁盘清理工具 Windows 11内置了磁盘清理工具&#xff0c;可以帮助你删除临时文件…...

栈和队列详解(2)

目录 一、什么是队列&#xff1f; 二、创建一个我们自己的队列 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专业版自带远程桌面公司内网电脑 在现代社会中&#xff0c;各类电子硬件已经遍布我们身边&#xff0c;除了应用在个人娱乐场景的消费类电子产品外&#xff0c;各项工作也离不开电脑的帮助&#xff0c;特别是涉及到数…...

Ubuntu 20.04 中安装docker一键安装脚本

直接上脚本&#xff0c;依次执行如下命令即可 wget http://apollo-pkg-beta.bj.bcebos.com/docker_install.sh bash docker_install.shdocker install docker operation system Ubuntu 18.04 直接上脚本&#xff0c;依次执行如下命令即可 ways1 : wget https://github.com…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...