用Golang来保护Java程序

本文探讨使用Go语言作为外壳保护Java Jar文件免受反编译的方法。通过将Jar文件转换为Go的静态资源,再利用Go执行命令行启动随机放置的Jar,增加反编译难度。此方法简单且成本低,尤其适用于商业软件保护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#反编译带来的困扰

对于一个开发给自己组织内部用的程序,我们是不怎么需要考虑程序被反编译的事情的,但是对于商业软件来说,这又显得有必要,毕竟国内软件行业的竞争还是非常的激烈,大家可以把竞争对手的程序搞过来反编译一下(至于怎么拿别人的程序我相信大家都已经很老手了),轻易的知道对手基于什么软件来做,或者能够比较容易知道实现原理,然后。。抄抄抄,换个名字,完事,一个全新的产品就出来了。对于 Java 来说这个问题就更加明显了。虽然有类似ZKM这样的商业软件来进行混码,但是混码后只要你有耐心,还是有很大机会能读懂的

在这里不得不吐槽一下,ZKM实在太难用了

#尝试用Go来保护我们的Jar文件

这里我们只讨论胖胖的Jar包(就是那种全部都打在一起直接java -jar就能跑的包,例如Spring Boot打出来的,这个叫法是不是有点萌(○’ω’○) )。

对于防止反编译来说,Golang这类打包出来就是二进制的方式其实就非常适合,打包成二进制之后的程序反编译难度比起一个普通的Jar来说难度会高很多。

对于新写的程序来说,Go其实是个挺好的选择,可以省去反编译带来的问题

那是不是把Jar包放到Go里面打包就可以了呢?恩,是的。不过go build的时候只会对go文件进行编译打包,静态文件是不会被包括进去的。所以就需要通过Golang的一些静态资源库来进行操作。把Jar包作为静态文件来处理。然后把各种静态文件打包成go文件,binary-go就是其中一个合适的选择

go get -u github.com/samuelngs/binary-go

安装完之后,我们执行

binary -dir ./[静态文件位置] -out binary

就会产生出许多的go文件,默认它是以20M为一个进行分拆的。

用Golang来保护Java程序

分拆后,我们可以通过binary提供的方法帮我们把这个包重新还原回来。

#怎么从二进制流启动Jar

打包好程序后,接下来就是启动的问题了。虽然能把Jar从二进制还原回来,不过java没法从二进制流启动啊。或者在外面再放一个壳,然后动态加载反射调用。但是换个角度来看,其实也可以通过一些小技巧来实现的。每次启动的时候把我们的jar包随机放到一个目录,每次启动的时候这个jar包的名字也随机给。

让Jar随机出现在不同的位置主要目的是减少被蹲点的几率

然后用Golang来执行命令行启动,完成启动之后就把这个随机生成的jar包干掉。这样一系列操作之后,一个伪装成Go的胖胖的Jar也就出来了。

#方案的优缺点

##优点

  • 简单,省事:比起ZKM这种麻烦而且收费的混淆器,这个方法简单多了
  • 多了一层壳,更安全一些:比起普通的Jar,这个方法多了一层壳,能够把一些水平比较一般的小伙伴拒之门外,ps一下发现有个jar,但是又不知道这个jar在什么位置。想反编译一下发现是个二进制文件反编译难度有点大。或者干脆一看是个二进制就放弃了。。。

##缺点

  • 还是有机会被蹲点,然后把Jar拿出来继续反编译
  • 对于保密性要求很高的场景这种方案显得不太合适,还是需要内部继续混淆,当然再多一层壳反射调用应该会更好一些
  • ....欢迎补充

总结:

思路上可以规划为一种加壳思路,属于一代加壳,是不是可以想办法往二代抽离等进行演进,有待动手去实验。
 

