使用JNI
加密字节码,通过JVMTI
解密字节码以保护代码
提供两份DLL
文件,一份加密一份解密,实际运行只需使用解密DLL
文件,支持自定义密钥和包名
加密后的Class
文件变成无法解析的畸形文件
除了开头保持了Magic
部分,后续是无法解析的字节
使用指定参数启动即可禁止 Java Agent
动态 dump
字节码
对于更资深的黑客,他们会想到 sa-jdi
的 HSDB
来 dump
字节码
我参考 Beichen
师傅议题的思路,从 JVM
里禁用了 gHotSpotVMStructs
函数
支持 Windows
系统
支持 Linux
系统
加密解密部分使用C
做一层加密,使用汇编做位运算二层加密,已提供编译好的Release
版本DLL/SO
文件嵌入Jar
包中
内置支持是JDK-8
,其他版本未测试,理论上需要更换JNI.h
头文件重新编译,已支持Windows
和Linux
加密你的Jar
包:(指定Jar
包和package
加密包名以及密钥key
)
java -jar code-encryptor.jar patch --jar your-jar.jar --package com.your.pack --key your-key
导出解密DLL/SO
文件:(默认导出到code-encryptor-temp
目录不建议修改)
java -jar code-encryptor.jar export
使用解密DLL/SO
启动Jar
包:(使用-agentpath
参数)
注意必须有两个参数PACKAGE_NAME
和KEY
注意:某些情况下可能第一次无法启动,重复使用命令启动即可
java -XX:+DisableAttachMechanism -agentpath:D:\abs-path\decrypter.dll=PACKAGE_NAME=com.your.pack,KEY=your-key --jar your-jar.jar
本项目相比于网上公开的文章/代码,优势和特点有以下几条:
- 原文章固定了包名,用户想加密自己的包名需要重新编译
DLL
- 原文章加密和解密
DLL
是同一个,这样只用JNI
调用下加密即可破解 - 原文章的代码仅是
Demo
级别,无法直接上手测试和使用 - 原文章没有加入具体的加密算法,仅是简单的运算,需要加强
- 原文章的代码存在一些
BUG
和优化空间 - 使用某些魔法操作,使字节码无法被
dump
进一步保证安全
目前的加密解密算法:
- 多次位运算,交换字节等
- 基于
XXTEA
算法,多轮加密 - 支持自定义密钥,进一步保护
编译环境:
- Windows 11 / Ubuntu 22.04
- JDK 8 / Maven
- MSVC + ml64 (Windows) / gcc + nasm (Linux)
- CMake 3.x
- Python 3.x
不适用于启动扫描 class
的项目(典型的项目比如SpringBoot
)
正在想办法解决这个问题
感谢以下项目或文章提供的思路: