App加固中的代码混淆功能,让逆向工程师很头疼

news2024/11/25 16:31:44

App加固中的代码混淆功能,让逆向工程师很头疼

“我想离开浪浪山。”

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

image.png

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

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

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

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

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

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

代码混淆究竟是什么?

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

1677216717933100.png

什么意思呢?

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

举个例子。

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

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

如何做代码混淆?

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

对此,顶象移动安全总监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、Ipa Guard

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

2、yGuard

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

3、allatori

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

代码混淆不等于加密

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

答案当然是否定的。

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

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

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

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

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

 App 加固非一时之功

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

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

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

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

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

相关文章

行内样式、内部样式、外部样式

行内样式: 该元素的所在本行中使用style标记来写样式 内部样式: 在head标签中使用style标记来写样式 外部样式: 在head标签中使用link标记引用外部样式 注意优先级: 行内样式>内部样式>外部样式 代码…

ChatGPT简介及基本概念

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列点击跳转>ChatGPT和AIGC 👉关于作者 专…

传输层——— UDP协议

文章目录 一.传输层1.再谈端口号2.端口号范围划分3.认识知名端口号4.两个问题5.netstat与iostat6.pidof 二.UDP协议1.UDP协议格式2.UDP协议的特点3.面向数据报4.UDP的缓冲区5.UDP使用注意事项6.基于UDP的应用层协议 一.传输层 在学习HTTP等应用层协议时,为了便于理…

JMeter JDBC请求---操作MySql数据库

准备: 1、MySql的驱动jar包:mysql-connector-java-5.1.28.jar, 2、jmeter安装目录中修改编码格式:\bin\jmeter.properties :sampleresult.default.encodingUTF-8 3、连接数据库的连接地址、用户名、密码以及操作s…

在test用户下创建test1表并插入数据,然后将tes1t表的查询权限授予test2用户

文章目录 1、以 test 用户登录2、创建 test1 表3、插入数据4、查看数据5、授予权限创建用户test2以 test 用户登录并授予权限:使用test2用户登录查询,测试结果 1、以 test 用户登录 首先,您需要以 test 用户登录到数据库 sqlplus test/1232…

RocketMQ 分布式事务消息实战指南:确保数据一致性的关键设计

🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏&…

【数据结构】树与二叉树(十七):二叉树的基础操作:删除指定结点及其左右子树(算法DST)

文章目录 5.2.1 二叉树二叉树性质引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点,其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…

【软考篇】中级软件设计师 第四部分(三)

中级软件设计师 第四部分(三) 三十四. 结构化开发方法34.1 内聚34.2 耦合 三十五. 测试基础知识三十六. 面向对象36.1 UML图36.2 设计模式36.3 数据流图 读前须知: 【软考篇】中级软件设计师 学前须知 上一章节: 【软考篇】中级软…

在rt-thread中使用iperf触发断言卡死

问题触发 最近在适配sdio device驱动,CP芯片与AP芯片对接(RK3399),准备使用iperf测试下能否AP与CP能否正常通信。CP芯片跑的是rt-thread系统,在使用sdio_eth_dev_init命令初始化后,使用iperf -c 192.168.1…

Uniapp连接iBeacon设备——实现无线定位与互动体验(理论篇)

目录 前言: 一、什么是iBeacon技术 二、Uniapp连接iBeacon设备的准备工作 硬件设备: 三、Uniapp连接iBeacon设备的实现步骤 创建Uniapp项目: 四、Uniapp连接iBeacon设备的应用场景 室内导航: 五、Uniapp连接iBeacon设备的未来…

MQTT协议详解及在Android上的应用

MQTT协议详解及在Android上的应用 一、MQTT协议简介二、MQTT工作原理三、MQTT协议特点四、MQTT在Android上的应用4.1 准备工作4.2 示例代码 五、结论 本博客将全面介绍MQTT(Message Queuing Telemetry Transport)协议的基本概念、工作原理、特点以及在An…

网工内推 | 国企、上市公司售前,CISP/CISSP认证,最高18K*14薪

01 中电福富信息科技有限公司 招聘岗位:售前工程师(安全) 职责描述: 1、对行业、用户需求、竞争对手等方面提出分析报告,为公司市场方向、产品研发和软件开发提供建议; 2、负责项目售前跟踪、技术支持、需…

01Urllib

1.什么是互联网爬虫? 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的数据 解释1:通过一个程序,根据Url(http://www.…

基于边缘智能网关的冬季管网智能监测应用

随着我国北方全面进入到冬季,多日以来严寒、降雪天气频发,民生基础设施也迎来冬季考验。尤其是民众生活仰赖的水、电、气管网,面临极端冰雪天气时易存在各种风险,包括管道水/气泄露损耗、低温冻裂、积雪压塌压损、冻结受阻等。 针…

广州华锐互动VRAR:VR教学楼地震模拟体验增强学生防震减灾意识

在当今社会,地震作为一种自然灾害,给人们的生活带来了巨大的威胁。特别是在学校这样的集体场所,一旦发生地震,后果将不堪设想。因此,加强校园安全教育,提高师生的防震减灾意识和能力,已经成为了…

Ubuntu22.04离线安装uwsgi问题记录

GCC4.8安装 1、报错信息1: 由于缺少gcc4.8环境导致的无法安装uwsgi 解决方案: 离线安装GCC4.8环境, GCC4.8.5离线安装步骤如下: 1、下载gcc的离线安装包及其依赖包,链接如下: https://download.csdn.net/download/…

vue源码分析(八)—— update分析(首次渲染)

文章目录 前言一、update首次渲染的核心方法__path__二、__path__方法详解1. 文件路径2. inBrowser的解析(1)noop 的空函数定义:(2)patch 的含义 3. createPatchFunction 的解析4. path 方法解析(1&#xf…

医美三季报内卷,华熙生物、爱美客、昊海生科混战双11

双十一落幕,据天猫大美妆数据统计,被称为“医美三剑客”的华熙生物(688363.SH)、爱美客(300896.SZ)、昊海生科(688366.SH)的医美产品均未进入天猫双11美容护肤类目TOP10榜单。 与此同时,其业绩承压困局也写在最新的三季报里。 「…

M系列 Mac安装配置Homebrew

目录 首先,验证电脑是否安装了Homebrew 1、打开终端输入以下指令: 2、如图所示,该电脑没有安装Homebrew ,下面我们安装Homebrew 一、官网下载 (不建议) 1、我们打开官网:https://brew.sh/ …

freeRTOS--任务通知

一、什么是任务通知 使用任务通知可以替换二值信号量、计数信号量、事件标志组,可以替代长度为1的队列,任务通知速度更快、使用的RAM更少。 任务通知值的更新方式: 发消息给任务,如果有通知未读,不覆盖通知值。发消…