想通过JVMTI来加密类文件,但存在疑虑,高手请进

StateGrid 2008-04-29 10:19:35
最近想加密类文件,防止客户反编译。

我知道可以通过JVMTI来创建作为代理dll文件,让代理加密类文件,只要客户不反编译dll文件即可。

可是,是否允许多个-agentib参数同时存在? 如果允许,那末就没用了。客户也写个dll代理,我这个dll代理解密类文件载入到虚拟机后,客户自己写的dll文件再把载入的类输出成类文件,那就可以直接反编译了。

类似的还有-agentpath , -xrun , -javaagent

这些参数可以同时出现? 那末就是说可以支持多个代理,每个代理都可以监视虚拟机?

究竟是否允许多个代理?如果是这样,那我就没必要费力气了。
...全文
431 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alex-Lee 2012-04-03
  • 打赏
  • 举报
回复
Spring的问题怎么解决啊,用了这种方式加密,但spring的就报错...
mgsdkx 2010-04-21
  • 打赏
  • 举报
回复
好好好好
纪俊 2008-05-01
  • 打赏
  • 举报
回复
找到了官方资料:
JVMTI Environments
The JVMTI specification supports the use of multiple simultaneous JVMTI agents. Each agent has its own JVMTI environment. That is, the JVMTI state is separate for
each agent - changes to one environment do not affect the others. The state of a JVMTI environment includes:
the event callbacks
the set of events which are enabled
the capabilities
the memory allocation/deallocation hooks
Although their JVMTI state is separate, agents inspect and modify the shared state of the VM, they also share the native environment in which they execute. As such, an agent can perturb the results of other agents or cause them to fail. It is the responsibility of the agent writer to specify the level of compatibility with other agents. JVMTIimplementations are not capable of preventing destructive interactions between agents.

也就是说各自JVMTI互不影响(这是能成功挂接多个agent的原因)但是共享VM与Native环境(这是后来多个VM Start事件中我输出多个printf结果只有一个被输出的原因)。处理多个Agent之间互相影响的关系看来比较复杂。
纪俊 2008-04-30
  • 打赏
  • 举报
回复
刚才实验了下,通过-agentpath和-agentlib成功加载了俩agent,这里边俩agent如果是hook不同的事件是不会互相影响而各自执行的,而如果callback挂接同一个事件只会执行一个,而具体执行哪个我还没找出规律,希望楼下的高手帮忙解答。
shili150 2008-04-30
  • 打赏
  • 举报
回复
关注中
StateGrid 2008-04-30
  • 打赏
  • 举报
回复
帮帮忙啊!
众所周知,Java编译后的Jar包和Class文件,可以轻而易举的使用反编译工具(如JD-GUI)进行反编译,拿到源码。为了保护自己发布的Jar包和Class文件,采用的方式大多是混淆方式,这种方式对于Class文件加密是不彻底的,还是能够通过分析得出核心算法。本工具是采用jvmti方式对Class文件进行加密,使用C++生成加密和解密库,先用加密库对Jar包进行加密,将加密后的Jar包及解密库文件发布出去,执行时候需要JVM引入解密库文件,解密后执行。c++的.dll文件和.so文件的破解难度是很大的,这就能有效的保护软件和代码的知识产权. 使用方法: 1.打开windows命令行(运行=>cmd=>回车),在命令行中 进入 EncryptJar目录 2.执行 java -jar encrypt.jar 3.输入h,然后回车,可以看到帮助菜单 4.输入3,然后按回车键,进入加入jar文件功能 5.输入要加密的jar文件的路径 6.提示输入秘钥(key)的时候,直接回车,不要输入任何字符(否则后面classhook将不可解密加密后的jar包) 7.输入目标路径(加密后的jar文件路径,此处要注意:jar文件名要保持相同,将加密后的文件保存到不同的目录) 8.将加密后的jar包,替换原来的没有加密的jar包,与要发布的程序一起进行发布.(一般替换lib目录下对应的jar包即可) 9.加密后的jar包运行方法: windows下: 拷贝libClassHook.dll文件到程序的根目录(通常为要执行的jar程序的根目录) 使用以下命令启动程序: java -agentlib:libClassHook -jar xxxxxxxxxxx.jar 则在运行过程中会自动进行解密操作(解密过程是运行过程中用c++的dll进行解密的,可以有效防止破解class文件) 如果执行过程报错,可将程序根目录添加到环境变量path中去 Linux下: 拷贝libClassHook.so到程序的根目录(通常为要执行的jar程序的根目录) 使用以下命令启动程序: java -agentlib:ClassHook -jar xxxxxxxxxxx.jar (这里要删除掉lib,linux系统下会自动补全) 则在运行过程中会自动进行解密操作(解密过程是运行过程中用c++的dll进行解密的,可以有效防止破解class文件) 如果执行过程报错,可以在程序根目录下执行以下语句:export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH 或将libClassHook.so 拷贝到/usr/lib目录中去。 支持操作系统:加密请在windows64位系统并安装了64位jdk环境下进行。 需要解密运行的程序支持LINUX(64位)和windows(64位)安装了JDK1.8以上的系统。 测试程序: (t_lib目录下的jar包为经过加密的jar包) java -agentlib:libClassHook -jar test.jar

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