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, 字节码加密, 字节码操作, 客户端加密, 构建时加密, 软件加固, 运行时解密, 逆向工程防护