让逆向工程师们头疼的代码混淆,就像永远也走不出的“浪浪山”

news2025/2/27 14:13:18

 

目录

代码混淆究竟是什么?

如何做代码混淆?

代码混淆不等于加密

App 加固非一时之功


“我想离开浪浪山。”

在数次尝试破解某个App 时,某个逆向工程师无奈感慨道。

 

逆向工程师顾名思义就是把一个个完整的软件逆推,还原成一段段代码,方便破解。

比如给他们一个手机App、电脑程序,用不了多久,他们就能逆推出程序的运行逻辑,找到其中的关键代码,篡改、破解、发现漏洞。

这其中最好的例子就是盗版软件。开发者们累死累活才写好的程序,分分钟就被人逆向破解,植入广告和木马,重新打包成盗版。

但逆向工程师并非是反面形象,亦有好坏之分,正义的逆向者只是做安全研究,而那些非正义的逆向者却拿着这项技能四处干坏事牟利。

因此,二者的对立也尤为明显,一方为了防破解使出浑身解数,一方为了破解绞尽脑汁。

今天,我们就来讲讲关于让非正义的逆向工程师们头疼的代码混淆。

代码混淆究竟是什么?

关于代码混淆,百度百科给出的解释是:代码混淆(Obfuscation)是将电脑程序的原始代码或机器代码,转换成功能上等价,但是难于被人阅读和理解的行为。混淆后的代码,会将原先有明确含义的类名、字段、函数等转为无意义的单词,这样对于计算机来说,执行逻辑还是正常的,但是当人们去分析混淆后的代码时,会加大阅读和理解的难度,以此来加强代码的保护。

什么意思呢?

我们可以简单理解为代码开发者是想给破解者(逆向工程师)制造一个假象,从而让他们从其他角度去尝试破解,但破解之后发现方向是错的,便又需要重新找角度破解,增加破解难度,也给开发者们充分时间来对抗破解。

举个例子。

你想去超市买水果,但又不想让人知道,于是你先去买了卫生纸回来,又去了健身房,然后又去超市买了可乐,最后才去超市买了水果。

这样一来,别人对你的行动目的就不是明确的,需要多次猜测推理才能知道你的目的。代码混淆的逻辑便是如此,代码开发者们为了隐藏目的,会在代码里加入各种多余的垃圾指令和代码,把原来的逻辑拆分成各种怪癖语法,从而达到防破解的目的。

如何做代码混淆?

讲到这里,你一定也好奇,代码混淆究竟是怎么做的?

对此,顶象移动安全总监Bob解释道:代码混淆主要有以下几方面工作:

1、代码中的包含各种元素,比如变量、函数、类的名字,这些名字有实际意义,直白的告诉破解者这个代码的功能用途.如果能改成无意义的名字,使得破解者阅读时无法根据名字猜测其功能用途;

2、良好的代码有着直白的代码逻辑,破解者阅读时可以轻易的反推出功能用途.如果将它们变为功能上等价、但是更难理解的形式,比如将循环改为递归、精简中间变量等,破解者需要付出更高的代价才能明白其功能用途;

3、对于一些解释型的代码,比如JavaScript,通常以源代码的形式发布,代码有良好的格式并且包含注释直接描述了代码的功能用途.如果能打乱代码的格式,删除源码注释,删除空格,将多行代码挤到一行代码等,破解者将难以从源码中获取有效信息;

对代码的阅读通常需要借助一些逆向工具,比如IDA,JADX,JDGUI.如果能用某种方式让这些逆向工具失效,可以逼迫破解者使用效率地下的手工分析, 进而干扰反编译的工作。

一般而言,代码混淆的常见手段分为以下几种:

1、名称混淆

将有意义的类,字段、方法名称更改为无意义的字符串。生成的新名称越短,字节代码越小。在名称混淆的字节代码中,包,类,字段和方法名称已重命名,并且难以恢复原始名称。

2、代码缩减

删除代码中对运行无用的注释,空格,换行,回车,调试信息,行号等,可以减小代码体积同时降低代码中有效的信息量.

3、控制流混淆

用于if, switch, while,for等关键字,对代码进行细微的修改,模糊控制流,而不改变代码在运行时的行为。通常情况下,选择和循环等逻辑构造会被更改,因此它们不再具有直接等效的源代码。流模糊的字节码通常强制反编译器将一系列标签和非法的go to语句插入到它们生成的源代码中。

4、数据流混淆

对一些通用的计算,将其替换为等价的形式.比如a=b+c替换为a=b+1+c-1.

5、花指令

在正常的指令序列中添加一些指令,对运行时无害,但是会触发逆向工具的Bug,造成逆向工具崩溃,无法反汇编,无法反编译,功能异常等.

此外,还有异常混淆、字符串加密混淆、引用混淆等。

对于Java来说,常用的混淆工具如下:

1、yGuard

