我怎么锁编Java类,以防止反编译?

我知道这必须很好讨论的主题在互联网上,但我不能出任何结论之后,参照他们。

许多人建议混淆,但他们只是做重新命名的课程、方法和领域与难记的字符序列,但对于敏感的恒的价值观?

例如,你已经开发出的加密和解密的组件基于基于密码加密技术。现在,在这种情况下,任何平均Java人可以使用 JAD 反编译类文件中的并容易检索的密码,价值(定义为不断)以及 而又能解密数据通过编写独立的小节目!

或者应该这样的敏感部件须建立在本机代码(例如,VC++),并呼吁他们通过 JNI?

有帮助吗?

解决方案

一些更先进的Java码obfuscators做更多类的名称只是重整的. Zelix KlassMaster, 例如,也可能扰乱代码流的方式,使得它真的很难跟踪并作为一个优秀的代码优化...

也许多obfuscators也能够争夺你的常量和清除未使用的代码。

另一个可能的解决方案(不一定排除了模糊处理)是使用 加密的罐子的文件 和一个自定义类装入器不会解密(最好使用本地运行时间图书馆)。

第三个(以及可能提供最强的保护)是使用当地时间提前编译器喜欢 海湾合作委员会怡东酒店喷, 例如,汇编Java代码直接向一个平台,具体地的二进制的。

在任何情况下你得要记住,正如俗话所说在爱沙尼亚"锁是对动物"。意思是每一位代码(载入存储器)期间,运行时间和给予足够的技巧、决心和动力,人们可以和将反编译、解读和破解你的代码...你的任务就是使这一进程为不舒服,你可以和仍保持工作...

其他提示

只要他们有访问的加密数据和软件,进行解密,有基本上是没有办法可以让这个完全安全。这已经得到解决之前是使用某种形式的外部黑盒子到处理加/解密,如转换器、远程认证服务器等等。但即便如此,鉴于用户已经完全进入他们自己的系统,这只会使事情很困难的,不是不可能的-除非你可以把你的产品直接的功能存在"黑箱",以说,在线游戏服务器。

免责声明:我不是一个安全专家。

这听起来像是一个糟糕的想法:你让某个人进行加密的东西一个"隐藏"的关键,你给他。我不认为这可以由安全。

也许不对称的钥匙可能的工作:

  • 部署一个加密的许可证与公密钥解
  • 让我们的客户创建一个新的许可证,并把它送给你加密的
  • 送一个新的许可证回到客户。

我不知道,但我相信,客户可能实际上加密的许可证关键的公共钥匙你给了他。然后你可以解密这你的私人钥匙并重新加密。

你可以保持一个独立的公共/私人钥匙对每个客户的,以确保实际上,你得到的东西从权利客户-现在 你的 负责的钥匙...

无论你做什么,它可能是'反编译'.哎呀,你可以拆开它。或者看一个存储器转储找到你的常数。你看,计算机需要知道他们,所以你的代码需要。

做什么呢?

尽量不要船舶的关键作为一个硬编码不断在你的代码:保持它作为每用户设置。使用者负责寻找之后,关键。

@jatanp:或者更好的是,它们可以进行,删除的许可代码,以及重新编写。用爪哇,我真的不认为有一个适当的,黑客-证明解决这个问题。甚至不是一个邪恶的小狗可以防止这种与Java。

我自己的企业管理人员担心这个,我想太多了。但是,再说,我们销售我们的应用程序投入的大型企业往往遵守授权条件--通常是一个安全的环境由于会计和律师。该法的反编译本身可能是非法的,如果你许可证写的是正确的。

所以,我要问你 真的 需要硬化的保护就像你寻找你的应用程序?什么是你的客户基看起来像什么?(企业?或青少年的玩游戏的人群众,这将更多的问题?)

如果你是在寻找一个解决方案的许可,可以检查出来的 TrueLicense API.这是基于使用的不对称的钥匙。然而,这并不意味着你的应用不能破裂。每个应用程序可以被破解与足够的努力。什么真正重要的是,作为 斯图回答, ,找出如何加强保护需要。

