x86汇编与逆向工程:软件破解与防护的艺术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1.3 保护JIT语言

与真正的机器码程序不同,即时编译程序往往可以被转换成源代码。这降低了逆向工程代码的门槛,使得我们在后续章节中讨论的许多x86逆向工程防御机制变得多余和过度。

对于可反编译的语言,常用的防止逆向工程的防御措施是采用混淆技术。图1.2展示了.NET应用程序在混淆前后的样子。

图1.2的上半部分展示的是代码被混淆之前的情况,其中的函数名、变量名和字符串都很容易阅读。这些变量名中的信息使得逆向工程师更容易理解每个函数的用途以及整个应用程序的工作方式。

图1.2的下半部分展示的是同一段代码的混淆版本。现在,函数名、变量名和字符串都被混乱地重命名,使得我们很难理解显示的函数的用途,更别说理解整个应用程序的功能了。

另一个重要的安全性最佳实践是避免用易于逆向工程的即时编译语言编写涉及安全性或隐私的关键代码。相反,应该用汇编语言(如C/C++)编写这些代码,对这种代码逆向工程要难得多。这些代码可以包含在动态链接库(Dynamic Link Library,DLL)中,这些库可被链接到包含用即时编译语言编写的非敏感代码的执行文件中。

图1.2 JetBrains dotPeek中的混淆