如何检索字节码并制作哈希,以查看是否有人在内存中或文件中操作了我的字节码?
编辑: 签署二进制文件是否可以保护代码不被修改和执行?我想保护我的用户不要确保他们正在运行我的软件。我还想保护程序(服务器)不被被黑客攻击的客户端使用。
如何从服务器端检测是否有人篡改了我的客户端?
答案 0 :(得分:15)
因此,您试图通过操作应用程序来阻止某些进程与您的应用程序具有相同(或更高)的权限级别?
这是一项注定要失败的任务。因为如果您添加了安全检查,那么什么会阻止攻击者通过将其替换为简单的isSecure()
来修改您的return true;
方法?
答案 1 :(得分:8)
我认为您需要澄清您的要求(至少我无法理解您的要求)。
在安全相关领域,您总是需要回答两个问题,因为您甚至可以开始解决问题:
在您的情况下,我相信您正在尝试保护Java客户端的类文件不被修改。在这种情况下,答案取决于(潜在)攻击者可以做什么。
如果攻击者在客户端运行的计算机上实际拥有管理员权限,那么您基本上无法做任何事情。正如上面的saua指出的那样,如果你不能相信你正在运行的系统,你就注定要失败。
如果攻击者只能在之前修改类文件,他们就会到达客户端,那么签署JAR文件就会让客户检测到操作。
答案 2 :(得分:7)
也许您想改为sign your jar files?
通过添加自定义Transformer,可以通过Intrumentation实现所需。见http://java.sun.com/j2se/1.5.0/docs/api/java/lang/instrument/package-summary.html
自定义类加载器也可以完成这项工作,因为它在定义类时会获得字节码。
答案 3 :(得分:5)
如果有人篡改我的客户端,我如何检测服务器端?
你做不到。在互联网上,没有人知道你是不是一只狗; - )
严重:服务器端唯一可以对客户端做出任何假设的选项是通过网络发回的信息。通过加密协议并使其足够难以进行逆向工程,您可以使入侵者难以入侵客户端,但并非不可能。
答案 4 :(得分:2)
您可以创建自己的类加载器并手动进行检查,或您可以签署代码并让java运行时为您完成工作。
答案 5 :(得分:1)
签名jar将保护代码不被修改。签名涉及根据您的私钥创建签名。公钥嵌入带有这些签名的jar中。 Java将根据您的公钥验证签名,并拒绝加载修改后的类。
被黑客攻击的客户端有点难以预防。首先,攻击者必须对您的协议进行逆向工程。您可以通过Java混淆器向防止这种情况迈出一步,但最终攻击者可以只看到线路并对流量中的协议进行反向工程。即使您加密客户端 - 服务器通信(这并不容易,考虑使用已经为您执行的协议... SSH或HTTPS),您最终仍会感受到中间人攻击
你究竟想要保护什么?
答案 6 :(得分:0)
在客户端上,您可以使用jar中类文件的路径名调用getResourceAsStream。
这回答了你问题的一部分(“我如何检索字节码”)。其他答案很好地涵盖了较大的问题。