科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件代码迷惑技术如何保护Java免遭逆向工程

代码迷惑技术如何保护Java免遭逆向工程

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

因为Java字节码包含许多和原始代码相同的信息,所以很容易对Java类文件执行逆向工程。反编译的对立面即为迷惑。

作者:开发者在线 来源:开发者在线 2007年7月26日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

代码迷惑技巧

除替换文字和取消行号外,各种迷惑工具还使用许多技巧。进一步利用无意义的字符串技巧是一种流行的迷惑方法,即用一个非法的字符串代替类文件中的一个符号。替代的内容可能是诸如private这样的关键字,或者更令人迷惑的,是一个完全没有任何意义的符号,如***。一些虚拟机,特别是在浏览器中,无法正常处理这样古怪的符号。技术上,变量以符号(如=)为名不符合Java规范;一些虚拟机会忽视这种情况。

一些迷惑工具使用的其它技巧一般主要针对特定的解译工具,如MochaJDOE。它将一个有害的指令注入代码中,这对代码运行不会造成任何影响,但它能够破坏解译工具。

我们以初始代码(解译后)为例来说明这样的有害指令:

Method void main(java.lang.String[])

0 new #4

3 invokespecial #10

6 return

以下是执行代码迷惑后的代码(为了简化,保留了相同的名称):

Method void main(java.lang.String[])

0 new #4

3 invokespecial #10

6 return

7 pop

注意,现在程序在返回(return)后增加了一个弹出(pop)指令。很明显,函数在返回后无法做其它事情——这就是诀窍所在。通过在返回语句后插入一个指令,可以保证语句绝不会被执行。这里的代码基本上无法解译。由于它不与任何可能的Java源代码相对应,因而也没有什么意义。

以下是另外一些常用的代码迷惑技巧:

  • 布局迷惑用两个基本的方法修改程序的布局结构:更名标识符和删除调试信息。它们使得逆向工程无法了解更多有关程序代码的信息。大多数布局迷惑方法都无法破解,因为它们一般都使用修改标识符这类单向函数,如利用随机字符和删除内容、无用的方法、以及调试信息等。虽然布局迷惑无法阻止逆向工程查看执行代码迷惑后的代码,进而了解程序的内容,但它们至少增加了逆向工程的成本。布局迷惑是目前得到最多深入研究,使用最为广泛的代码迷惑技巧。几乎所有Java迷惑工具中都包含这种技巧。
  • 控制迷惑改变程序的控制流程。其原理相当简单:对于例行程序A(),迷惑工具建立另外一个例行程序A_bug和一个”if”选择器,if (PREDICATE) then A_bug(); else A();。PREDICATE被有意设计为动态,以便它总是为假(但这样做是为了使它难以结束那个事实),而且总是选择例行程序A(),而不是充满漏洞的A_bug()。
  • 数据迷惑打破程序使用的数据结构并对文字进行加密。这种方法包括修改继承关系、更改数组结构等。数据迷惑彻底改变一个程序的数据结构。它们使得执行代码迷惑后的代码变得非常复杂,因而无法重建最初的源代码。

结论

我们应该记住,至今还没有哪一种迷惑工具能够保证使代码完全免遭逆向工程;因此,迷惑工具并不能提供类似于现代加密方案的安全水平;如果安全问题极其重要,你应该结合使用其它保护方法。

最常见的软件逆向工程攻击目标拷贝保护方案。这些方案往往在很大程度上依赖于现有操作系统进程调用,因而使用在解译代码时用到的相同工具就可以轻松避开基本的代码迷惑技巧。此外,迷惑后的代码一般依赖于平台和编译器的特有特征,如果发生改变,就很难对其进行管理。

Peter V. Mikhalenko是一名通过Sun认证的专家,现在任德意志银行商业顾问。

责任编辑:德东

查看本文国际来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章