关于安全:让逆向工程师们头疼的代码混淆就像永远也走不出的浪浪山

2次阅读

共计 2677 个字符,预计需要花费 7 分钟才能阅读完成。

“我想来到浪浪山。”
在数次尝试破解某个 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 不被破解的良方。


业务平安大讲堂:立刻报名

业务平安产品:收费试用

业务平安交换群:退出畅聊

正文完
 0