yGuard是一款免费的Java混淆器(非开源),它有Java和.NET两个版本。yGuard 完全免费,基于 Ant 任务运行,提供高可配置的混淆规则。

2、proguard

proguard是一个免费的 Java类文件的压缩,优化,混肴器。它删除没有用的类,字段,方法与属性。使字节码最大程度地优化,使用简短且无意义的名字来重命名类、字段和方法。

3、allatori

第二代Java混淆器。所谓第二代混淆器,不仅仅能进行字段混淆,还能实现流混淆。

代码混淆不等于加密

那么,混淆等同于加密吗?

答案当然是否定的。

加密顾名思义就是要在我们想要隐藏的东西上上锁,可以是一道锁,也可以是多道锁,而混淆则不同,在进行混淆处理时,信息将保持原样,只是以一种模糊的格式呈现出来,因为我们将其复杂性提高到不可能(或几乎不可能)被理解或解析的程度。

相对于加密而言,则进一步证明了代码混淆在防破解方面的高明之处。我们都知道,加密的东西必须解密才能使用,就像一把锁和一堆钥匙,总有一把钥匙可以成功打开锁,让你看到其中的逻辑,但代码混淆不同,虽然没有加密,但代码开发者们却让逆向工程师们一遍遍在破解的迷宫里来回转圈,干扰破解。

这就会导致两种情况:一种是逆向工程师死磕到底,一种是放弃破解转而去破解更容易破解的App,从而达到保护App 的效果。

当然,代码混淆并不能真正防止逆向工程,只能增加难度,对于安全性要求很高的场景,仅使用代码混淆并不能保证原始代码的安全。

并且,对于代码混淆而言被混淆的代码难于理解,因此调试以及除错也变得困难起来。开发人员通常需要保留原始的未混淆的代码用于调试。对于支持反射的语言,代码混淆有可能与反射发生冲突。

App 加固非一时之功

正如前文所说,代码混淆并不能真正防止逆向工程,总有拨开云雾的一天,仅使用代码混淆并不能保证原始代码的安全,也不能完成保证App 加固不被破解,此时就需要多方出手,为App 的防破解环境加筑更多城墙。

比如字符串加密、控制流平坦化、指令替换、符号混淆、混淆多样化、不透明谓词、防动态调试、防动态注入、HOOK检测、代码段检验、完整性校验等等多种技术手段。

对于App 加固而言,这从来都不是一件简单的事情,一方有难,八法支援才是保护App 不被破解的良方。

————————————————

拓展学习:

红队外网打点与情报收集策略——「业务安全大讲堂第二季·第1期」icon-default.png?t=N176https://live.csdn.net/room/dingxiangtech/rBN4xrOp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】数据库操作

文章目录1、创建和管理数据库1.1 创建数据库1.2 查看数据库1.3 修改数据库1.4 删除数据库2、 创建表2.1 创建表CREATE2.2 创建表AS3、修改表3.1 添加列 ALTERT TABLE ADD3.2 修改列 ALTER TABLE MODIFY3.3 重命名列 ALTER TABLE CHANGE3.4 删除列 ALTER TABLE DROP4、重命名表 …

一文讲透丨如何破解安全应用容器架构的17大挑战!

众所皆知,云计算/云原生技术因能极大地提高云上资源利用率以及应用交付效率而被广泛采用。然而,云计算/云原生技术的发展也让用户遭受了更多高级威胁与攻击。如何构建有效的云原生安全管理体系应对层出不穷的安全威胁这一问题也一直受到千行百业用户的关…

Keras深度学习实战——使用深度Q学习进行SpaceInvaders游戏

Keras深度学习实战——使用深度Q学习进行SpaceInvaders游戏 0. 前言1. 问题与模型分析2. 使用深度 Q 学习进行 SpaceInvaders 游戏相关链接0. 前言 在《深度Q学习算法详解》一节中,我们使用了深度 Q 学习来进行 Cart-Pole 游戏。在本节中,我们将利用深度Q学习来玩“太空侵略…

CHAPTER 2 Zabbix界面操作

Zabbix界面操作2.1 Zabbix界面操作1.zabbix的web界面安装2.添加监控信息3.查看监控内容4.查看图像2.2 自定义监控与监控报警1.自定义监控1.1 说明1.2 预备知识2.实现自定义监控2.1 自定义语法2.2 agent注册2.3 在server端注册(web操作)2.4 查看监控图形2.3 监控报警1.第三方报警…

hive实现oracle merge into matched and not matched

create database cc_test; use cc_test; table1 可以理解为记录学生最好成绩的表。 table2可以理解为每次学生的考试成绩。 我们要始终更新table1的数据 create table table1 (id string ,maxScore string );create table table2 (id string ,score string );insert into table…

用于汽车传感器的混合点云语义压缩:性能评估

