⽤Golang来保护Java程序
#反编译带来的困扰
对于⼀个开发给⾃⼰组织内部⽤的程序,我们是不怎么需要考虑程序被反编译的事情的,但是对于商业软件来说,这⼜显得有必要,毕竟国内软件⾏业的竞争还是⾮常的激烈,⼤家可以把竞争对⼿的程序搞过来反编译⼀下(⾄于怎么拿别⼈的程序我相信⼤家都已经很⽼⼿了),轻易的知道对⼿基于什么软件来做,或者能够⽐较容易知道实现原理,然后。。抄抄抄,换个名字,完事,⼀个全新的产品就出来了。对
于 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/samuelngs/binary-go
安装完之后,我们执⾏
binary -dir ./[静态⽂件位置] -out binary
就会产⽣出许多的go⽂件,默认它是以20M为⼀个进⾏分拆的。
分拆后,我们可以通过binary提供的⽅法帮我们把这个包重新还原回来。go和java后端开发劣势
#怎么从⼆进制流启动Jar
打包好程序后,接下来就是启动的问题了。虽然能把Jar从⼆进制还原回来,不过java没法从⼆进制流启动啊。或者在外⾯再放⼀个壳,然后动态加载反射调⽤。但是换个⾓度来看,其实也可以通过⼀些⼩技巧来实现的。每次启动的时候把我们的jar包随机放到⼀个⽬录,每次启动的时候这个jar包的名字也随机给。
让Jar随机出现在不同的位置主要⽬的是减少被蹲点的⼏率
然后⽤Golang来执⾏命令⾏启动,完成启动之后就把这个随机⽣成的jar包⼲掉。这样⼀系列操作之后,⼀个伪装成Go的胖胖的Jar也就出来了。
#⽅案的优缺点
##优点
简单,省事:⽐起ZKM这种⿇烦⽽且收费的混淆器,这个⽅法简单多了
多了⼀层壳,更安全⼀些:⽐起普通的Jar,这个⽅法多了⼀层壳,能够把⼀些⽔平⽐较⼀般的⼩伙伴拒之门外,ps⼀下发现有个jar,但是⼜不知道这个jar在什么位置。想反编译⼀下发现是个⼆进制⽂件反编译难度有点⼤。或者⼲脆⼀看是个⼆进制就放弃了。。。
##缺点
还是有机会被蹲点,然后把Jar拿出来继续反编译
对于保密性要求很⾼的场景这种⽅案显得不太合适,还是需要内部继续混淆,当然再多⼀层壳反射调⽤应该会更好⼀些
....欢迎补充
总结:
思路上可以规划为⼀种加壳思路,属于⼀代加壳,是不是可以想办法往⼆代抽离等进⾏演进,有待动⼿去实验。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论