jsbxyyx/mjar
GitHub: jsbxyyx/mjar
mjar 是一个基于 JVMTI 和 JNI 的 Java 类字节码 AES 加密与运行时解密库,用于提升代码安全性并防止逆向工程。
Stars: 4 | Forks: 1
# mjar
中文 [English](README_en.md)
## 使用教程
### 1. 构建原生库
本项目使用 CMake 构建原生动态库 `libmjar`。
环境要求:
- CMake ≥ 3.15
- C / C++ 编译器
- JDK,并正确配置 `JAVA_HOME`
构建步骤:
mkdir build
cd build
cmake ..
cmake --build .
构建完成后可得到对应平台的动态库:
- Linux:`libmjar.so`
- macOS:`libmjar.dylib`
- Windows:`mjar.dll` 或对应 agent 动态库文件
### 2. 准备密钥
推荐通过环境变量 `MJAR_SECRET_PATH` 指向密钥文件。
示例:
export MJAR_SECRET_PATH=/path/to/secret.txt
程序启动时会读取该文件内容,并生成运行时使用的 AES 密钥。
如果需要调试日志,可设置:
export MJAR_LOG_DEBUG=1
### 3. 使用 mjar-java 对应用加密
本项目需要配合 [mjar-java](https://github.com/jsbxyyx/mjar-java) 一起使用,由 `mjar-java` 在构建阶段对目标 JAR / WAR 中指定包下的 class 进行加密。
示例:
java -jar mjar.jar io.github.jsbxyyx app.jar
加密完成后将生成:
- `app.jar` -> `app-enc.jar`
- `app.war` -> `app-enc.war`
### 4. 通过 Agent 运行加密后的应用
运行时通过 `-agentpath` 加载本项目生成的原生 Agent,并传入需要处理的包前缀。
示例:
java -agentpath:./libmjar.so=io/github/jsbxyyx -jar app-enc.jar
Windows 示例:
%JAVA_HOME%\bin\java.exe -agentpath:./libmjar.dll=io/github/jsbxyyx -jar app-enc.jar
参数说明:
- `-agentpath`:加载原生 Agent 动态库
- `io/github/jsbxyyx`:需要尝试解密的包前缀
- `app-enc.jar`:已加密的应用包
### 5. 运行流程说明
应用运行时:
1. JVM 加载 `libmjar`
2. Agent 在类加载阶段拦截目标 class
3. 对匹配包前缀的 class 尝试解密
4. 解密成功后交给 JVM 继续加载执行
## 加密原理
- `mjar-java` 在构建阶段对目标 class 字节码进行加密与字节码补丁处理
- `mjar` 通过 JNI 提供加密能力,通过 JVMTI Agent 提供运行时解密与加载能力
- 加密算法使用 **AES-CBC + PKCS#7**
- 在 JVM 运行时,通过 `ClassFileLoadHook` 对目标 class 按需解密
- 对某些特殊场景,结合 ASM 注入的 `maybeDecrypt([BI)[B` 本地方法实现补充解密支持
- 解密后会校验 class 文件头是否为 `CAFEBABE`,只有合法 class 才会继续加载
## 安全提示
- **不要** 将真实密钥硬编码在源码或提交到仓库中
- 推荐使用 `MJAR_SECRET_PATH` 指向受控的密钥文件,仅在部署环境中存在
- 本项目的目标是提升逆向工程门槛,而不是提供不可破解的安全机制
- 建议将其与混淆、授权校验、服务器端校验等手段结合使用,形成多层防护
## 相关项目
- [mjar-java](https://github.com/jsbxyyx/mjar-java):Java 侧打包与 ASM 插桩工具,用于生成加密后的 JAR/WAR。
标签:AES加密, Agent加载, Bash脚本, CMake构建, GHAS, Java安全, Java应用保护, JNI, JS文件枚举, JVMTI, UML, 代码保护, 加密库, 加密技术, 动态库, 原生Agent, 字节码加密, 字节码操作, 客户端加密, 构建时加密, 软件加固, 运行时解密, 逆向工程防护