下载Java类文件&跑?

时间:2013-04-20 00:21:09

标签: java

好的,我正在尝试为我的Java类文件添加安全性。我不希望它被反编译。所以我所做的就是创建一个登录系统,java应用程序通过Web请求对其进行检查。如果登录信息正确,那么它将运行脚本。但是,我希望进一步提高安全性并在线托管类文件。

如何下​​载&运行在线托管文件?

此外,当app /脚本停止运行或关闭时,.class文件将被删除。

我更喜欢没有下载文件的地方,只需从在线服务器上获取并编译/运行。

2 个答案:

答案 0 :(得分:5)

让我们来看看你做过的事情,以及你想要做的事情,看看它们是否真的有效:

  • 要求输入密码。这很容易打败:
    1. 捕获类文件。
    2. 反编译。
    3. 确定远程调用进行登录检查的位置,并检查响应。
    4. 修改字节码以删除所有内容。
  • 不是安装类文件,而是按需下载并在完成后将其删除。也很容易打败。
    1. 捕获下载文件的网络请求。
    2. 使用(例如)curlwget重播请求并捕获下载的类文件。
    3. 按上述步骤进行。

变化也相对容易失败:

  • 最终可能会通过手动反编译和/或使用调试器运行字节码来最终消除模糊处理。
  • 使用一次性密钥或其他东西下载可以通过逆向工程程序并在使用之前提取一次性密钥来解决。
  • 加密字节码可能会失败,因为JVM必须在某些时候以解密的形式提供字节码。因此,字节码的解密方法必须嵌入到代码中......可以进行逆向工程。

最重要的是,不可能阻止熟练和坚定的人打败依赖于控制他/她自己的执行平台的用户保密的安全方案。

你可以做的最好的事情就是阻止技术含量低的攻击者,并减慢熟练的攻击者的速度。你需要问问自己......真的值得努力吗?

(注意:无论您使用何种实现语言,都会遇到同样的问题。)

答案 1 :(得分:1)

创建一个新的URLClassLoader(“默认”Java类加载器)并将其指向保存文件的位置:

// the directory where you're saving the .class file
File tmpDir = new File("/tmp/yadda/blah/");
ClassLoader cl = new URLClassLoader(new URL[] { tmpDir.toURI().toURL() }, Thread.currentThread().getContextClassLoader());
Class<?> cls = cl.loadClass("SuperSecretClass");
// use reflection to instantiate cls, call methods, etc.

(在非webapp中传递父类加载器可能不是必需的,但是我太懒了,不能测试那个细节。显式地使用线程的类加载器会以某种方式工作。

这假定你的秘密类不在一个包中,如果你必须在临时目录中创建适当的目录结构,并像往常一样将类加载器指向包树的根目录。

另外:这种默默无闻的安全听起来像个坏主意。您仍然在下载该文件,如果它是通过不安全的连接,确定的攻击者可以嗅探它,并且仍然存在它在磁盘上的时间段。您可以创建一个直接读取流的完全自定义ClassLoader,但即使是类文件也可以通过更多的努力来恢复。 (比如将调试器指向主应用程序并拦截流读取。)javadoc for ClassLoader提供了如何执行此操作的示例。