我不认为存在任何有效脱机的反盗版方法。视频游戏行业已经尝试发现,许多时间和他们的计划始终破裂。唯一的解决办法是,程序必须运行网络连接的服务器,这样就可以检验lincense的关键,并且只有一个活跃的connecion由被许可人的时间。这是怎么了 世界的魔兽恶魔 工程。即使是艰难的,有的私人服务器开发他们绕过了安全性。

说了这番话之后,我不认为,中期大型公司使用非法复制的软件,因为成本的许可证他们是最小的(也许,我不知道你是多么goig收取费用你的节目)相比的成本的一个试验版本。

你可以使用的字节的代码加密的没有恐惧。

事实是,以上引用的文件"裂Java字节的代码加密的"包含一个逻辑的谬论。主要权利要求的纸 运行前,所有类必须解密和传递的 ClassLoader.defineClass(...) 方法.但这是不正确的。

假设错过了这里 前提是他们在真实的,或者标准,java运行时的环境.没有什么可以效劳的保护java应用程序不仅可以启动这些课程但即使是进行解密,并通过他们 ClassLoader.换句话说,如果你是在标准java运行环境,你就不能拦截 defineClass(...) 方法,因为标准java没有API为此目的,并且如果使用修改java运行环境与修补 ClassLoader 或任何其他"黑客技巧"你不能这样做,因为保护java程序将不在所有的工作,因此你将没有什么可以拦截。绝对并不重要"补丁搜索"是用或欺骗使用由黑客的攻击。这些技术细节是一个非常不同的故事。

问:如果我加密我.类文件和使用定制的类装入器的负载和解它们的飞行,这将防止反编译?

A:问题的预防Java字节的代码的反编译几乎是一样古老的语言本身。尽管范围内的混淆的可用工具的市场上,新手Java程序员继续思考新的和巧妙的方式来保护他们的知识产权。在这Java Q&A部分中,我消除一些神话围绕着一个想法经常改头换面的讨论论坛。

极端轻而易举地Java。类文件可能重建为Java源,密切类似于原稿有很多事要做Java字节的代码设计目标和取舍。除其他事项外,Java字节的代码是专为紧凑性,平台的独立性,网络的移动性,且便于分析字节的代码翻译和准时(时)/热点的动态编译器。可以说,编制。类文件表达的程序的意图如此明确它们可能更易于分析比原来源的代码。

几件事情可以做到的,如果不防止反编译全,至少是使它更加困难。例如,作为后编辑的步骤,你可以按摩。类数据使字节的代码的更加难以读时的反编译或难以编入有效的代码(或两者)。技术执行极端的方法的名字载的工作以及对于前者,和操纵控制流程以建立控制结构不可能代表通过Java法工作以及后者。更多的成功的商业obfuscators混合使用这些和其他技术。

不幸的是,这两种方法实际上必须改变码JVM将运行,以及许多用户都害怕(这是理所当然的),这种转变可能会增加新的错误,他们的应用。此外,法和域名可能会导致反射呼吁停止工作。改变实际的类和包名称可以打破其他几个Java Api(JNDI(Java命名和目录口),网址供应商,等等)。此外,以改变姓名,如果该协会之类的字节的代码失调和来源的线号码被改变,恢复原来的例外堆的痕迹可能成为困难。

然后有选择的混淆原Java源代码。但是从根本上说这会导致一个类似的问题。加密,不混淆?

也许上面已经做了你想想,"那么,如果不是操纵字节的代码,我密所有我的课后汇编和解它们在飞行中的内部JVM(它可以做一个自定义类装入器)?然后JVM执行我的字节的原始代码但没有什么反编译或反向工程师,对吧?"

不幸的是,你将是错误的,无论是在想,你是第一个来这个想法,并在认为它的实际工作。其原因有什么用你的加密方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top