Hybrid Point Cloud Semantic Compression for Automotive Sensors: A Performance Evaluation https://arxiv.org/pdf/2103.03819.pdf 在自动驾驶中,车辆与车辆之间的信息共享起着重要作用。在所有传感器中,激光雷达产生的3D点云的数据量通常较高。因…

设计模式实践示例

以下是我针对自己所掌握的知识出的设计模式题目,有不足的地方欢迎指摘。 一、设计模式原则 设计模式原则有哪些? 1.开闭原则:对扩展开放,对修改关闭 2.接口隔离原则:每个接口只完成单独业务的部分,不要将…

设计模式之工厂模式(C++)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、工厂模式是什么? 工厂模式是一种创建型的软件设计模式。定义一个用于创建对象的工厂接口,并让工厂子类…

MybatisPlus------application文件配置新增SQL打印以及测试类编写(二)

MybatisPlus------application文件配置新增SQL语句打印以及测试类编写 增加日志打印,具体打印执行的SQL语句。 操作: 只需在application配置文件中增加如下配置: mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout…

快递员配送手机卡,要求当面激活有“猫腻”吗?

咨询:快递员配送手机卡,要求当面激活有“猫腻”吗?有些朋友可能在网上看到了一些关于快递小哥激活会采集信息的文章,所以觉得让快递小哥激活流量卡并不安全,其实,哪有这么多的套路,只要你自己在…

一文看懂Java语言与Java生态圈

Java语言与Java生态圈 1、Oracle JDK与Open JDK之间的关系 Oracle JDK Java最早是由SUN公司发明,Oracle JDK之前叫SUN JDK,显而易见,这是在2009年Oracle收购SUN公司之前,收购之后被名为Oracle JDK,实际上&#xff0…

【图文教程】笔记本总是自动关机怎么办?win11自动关机问题解决方案

使用场景及环境: 日常使用,代码、文档使用。 系统:win11、win10、win8、win7笔记本都可通用 笔记本:联想ThinkPad E450 笔记本相关性能参数 设备名称 XXX 处理器 Intel Core™ i3-8145U CPU 2.10GHz 2.30 GHz 机带 RAM 8.00 GB (…

JavaEE——MyBatis的简单介绍和使用

MyBatis是什么 MyBatis是一个支持普通SQL查询,存储过程以及高级映射的持久层框架,他消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,使用简单的XML或注解进行配置和原始映射,将接口和Java的POJO映射成数据库中的记…

StarUML画流程图

1. 前言 工作中,在写文档总结时,对于需求的理解总有一个重要的环节,那就是画流程图,Ubuntu下我推荐使用StartUML 来画,嘎嘎好用,如果不知道这个工具,请参考笔者这篇文章下载安装: U…

关于springboot读取配置类,使用@Autowired自动注入为null的问题

问题 之前写了一个配置类,读取config.yml配置文件里写好的阿里云oss的一些参数配置。配置类读取并无问题,但是在另一个普通类里自动注入该配置类时,引用配置类属性却报NullPointer异常。然后终于发现问题原因了。 代码 1. 配置文件 appli…

GeoTools:Shapefile创建

在上一篇文章《GeoTools:Feature&Shapefile之CRUD操作》中,介绍了基于GeoTools的Shapefile文件CRUD基本操作,那么,能否使用GeoTools创建Shapefile文件呢?答案是可以的。以下,我们将深入讨论如何实现。 …

零基础机器学习做游戏辅助第十二课--原神自动钓鱼(二)

一、模拟训练环境 上节课我们已经能够判断人物的钓鱼状态,接下来我们就需要对鱼儿上钩后的那个受力框进行DQN训练。 方案有两个: 使用卷积神经网络直接输入图像对网络进行训练。使用普通网络,自己写代码模拟出图像中三个点的动态并把值给神经网络进行训练。这里我们选用第二…

IB数学课程有哪些异同?如何选课?

自从IBDP在2019年进行数学课程改革后,许多IB小伙伴们就不知该如何选课了……改革后的IB数学课程包括4门课程,也就是:● Mathematics: analysis and approaches SL & HL (first assessment 2021)● Mathematics: applications and interpr…

科技云报道:“吞金兽”ChatGPT背后:AI算力告急!

科技云报道原创。 近两个月来,全世界的网友们都在兴致勃勃的“调教”ChatGPT,但第一个受不了的却是ChatGPT的所有者。 为了更长远的发展,OpenAI宣布了付费订阅版ChatGPT Plus,每月收费20美元。 虽然OpenAI表示,将持…

Monorepo or 物料市场?结合工作实际情况对公司现有前端体系的思考

前言 去年年中基于若依vue前端框架进行了改造,加上后端的配合,我写了一套脚手架和项目中后台模板。中后台模板中包含了许多基础代码,比如登录/注册、路由、权限等等相关功能。这个中后台模板是基于我们实际开发定制的,所以跟通用…