10

I am looking for a Java Bytecode obfuscator that "scrambles" the existing opcodes and adds new (useless) code. I am not interested in renamings of any kind, which is something most obfuscators seem to do.

A bit of background: As part of my PhD thesis I am developing a tool that identifies useless parts of a (Java Bytecode) program. In order to present nice results, I'd love to have some input programs with a significant amount of useless code. Besides the examples I am currently focussing on (which have subtle bugs that make code useless, think calling "equals" with a wrong argument) I could also need examples with just "weird" code - produced by a code obfuscator.

I already played around with ProGuard, however it seems it just optimizes (and therefore modifies) the code slightly. The part that renames methods, fields, ... is not relevant to me at all, which is why I switched it off.

4

5 回答 5

3

你想要的实际上并不是混淆。

你想要的是一个像ASM这样的工具,它可以添加你想要的任何字节码,包括添加/更改方法。

于 2013-10-23T01:26:07.283 回答
2

您的任务非常有趣,但听起来它不是为 Java 字节码混淆器而设计的。

如果您想向某个项目添加无用的代码,为什么不只是添加另一个项目(或其中的一部分)。显然,添加的代码将是“有用的”:没有人真正从原始项目中调用它。您可以从完全不同的项目中添加部分源代码甚至字节代码。显然,这段代码将被写在不同的类中。

如果您想将代码添加到现有类中,您可能可以使用例如 CGLIB 开发自己的工具,该工具采用一些甚至现有的字节码并将其附加到您的类的字节码中。假设附加不会破坏现有类的一致性的静态方法。

于 2013-10-03T18:35:30.997 回答
1

如果您进行了混淆,请远离通过更改代码流和/或添加异常块等来修改代码的混淆器,从而使其难以反汇编。为了使代码不可读,通常只需更改方法、字段和类的所有名称即可。

于 2013-10-23T09:04:37.513 回答
0

在我看来,您正在寻找的东西(我强调“对我而言”,因为似乎每个响应者都有不同的看法)使您能够在现有的、有用的代码中生成代码,从而生成生成的代码将无用或次优代码混入其中。

起初我认为这个工具的目的是防止逆向工程,因为这里的关键词是“混淆”——即使代码不清楚或难以理解。但是你说你想要“无用”的代码。代码不一定要不清楚才无用。它只需要什么都不做。

所以现在的问题是,我们如何创建无用的代码?

我不知道,但有一个想法:您可以从包含无用元素的代码开始,然后对其进行优化。事实上,你的工具对我来说听起来很像代码优化器。您可以采用编写不佳的代码(向您的同事询问学生提交的代码?)并将其与代码优化器的结果进行比较。这会让您获得的不仅仅是未使用的方法和类。虽然现在我有一个问题(恕我直言):您的项目与代码优化器有何不同?

于 2013-10-26T15:12:23.083 回答
0

我不得不说我同意@dkatzel 给出的答案:看起来你真正需要的不是混淆。据我了解,混淆是为了使代码更难理解(为了实现不同的目的,如安全、防止复制等——提到的维基百科文章确实很好地解释了它)。

因此,考虑到正确完成的源代码(我的意思是,没有多余的部分或无用的代码,正如您所说),混淆它(在常识中)只会使代码难以理解而不改变其执行路径。这意味着混淆代码通常对代码性能没有(或很少)影响,这与您想要为测试生成的不同。例如,在这篇非常酷的文章 ( http://www.kahusecurity.com/2011/brilliant-javascript-obfuscation-technique/ ) 中提出的那种混淆对你没有帮助,对吧?(我的意思是,不管它是关于 Javascript,而不是 Java)

因此,我认为已经提供的答案(特别是关于在 Github 搜索东西和使用 ASM 的答案)是要走的路。有一个著名的 C 代码混淆代码锦标赛(http://en.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest),人们试图在其中发挥创造力,也许他们的源代码确实有无用的代码(尽管这不是主要意图)您可以在测试中使用(如果您发现类似的 Java 代码冠军 - 老实说我没有检查)。

在您的情况下,我还会考虑创建一个非常简单的源代码操作工具,该工具将直接在 .Java 文件中的随机有效位置插入无用的片段。您可以自己定义这些片段,例如:

  • { System.out.println("你好世界!"); }
  • { 字符串 s; for(int i = 32; i < 127; i++) s += (char) i; s = s.toUpperCase(); }
  • { new Thread(new Runnable() { public void run() { System.out.println("Hello world again!"); } } ).start(); }
  • ETC

由于我们正在谈论一项科学研究(您的博士项目),我同意您的观点,即易于复制初始原型的结果很重要。因此,通过使用这样的工具来添加已知对您的简单测试代码无用的片段,您可以进行预验证。但是,将来您可能还希望处理众所周知的源代码(例如,来自重要的开源项目),将其传递给您的删除无用代码工具,显示删除的代码,最后逻辑地争论删除的位无用,以及验证修改后的代码版本与前一个版本的输出(没有删除的东西)。

祝你研究顺利,伙计。:)

干杯

于 2013-10-26T15:23:31.363 回答