【问题标题】:Java Encrypted Memory Class LoaderJava 加密内存类加载器
【发布时间】:2011-12-13 02:42:51
【问题描述】:

我会直截了当,这样您就不必阅读太多。

基本上,我有一个 AES-128 位加密 Jar 文件。我想制作一个启动器,以便我可以将这个加密的 Jar 加载到内存中并运行它(使用密钥)。

我有一个简单的类加载器,但除非我将它解密到一个目录并运行它,否则它显然不会做我需要的事情(解密和内存加载)。

TL;DR:我需要在内存中运行 AES-128 位加密 Jar。

非常感谢任何帮助,请随时提出问题!

【问题讨论】:

  • 如果您希望您的代码如此安全,您可能不应该使用最容易反编译的语言之一来编写它。可以编写一个 jar 加载器,但没有办法阻止人们只是从内存中转储它。
  • 需要用Java编译。不是因为我不能用其他语言编写代码,而是因为其他语言不支持我正在做的事情。
  • @0x5f3759d 对于 C、C#、.. 以及任何语言都是如此。这可能需要更长的时间 5 分钟,但最后如果有人想要 jar 文件,他会很容易地获得密钥(在调试器中为 CreateFile 和 consorts 设置一个断点,也许用找到的 fd 为 ReadFile 添加一个断点,你会得到它很容易)。虽然我在这里并没有真正看到问题 - 如果您已经拥有类加载器,是什么阻止您读取文件并解密它? IE。你的实际问题是什么?
  • @Voo 我不知道有任何东西可以将已编译的 C/C++ 代码反编译回源文件。您当然可以查看程序集,但拥有几乎像 Java/.NET 这样的原始代码可以让反编译变得更加容易。
  • @0x5f3759df 我不是说“反编译整个程序并查看数百万不可读的 c 行”,我说的是“检查他何时打开/读取文件并遵循少数几行直到他解码它” - 这在两种/所有语言中都是微不足道的。哎呀,如果您使用导入的函数来解码文件,那就更简单了。

标签: java class memory loader encryption


【解决方案1】:

有关如何从 byte[] 加载 jar/类的示例代码(这应该是您在内存中解密后得到的结果/无需将其保存在文件系统中的任何位置)请参阅 http://www.javaworld.com/javaworld/jw-10-1996/indepth/indepth.src.html

基本上你需要使用defineClass来实现你想要的。

但请注意,这并没有提供真正的安全性,因为所有最终(解密后)都作为内存中的 Java 字节码,因此可以访问/操作/保存等。

通过实现自定义 JVM 和/或对代码进行预 JIT 以使其成为原生代码,可以实现一点安全性...有关一些信息,请参阅例如 How to create encrypted Jar file?

【讨论】:

  • 谢谢!我会尝试一下,让你知道它是如何工作的。我还认为一个更简单的选择是创建一个包含解密的 jar/字节的临时文件。我将临时 jar 加载到内存中,然后将其从临时文件夹中删除。
  • 不客气...请不要忘记投票/标记为已接受任何有帮助的答案!
  • 我需要获得 15 声望才能投票。但当我达到 15 次代表时,我一定会这样做!
【解决方案2】:

This article 是一本很好的读物,它很好地说明了为什么对您的代码进行气密保护是不可能的。即使保持尽可能低的水平,你也可以让它变得更难,非常难,例如将您的代码编译为使用常规语言结构无法(干净)表示的本机指令。

但是您应该记住,在任何情况下,最终您的加密数据都必须使用某个密钥进行解密,而该密钥即使只是短暂的,也会被解密,但重要的是它最终会存储在内存中。使用通用操作系统和硬件无法解决此问题。因此,作为一名黑客,您总是可以退回到从内存中获取密钥并从那里向后工作。不是普通用户能够做到的,但肯定是有可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多