Java加密内存类加载器

Java加密内存类加载器,java,class,memory,loader,encryption,Java,Class,Memory,Loader,Encryption,我会直截了当地说,这样你就不必读太多了 基本上,我有一个AES-128位加密的Jar文件。我想制作一个启动器,这样我就可以将这个加密的Jar加载到内存中并运行它(使用密钥) 我有一个简单的类加载器可以工作,尽管除非我将它解密到一个目录并运行它,否则它显然无法完成我需要的工作(解密和内存加载) TL;DR:我需要在内存中运行一个AES-128位加密的Jar 非常感谢您的帮助,请随时提问 有关如何从字节[]加载jar/类的示例代码(这应该是在内存中解密后得到的结果/无需将其保存在文件系统中的任何位置

我会直截了当地说,这样你就不必读太多了

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

我有一个简单的类加载器可以工作,尽管除非我将它解密到一个目录并运行它,否则它显然无法完成我需要的工作(解密和内存加载)

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


非常感谢您的帮助,请随时提问

有关如何从
字节[]
加载jar/类的示例代码(这应该是在内存中解密后得到的结果/无需将其保存在文件系统中的任何位置),请参阅

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

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

通过实现自定义JVM和/或预JIT代码,使其成为本机代码,可以实现一点安全性。。。有关某些信息,请参阅《示例》

这本书很好地说明了为什么不可能对代码进行气密保护。您可以通过尽可能低的级别使其变得更加困难,甚至非常困难,例如,将代码编译为本机指令,这些指令不能(干净地)使用常规语言结构表示


但您应该记住,在任何情况下,最终您的加密数据都必须使用某个密钥进行解密,并且该密钥将(即使只是短暂地)结束,但重要的一点是,它将在内存中结束。普通的操作系统和硬件无法解决这个问题。因此,作为一名黑客,你可以随时从内存中提取密钥,然后从那里开始反向工作。这不是一般用户所能做到的,但确实是可能的。

如果您希望代码具有这样的安全性,您可能不应该使用最容易反编译的语言之一来编写代码。编写一个jar加载器是可能的,但无法阻止人们从内存中转储它,它需要用Java编译。不是因为我不能用其他语言编写代码,而是更多的是,其他语言不支持我所做的工作。@0x5f3759d,C,C#,。。任何语言都可以。这可能需要5分钟的时间,但最终如果有人想要jar文件,他将很容易获得密钥(在调试器中为CreateFile和consorts设置一个断点,可能为ReadFile添加一个断点,并使用找到的fd,您将很容易获得它)。虽然我没有真正看到这里的问题-如果你已经有了类加载器,是什么阻止你读取和解密文件?也就是说,你的实际问题是什么?@Voo我不知道有什么东西能很好地将编译好的C/C++代码反编译回源文件。您当然可以查看程序集,但使用Java/.NET提供的近乎原始的代码可以使反编译更加容易。@0x5f3759df我不是说“反编译整个程序并查看数百万条不可读的c行”,我是说“检查他何时打开/读取文件,并按照少数行进行操作,直到他解码为止”-这在两种/所有语言中都是微不足道的。如果你使用导入的函数来解码文件,那就更简单了。谢谢!我会尝试一下,让你知道它是如何工作的。我还认为一个更简单的选择是创建一个包含解密的jar/字节的临时文件。我将临时jar加载到内存中,然后将其从临时文件夹中删除。。。请不要忘记对任何有帮助的答案进行投票/标记为已接受!我需要获得15个声望才能投票。但当我达到15次代表时,我一定会的!