JVMTI加密jar包,防止反编译

简介

Java虚拟机工具接口(JVMTI)提供了一个编程接口,允许开发人员创建可以监视和控制Java编程语言应用程序的软件代理。关于JVMTI的官方说明:

通俗的说,就是用外部平台(例如C/C++)生成动态链接库(windows ⇒ dll,linux ⇒
so),给指定的二进制的class文件中插入一段数字,进行篡改,使其无法被JD-GUI用简单的AST抽象语法树进行反编译,在运行 jar
包时,再通过dll/so文件实现解密。

JNI结构图
在这里插入图片描述
JNI code映射
在这里插入图片描述

更多想要了解JVMTI的参考 https://developer.ibm.com/zh/articles/j-lo-jpda2/

反编译软件 JD-GUI :http://java-decompiler.github.io/http://java-decompiler.github.io/

动态链接库

分加密模块和解密模块,由c实现,windows下面是dll,linux下面是so
加密模块通过JNI native方式调用,解密通过JVMTI的Agent_OnLoad实现
代码已上传到github https://github.com/wangshulun/jvmti-encrypt
C功能的目录结构如下
在这里插入图片描述
需要额外引入java的头文件jni.h、jni_md.h、jvmti.h、jvmtiagent.h,文件位置在jdk根目录的include文件夹和include/windows(linux)下。
framework.h pch.h是vscode2017默认生成的,build时存在一些强校验,在CLion等其他ide里面不会有这种,不用在意。
SourceFiles下面的jarencrypt.cpp jvmtiagent.cpp jvmtimain.app是具体的实现
在windows下build会生成dll文件,加解密会用到

步骤

1、加密实现

定义加密的native code实现,需要注意的一点是定义JNICALL的方法时的命名规则:Java_package{.换成下划线}_类名_方法名,这个需要和java code 注册的位置保持一致,否则native方法注册失败
下面代码是通过c语言对Java class文件的一个简单加密方式,可替换成自定义的加密实现

#include <iostream>
#include <stdlib.h>
#include "jni.h"
using namespace std;
//https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html
extern "C" JNIEXPORT jbyteArray JNICALL Java_com_allen_bytecode_ByteCodeEncryptor_encrypt(
	JNIEnv * jni_env,
	jobject  arg,
	jbyteArray _buf) {
   
	jbyte * jbuf = jni_env->GetByteArrayElements(_buf, 0);
	jsize length = jni_env->GetArrayLength(_buf);

	jbyte *dbuf = (jbyte *)malloc(length);
	int index = 0;
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JVMTIJava虚拟机调试接口的缩写,它是Java平台提供的一组原生接口,可以帮助开发者在Java虚拟机层面参与程序的调试和分析过程。JVMTI可以为开发者提供很多方便的调试工具,比如断点、内存泄漏检查、垃圾回收统计信息等等。但是JVMTI本身并不提供加密jar包的能力,因为它的主要作用是提供开发者在运行时操作虚拟机的接口,而不是加密jar包。 如果您想对Java程序的jar包进行加密或者保护,您可以考虑使用Java加密扩展(JCE)这个Java API。JCE可以帮助您实现加密通信、数字签名和安全密钥管理等功能。JCE的加密算法包括DES、AES、RSA等多种标准算法,也支持其他自定义算法。使用JCE加密jar包可以保护您的程序不被反编译或者恶意利用,同时也可以保护数据的机密性和完整性。 总之,JVMTI和JCE都是Java平台提供的重要接口,但是它们的作用不同,前者主要用于开发和调试,后者则是用于加密和保护数据安全的。如果您需要对Java程序进行加密保护,建议使用JCE这个Java API。 ### 回答2: JVMTIJava虚拟机工具接口的缩写,是JDK 1.5加入的一项新功能,它提供一组API,可以在运行时监控、检测和管理Java虚拟机和Java应用程序。JVMTI可以被用于加密Java程序的JAR包加密JAR包的目的在于保护Java程序的源代码,防止别人拷贝或查看程序的源代码。使用JVMTI进行JAR包加密的步骤如下: 1. 创建一个新JAR文件,可以使用Java工具命令创建。 2. 将需要加密JAR文件和一个密钥文件放入创建的新JAR文件中。 3. 使用JVMTI API,从Java VM中获取应用程序的字节码,然后使用密钥对其进行加密。 4. 加密后的字节码存入新的JAR文件中,并将原始JAR文件中的其他文件也复制到新的JAR文件中。 5. 加密后的JAR文件可以被用于发布Java程序。 JVMTI加密Jar包可以确保Java程序源代码的安全性。虽然Java编译后会生成字节码,可以进行反编译,但加密后的字节码无法被反编译,从而保护程序的源代码不被泄露。 ### 回答3: JVMTIJava虚拟机工具接口的缩写,它提供了访问Java虚拟机内部的调试和监控的功能。在Java开发过程中,为了保护Java代码的安全性,我们通常会使用加密技术来保护Java代码,而对于已经被加密Java代码,我们需要使用JVMTI来进行反调试和监控。JVMTI可以访问Java虚拟机内部的数据结构,可以读写Java类的字节码、常量池、方法表和字段表。因此,我们可以使用JVMTI来解密加密Java代码,并获取其源代码和调试信息。 对于加密jar包,我们可以使用JVMTI工具来进行解密。首先,我们需要创建一个JVMTI的Agent程序,Agent是一种能够监控和修改Java应用程序的工具,它可以在程序运行时进行操作,可以读取和修改Java类的字节码,同时还可以获取应用程序内部的状态信息。然后,我们需要将Agent程序注入到Java虚拟机中,并使用JVMTI来获取加密jar包的字节码,并进行解密操作。解密完成之后,我们可以将解密后的字节码重新加载到虚拟机中,这样就可以获取到源代码和调试信息了。 总之,JVMTIJava开发中非常重要的工具,它可以帮助我们进行调试和监控Java应用程序,同时还可以帮助我们解密加密Java代码。使用JVMTI可以使我们更好地了解Java程序的运行机制,保护Java代码的安全性,并提高我们的开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值