NET程序员的开发利器.NET Reflector 一、 简介   程序集,作为.NET时代的动态链接库,蕴藏了太多的软件秘密。为此,Visual Studio内置的ILDASM成为最初挖掘程序集的上佳工具。但自从Reflector出现后,ILDASM相形见拙。因为,Reflector能提供更多的程序集信息,而且是免费的工具。   如今,在Visual Studio.NET中编译源代码(无论是VB还是C#)时,编译器都会将高级源代码翻译成MSIL,即“微软中间语言”,而不是特定的机器指令。具有更多安全性、版本控制、共享能力与其它相关元数据的中间语言(IL),是包在一个或多个DLL或可执行文件中的。   基于ILDASM检查程序集中的IL有时很有用,但它要求我们熟悉MSIL。通常,比起IL,大多数开发人员对像C#或Visual Basic这样的高级程序设计语言更为熟悉。   Reflector的出现使.NET程序员眼前豁然开朗,因为这个免费工具可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转换为C#或Visual Basic以外,Reflector还能够提供程序集中类及其成员的概要信息、提供查看程序集中IL的能力以及提供对第三方插件的支持。   二、 下载与运行Reflector   Reflector是由微软员工Lutz Roeder编写的免费程序。这个软件经常更新,你可以在http://www.aisto.com/roeder/dotnet下载最新的版本。在本文成文之时,Reflector的最新版本为5.0.35.0,仅有1M大小。只要双击下载后的Reflector.exe文件即可运行Reflector。   默认情况下,Reflector会打开一组公共程序集(mscorlib、System、System.Data、System.Drawing等等)。每个打开的程序集都列在Reflector的主窗口中。单击程序集旁边的+图标可以展开树结构并展示程序集的命名空间。每个命名空间旁边都有一个相关的+图标,单击这个图标将显示这个命名空间内的类。除此以外,还可以展开每个类,显示类的成员:事件、字段、方法与属性。   要想查看其它程序集(包括我们自己创建的程序集)的细节,你可以使用菜单命令“File→Open”。然后,浏览到想要查看的程序集。只要选择了有效的.NET程序集,这个程序集就可以在Reflector的主窗口中与其它默认程序集共同显示。要想从Reflector的主窗口中删除程序集,只需右击程序集并选择“Close”。   三、 使用Reflector反汇编程序集   提供基本的程序集是Reflector唾手可得的功能,然而,Reflector真正的威力体现在它的反汇编能力。只要浏览到类级的成员,就可以通过Tools菜单中的Disassembler项(或在该项上单击右键)反汇编此成员。这将打开第二个窗格,以C#、Visual Basic、Delphi或者IL显示反汇编后的内容。图2以C#语言展示了对SmtpClient类中Abort方法的反汇编结果。   有了Reflector的反编译功能,要研究.NET框架基类库就容易多了。我们完全可以在没有源代码的情况下研究我们所创建或者正在使用的程序集相应源代码。   不用太担心,你自己的.NET应用程序还有其它受保护措施。但是,想阻止别人查看.NET程序集的IL(继而反编译成C#或者Visual Basic)是不可能的,但你可以使用“混淆”技术使IL变得混乱。目前,市场上有许多.NET混淆产品,比如:PreEmptive Solution的Dotfuscator、WiseOwl的Dmeanor以及Remotesoft的.NET Obfuscator等。   四、 Reflecator的其它功能   除了作为对象浏览器与反汇编器之外,Reflector还可以显示类与其成员的调用与被调用图、提供单键访问Google或MSDN搜索的能力并提供了允许第三方开发人员为Reflector创建插件的框架。   要查看调用或被调用图,只需要在树视图中选择一个成员,访问Tools菜单,选择Call Graph或Callee Graph选项即可。Call Graph会列出所选项所调用的成员,而Callee Graph列出调用所选项的成员。   通过使用插件,Reflector的功能可以得到进一步扩展。目前有能显示程序集依赖图、自动加载当前运行中的程序集、输出整个程序集的反汇编内容以及在Visual Studio中作为Reflector的宿主等的插件。还有更多插件都列在http://www.codeplex.com/reflectoraddi
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值