代码混淆的重要性

18-09-14 banq
         

作为开发人员工作最令人沮丧的是花一整天调试代码 - 但你很快就会知道这还只是工作的一部分。:)

在完成构建、调试和部署应用程序的所有工作之后,你最不希望的是让其他人crack并重用所有这些代码成果,值得庆幸的是,一种称为代码混淆的常见编码实践可以帮助保护你的工作。在本文中,我将向您介绍代码混淆的基础知识。

什么是源代码混淆?

代码混淆是故意模糊源代码的行为,使人类很难理解,并使对可能别有用心的黑客无用。它也可能用于阻止软件的逆向工程。

从本质上讲,混淆完全改变了源代码; 尽管如此,它仍然在功能上等同于原始代码。

混淆与加密不同。加密的目的是转换数据以使其对其他人保密。混淆的目的是使人类难以理解数据。加密代码总是需要在执行前解密,而混淆不要求代码经过去混淆来执行它。

混淆是如何工作的

代码混淆由几种不同的技术组成,每种技术都建立在另一种之上,从而使代码难以理解。以下是一些使用的混淆技术。

1. 重命名混淆:重命名基本上修改了变量和方法名称,使人们很难理解代码。但是,它仍然保持程序执行行为。这种基本技术最常用于Android,Java和IOS混淆器。

2. 字符串加密:虽然重命名技术只是改变变量和方法名称,但字符串加密意图并加密所有清晰可读的字符串。(应该注意,使用此技术,在运行时解密字符串可能会导致较小的运行时性能损失。)

3. 虚拟代码插入:这与将代码插入可执行文件有关。这种技术使得反向工程代码很难被分析。但是,插入不会影响程序的逻辑和/或执行。

在混淆之前:

function sayHello(){
	console.log("Hello World");
}
sayHello();
<p>

混淆之后:

var _0x12b3=["\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64","\x6C\x6F\x67"];
function sayHello(){console[_0x12b3[1]](_0x12b3[0])}sayHello()
<p>

为什么要使用代码混淆器?

1. 一旦开发了Android应用程序(或任何应用程序),你的目标应该是让攻击者更难以查看代码并分析应用程序。

2. 隐藏业务逻辑和代码,以使攻击者更难获取访问权限并开始调试和篡改您的应用程序至关重要。(他们经常使用恶意代码重新打包应用程序。)

3.代码混淆可以大大减少文件大小,并且下载时间也可以大大减少。(以JavaScript为例)

4.人们正在从逆向工程中开展职业生涯 - 因此,你想尽可能地让它们变得更加困难。

5.为客户开发应用程序的公司可能不希望他们的客户能够阅读它们。

使用混淆器的缺点

1.在某些情况下,AVG AntiVirus等防病毒软件会在您访问已被混淆的站点时提醒您(因为混淆的目的之一是隐藏恶意代码)。然而,在出于安全原因进行混淆的情况下,它可能阻止用户使用或访问站点。

2.某些技术可能会对算法的性能产生负面影响。

以下是您可以使用的一些工具:

.NET:Dotfuscator,ILProtector

JavaScript:Javascript Obfuscator,Jscrambler

Android:ProGuard

最后的想法

尽管混淆可能使程序的读取和逆向工程变得困难且耗时,但这并不是不可能的。重要的是要记住,虽然代码混淆可以很好地掩盖源代码,但是没有混淆器可以保证最大的安全性。因此,在安全性非常重要的情况下,您将需要使用其他措施,包括各种加密方案。

Importance of Code Obfuscation · Sweetcode.io