jsp网站建设作业,东莞专业网,专业的网页设计服务公司,微信公众号模板目录
代码混淆究竟是什么#xff1f;
如何做代码混淆#xff1f;
代码混淆不等于加密
App 加固非一时之功 “我想离开浪浪山。” 在数次尝试破解某个App 时#xff0c;某个逆向工程师无奈感慨道。 逆向工程师顾名思义就是把一个个完整的软件逆推#xff0c;还原成一段段…
目录
代码混淆究竟是什么
如何做代码混淆
代码混淆不等于加密
App 加固非一时之功 “我想离开浪浪山。” 在数次尝试破解某个App 时某个逆向工程师无奈感慨道。 逆向工程师顾名思义就是把一个个完整的软件逆推还原成一段段代码方便破解。
比如给他们一个手机App、电脑程序用不了多久他们就能逆推出程序的运行逻辑找到其中的关键代码篡改、破解、发现漏洞。
这其中最好的例子就是盗版软件。开发者们累死累活才写好的程序分分钟就被人逆向破解植入广告和木马重新打包成盗版。 但逆向工程师并非是反面形象亦有好坏之分正义的逆向者只是做安全研究而那些非正义的逆向者却拿着这项技能四处干坏事牟利。 因此二者的对立也尤为明显一方为了防破解使出浑身解数一方为了破解绞尽脑汁。
今天我们就来讲讲关于让非正义的逆向工程师们头疼的代码混淆。 代码混淆究竟是什么
关于代码混淆百度百科给出的解释是代码混淆Obfuscation是将电脑程序的原始代码或机器代码转换成功能上等价但是难于被人阅读和理解的行为。混淆后的代码会将原先有明确含义的类名、字段、函数等转为无意义的单词这样对于计算机来说执行逻辑还是正常的但是当人们去分析混淆后的代码时会加大阅读和理解的难度以此来加强代码的保护。 什么意思呢
我们可以简单理解为代码开发者是想给破解者逆向工程师制造一个假象从而让他们从其他角度去尝试破解但破解之后发现方向是错的便又需要重新找角度破解增加破解难度也给开发者们充分时间来对抗破解。
举个例子。
你想去超市买水果但又不想让人知道于是你先去买了卫生纸回来又去了健身房然后又去超市买了可乐最后才去超市买了水果。
这样一来别人对你的行动目的就不是明确的需要多次猜测推理才能知道你的目的。代码混淆的逻辑便是如此代码开发者们为了隐藏目的会在代码里加入各种多余的垃圾指令和代码把原来的逻辑拆分成各种怪癖语法从而达到防破解的目的。 如何做代码混淆
讲到这里你一定也好奇代码混淆究竟是怎么做的
对此顶象移动安全总监Bob解释道代码混淆主要有以下几方面工作
1、代码中的包含各种元素比如变量、函数、类的名字这些名字有实际意义直白的告诉破解者这个代码的功能用途如果能改成无意义的名字使得破解者阅读时无法根据名字猜测其功能用途
2、良好的代码有着直白的代码逻辑破解者阅读时可以轻易的反推出功能用途如果将它们变为功能上等价、但是更难理解的形式比如将循环改为递归、精简中间变量等破解者需要付出更高的代价才能明白其功能用途
3、对于一些解释型的代码比如JavaScript通常以源代码的形式发布代码有良好的格式并且包含注释直接描述了代码的功能用途如果能打乱代码的格式删除源码注释删除空格将多行代码挤到一行代码等破解者将难以从源码中获取有效信息
对代码的阅读通常需要借助一些逆向工具比如IDAJADXJDGUI如果能用某种方式让这些逆向工具失效可以逼迫破解者使用效率地下的手工分析 进而干扰反编译的工作。
一般而言代码混淆的常见手段分为以下几种
1、名称混淆
将有意义的类字段、方法名称更改为无意义的字符串。生成的新名称越短字节代码越小。在名称混淆的字节代码中包类字段和方法名称已重命名并且难以恢复原始名称。
2、代码缩减
删除代码中对运行无用的注释空格换行回车调试信息行号等可以减小代码体积同时降低代码中有效的信息量
、控制流混淆
用于if, switch, while,for等关键字对代码进行细微的修改模糊控制流而不改变代码在运行时的行为。通常情况下选择和循环等逻辑构造会被更改因此它们不再具有直接等效的源代码。流模糊的字节码通常强制反编译器将一系列标签和非法的go to语句插入到它们生成的源代码中。
4、数据流混淆
对一些通用的计算将其替换为等价的形式比如abc替换为ab1c-1
、花指令
在正常的指令序列中添加一些指令对运行时无害但是会触发逆向工具的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期」https://live.csdn.net/room/dingxiangtech/rBN4xrOp