App加固中的代码混淆功能,让逆向工程师很头疼
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、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 不被破解的良方。
App加固中的代码混淆功能,让逆向工程师很头疼的更多相关文章
- eclipse中的代码提示功能
Eclipse 的代码提示功能,具体配置 1. 打开Eclipse ,然后"window"→"Preferences" 2. 选择"java" ...
- 实用---eclipse中的代码提示功能
Eclipse 的代码提示功能,具体配置 1. 打开Eclipse ,然后“window”→“Preferences” 2. 选择“java”,展开,“Editor”,选择“Content Assis ...
- VS中的代码段功能
1.前言 开发人员不喜欢打字.如果你希望提高开发人员的生产力,减少键入的数量,这也同时减少打字稿的数量以及因此产生的编译器错误,这些都极大分散了开发人员的注意力.代码重用是开发人员收集代码的另一个原因 ...
- 在微信中实现app软件中账号注册的功能实现
利用写好的接口url地址访问 输入手机号,接收手机验证码 <span class="accept" >点击获取验证码</span> $(".acc ...
- eclipse中安装thymeleaf插件完成thymeleaf模板中自动代码提示功能
插件地址:https://github.com/thymeleaf/thymeleaf-extras-eclipse-plugin 页面有介绍如何使用:
- 简单Android代码混淆(转)
代码混淆步骤: 1,project.properties中打开代码混淆功能,加入proguard.config=proguard.cfg 2,编辑proguard.cfg文件,项目没有自动生成时可手工 ...
- android应用安全——代码安全(android代码混淆)
android2.3的SDK开始在eclipse中支持代码混淆功能(理论上java都支持混淆,但关键在于如何编写proguard的混淆脚本,2.3的SDK使用简单的配置就可以实现混淆).使用SDK2. ...
- Android 代码混淆、第三方平台加固加密、渠道分发 完整教程(图文)
第一步:代码混淆(注意引入的第三方jar) 在新版本的ADT创建项目时,混码的文件不再是proguard.cfg,而是project.properties和proguard-project.txt. ...
- #云栖大会# 移动安全专场——APP加固新方向(演讲速记)
主持人导语: 近些年来,移动APP数量呈现爆炸式的增长,黑产也从原来的PC端转移到了移动端,伴随而来的逆向攻击手段也越来越高明.在解决加固产品容易被脱壳的方案中,代码混淆技术是对抗逆向攻击最有效的方式 ...
- Android ProGuard:代码混淆压缩
写这篇文章的目的 一直以来,在项目中需要进行代码混淆时每次都要去翻文档,很麻烦.也没有像写代码那样记得那么多.既然要查来查去,就不如自己捋一捋这个知识点了,被人写的终究还是别人的.所以自己去翻看了很多 ...
随机推荐
- TerraMoursGPT V1.0 开发总结
TerraMoursGPT V1.0 开发总结 TerraMoursGPT V1.0 是之前gpt项目基于TerraMours后端框架的重构,实现用户登陆和基于SK的多语言模型聊天.基于chatgpt ...
- 从零实现的浏览器Web脚本
从零实现的浏览器Web脚本 在之前我们介绍了从零实现Chrome扩展,而实际上浏览器级别的扩展整体架构非常复杂,尽管当前有统一规范但不同浏览器的具体实现不尽相同,并且成为开发者并上架Chrome应用商 ...
- .NET8依赖注入新特性Keyed services
什么是Keyed service Keyed service是指,为一个需要注入的服务定义一个Key Name,并使用使用Key Name检索依赖项注入 (DI) 服务的机制. 使用方法 通过调用 A ...
- 手撕Vue-Router-初始化路由信息
前言 经过上一节课的学习,我们已经完成了提取我们想要的路由信息数据格式,提取完毕了之后,接下来我们该干什么,接下来需要做的步骤就是监听路由的变化,保存当前的路由. 那么就会遇到几个问题,就是怎么监听, ...
- Python根据输入的公司编号、名称、网址,格式化输出公司信息。其中1)冒号统一为英文冒号,编号占6位,不足6位的前面补0。编号后面是制表符。
根据输入的公司编号.名称.网址,格式化输出公司信息.其中 1)冒号统一为英文冒号,编号占6位,不足6位的前面补0.编号后面是制表符. 2)"公司名称:" 后面输出字符串占8位,左对 ...
- 大数据分析/机器学习基础之matplotlib绘图篇
目录 一.前言 我的运行环境 二.什么是matplotlib? 三.安装及导入 四.matplotlib的使用 一.前言 本人因在学习基于python的机器学习相关教程时第一次接触到matplotli ...
- vertx的学习总结4之异步数据和事件流
一.异步数据和事件流 1.为什么流是事件之上的一个有用的抽象? 2.什么是背压,为什么它是异步生产者和消费者的基础? 3.如何从流解析协议数据? 1. 答:因为它能够将连续的事件序列化并按照顺序进行 ...
- [ABC266Ex] Snuke Panic (2D)
Problem Statement Takahashi is trying to catch many Snuke. There are some pits in a two-dimensional ...
- [VBA] 实现SQLserver数据库的增删改查
[VBA] 实现 SQLserver数据库的增删改查 问题背景 用于库存管理的简单Excel系统实现,能够让库管员录入每日出入库信息并进能够按日期查询导出数据,生成简要报表,以及数据修改与删除.非科班 ...
- Cisco 交换机利用CDP数据自动绘制网络拓扑图[drawio]-实践
进行网络运维,必须对网络拓扑情况进行详细的掌握,但是网络改动后,更新网络拓扑比较繁琐,维护人员容易懈怠,久而久之,通过人工绘制的网络拓扑很容易与现有网络出现偏差. 现在,可以通过python 丰富的库 ...