代码混淆不再愁:一篇掌握核心技巧

简介: 代码混淆不再愁:一篇掌握核心技巧

1. 概述


代码混淆是将计算机程序的代码转换成一种功能上等价,但是难以阅读和理解的形式。

对于软件开发者来说,代码混淆可以在一定程度上保护程序免被逆向。

对于逆向工程师来说,学习代码混淆可以帮助我们研究反混淆技术。


2. 常见混淆思路


常见的混淆思路有:符号混淆、控制流混淆、计算混淆和虚拟机混淆。

2.1 符号混淆

指的是将函数的符号,如函数名、全局变量名去除或者混淆。对于ELF文件可以通过strip指令去除符号表完成。

下图就是一个去除了符号的程序。



下图则对函数名进行了混淆。



2.2 控制流混淆


指的是混淆程序正常的控制流,使其在功能保持不变的情况下,使其不能清晰地反映原程序的正常逻辑。

常见的有:控制流平坦化、虚假控制流、随机控制流。

控制流平坦化指的是将正常控制流中基本块之间的跳转关系删除,用一个集中的分发块来调度基本块的执行顺序,下图为经过控制流平坦化的控制流图。



虚假控制流指的是,通过向正常控制流中插入若干不可达基本块和由不透明谓词造成的虚假跳转以产生大量垃圾代码干扰攻击者分析的混淆。

下图为虚假控制流混淆的控制流图,它与控制流平坦化不同,呈现出长条状。



随机控制流是虚假控制流的一种变体。随机控制流通过克隆基本块以及添加随机跳转(随机跳转到两个功能相同的基本块中的一个)来混淆控制流。随即控制流的控制流图与虚假控制流类似,都呈长条形。


2.3 计算混淆


指的是混淆程序的计算流程,或计算流程中使用的数据,使分析者难以分辨某一段代码所执行的具体计算。一般有指令替代、常量替代。


指令替代将正常的二元运算指令(如加、减、异或等)替换为等效而复杂的指令序列,以达到混淆计算过程的目的。经过指令替代,函数的控制流没有发生变化,但运算过程变得难以分辨。


常量替代指将二元运算指令(如加、减、异或等)中使用的常数替换为等效而更复杂的表达式,以达到混淆计算过程或某些特殊常量的目的。例如将TEA加密使用的常量0x9e3779b 替换为 12167*16715+18858*32146-643678438。类似于指令替代,函数的控制流没有发生变化,但是运算过程变得难以分辨。


2.4 虚拟机混淆


指的是将一组指令集合(如一组x86指令)转化为一组攻击者未知的自定义指令集,并用与程序绑定的解释器解释执行。虚拟机混淆代表:VMProtect。


虚拟机混淆是目前最强力的混淆,但有性能损耗大、容易被杀毒软件报毒等缺点。


3. OLLVM支持的混淆


OLLVM是经典的代码混淆工具,在国内移动安全的使用非常广泛。它提供了三种经典的代码混淆:


控制流平坦化

虚假控制流

指令替代


3. 混淆工具推荐


Ipa Guard是一款功能强大的ipa混淆工具,不需要ios app源码,直接对ipa文件进行混淆加密。可对IOS ipa 文件的代码,代码库,资源文件等进行混淆保护。 可以根据设置对函数名、变量名、类名等关键代码进行重命名和混淆处理,降低代码的可读性,增加ipa破解反编译难度。可以对图片,资源,配置等进行修改名称,修改md5。只要是ipa都可以,不限制OC,Swift,Flutter,React Native,H5类app。




目录
相关文章
|
7月前
|
弹性计算 Java 程序员
推荐程序员必知的四大神级学习网站
今天给大家整理一些小编经常学习和访问的学习网站,供大家参考学习。
|
开发框架 小程序 前端开发
带你了解小程序的框架之谜
带你了解小程序的框架之谜
|
2月前
|
安全 API 数据安全/隐私保护
史上最全最完整,最详细,软件保护技术-程序脱壳篇-逆向工程学习记录(一)
欢迎访问我的原站!本文详细介绍了程序脱壳技术,包括壳的定义、作用、执行过程、OEP(原始入口点)的概念及查找方法。文章通过多个实例,逐步演示了如何使用OD(OllyDbg)等工具进行脱壳操作,涵盖了压缩壳、加密壳等多种类型的壳。内容详尽,适合逆向工程初学者深入学习。[点击查看原文](https://www.oisec.cn/index.php/archives/520/)
57 0
|
2月前
|
存储 监控 API
史上最全最完整,最详细,软件保护技术-程序脱壳篇-逆向工程学习记录(二)
本文详细介绍了软件保护技术中的程序脱壳过程,包括IAT(导入地址表)的重建、OD(OllyDbg)跟踪输入表、HOOK-API技术以及FSG、UPX和WinUpacx等常见压缩壳的加脱壳方法。文章通过具体实例和详细步骤,帮助读者理解并掌握逆向工程的基本技巧。[原文链接](https://developer.aliyun.com/article/1618653)
64 0
|
4月前
|
Rust 开发者
揭秘Rust编程:模块与包的终极对决,谁将主宰代码组织的新秩序?
【8月更文挑战第31天】在软件工程中,模块化设计能显著提升代码的可读性、可维护性和可重用性。Rust 作为现代系统编程语言,其模块和包管理机制为开发者提供了强有力的工具来组织代码。本文通过对比模块和包的概念及使用场景,探讨了 Rust 中的最佳实践。
42 2
|
4月前
|
开发者 CDN 监控
【破局·提速】当Vaadin遇上性能怪圈:开发者的智慧较量与极速加载的实战秘籍!
【8月更文挑战第31天】本文详细介绍了优化Vaadin应用性能的方法,特别是提高加载速度的实战技巧。首先分析性能瓶颈,如服务器响应时间和数据库查询效率等;然后通过代码优化、数据分页与急切加载技术减少资源消耗;接着利用资源压缩合并及CDN加速,进一步提升加载速度;最后通过持续性能监控和测试确保优化效果。通过综合应用这些策略,可显著改善用户体验。
84 0
|
小程序 安全 前端开发
【创造者】关于小程序的开发
【创造者】关于小程序的开发
81 0
|
7月前
|
安全 大数据 Linux
分享5款不起眼但非常实用的小工具
时光荏苒,科技日新月异,一些看似不起眼的小工具却可能改变我们的工作方式。下面我们将介绍五款不可错过的小工具,它们能给你带来一些意想不到的效果,让你的工作更加高效便捷。
88 0
|
JSON 小程序 数据可视化
开发中难以解决的问题,你是如何另辟蹊径的
在以往的开发中,你遇到过难以解决的问题吗?或者咱们换个角度,面对产品经理提过来的,很难实现的需求,你是怎么处理的?又或者自己在研发某个功能时,遇到障碍,又是如何解决的?
102 0
|
Windows
谈一谈|下载软件的门道你懂吗?
谈一谈|下载软件的门道你懂吗?
136 0
下一篇
DataWorks