| 
 | 1 | +# code-encryptor  | 
 | 2 | + | 
 | 3 | +[English Doc](doc/README-en.md)  | 
 | 4 | + | 
 | 5 | +[](https://github.com/4ra1n/code-encryptor/releases/latest)  | 
 | 6 | +  | 
 | 7 | + | 
 | 8 | +## 介绍  | 
 | 9 | + | 
 | 10 | +使用`JNI`加密字节码,通过`JVMTI`解密字节码以保护代码  | 
 | 11 | + | 
 | 12 | +提供两份`DLL`文件,一份加密一份解密,实际运行只需使用解密`DLL`文件,支持自定义密钥和包名  | 
 | 13 | + | 
 | 14 | +加密后的`Class`文件变成无法解析的畸形文件  | 
 | 15 | + | 
 | 16 | +  | 
 | 17 | + | 
 | 18 | +除了开头保持了`Magic`部分,后续是无法解析的字节  | 
 | 19 | + | 
 | 20 | +  | 
 | 21 | + | 
 | 22 | +使用指定参数启动即可禁止 `Java Agent` 动态 `dump` 字节码  | 
 | 23 | + | 
 | 24 | +  | 
 | 25 | + | 
 | 26 | +对于更资深的黑客,他们会想到 `sa-jdi` 的 `HSDB` 来 `dump` 字节码  | 
 | 27 | + | 
 | 28 | +我参考 `Beichen` 师傅议题的思路,从 `JVM` 里禁用了 `gHotSpotVMStructs` 函数  | 
 | 29 | + | 
 | 30 | +支持 `Windows` 系统  | 
 | 31 | + | 
 | 32 | +  | 
 | 33 | + | 
 | 34 | +支持 `Linux` 系统  | 
 | 35 | + | 
 | 36 | +  | 
 | 37 | + | 
 | 38 | +## 快速开始  | 
 | 39 | + | 
 | 40 | +加密解密部分使用`C`做一层加密,使用汇编做位运算二层加密,已提供编译好的`Release`版本`DLL/SO`文件嵌入`Jar`包中  | 
 | 41 | + | 
 | 42 | +内置支持是`JDK-8`,其他版本未测试,理论上需要更换`JNI.h`头文件重新编译,已支持`Windows`和`Linux`  | 
 | 43 | + | 
 | 44 | +加密你的`Jar`包:(指定`Jar`包和`package`加密包名以及密钥`key`)  | 
 | 45 | + | 
 | 46 | +```shell  | 
 | 47 | + java -jar code-encryptor.jar patch --jar your-jar.jar --package com.your.pack --key your-key  | 
 | 48 | +```  | 
 | 49 | + | 
 | 50 | +  | 
 | 51 | + | 
 | 52 | +导出解密`DLL/SO`文件:(默认导出到`code-encryptor-temp`目录不建议修改)  | 
 | 53 | + | 
 | 54 | +```shell  | 
 | 55 | +java -jar code-encryptor.jar export  | 
 | 56 | +```  | 
 | 57 | + | 
 | 58 | +  | 
 | 59 | + | 
 | 60 | +使用解密`DLL/SO`启动`Jar`包:(使用`-agentpath`参数)  | 
 | 61 | + | 
 | 62 | +注意必须有两个参数`PACKAGE_NAME`和`KEY`  | 
 | 63 | + | 
 | 64 | +注意:某些情况下可能第一次无法启动,重复使用命令启动即可  | 
 | 65 | + | 
 | 66 | +```shell  | 
 | 67 | +java -XX:+DisableAttachMechanism -agentpath:D:\abs-path\decrypter.dll=PACKAGE_NAME=com.your.pack,KEY=your-key --jar your-jar.jar  | 
 | 68 | +```  | 
 | 69 | + | 
 | 70 | +  | 
 | 71 | + | 
 | 72 | +## 特点  | 
 | 73 | + | 
 | 74 | +本项目相比于网上公开的文章/代码,优势和特点有以下几条:  | 
 | 75 | +- 原文章固定了包名,用户想加密自己的包名需要重新编译`DLL`  | 
 | 76 | +- 原文章加密和解密`DLL`是同一个,这样只用`JNI`调用下加密即可破解  | 
 | 77 | +- 原文章的代码仅是`Demo`级别,无法直接上手测试和使用  | 
 | 78 | +- 原文章没有加入具体的加密算法,仅是简单的运算,需要加强  | 
 | 79 | +- 原文章的代码存在一些`BUG`和优化空间  | 
 | 80 | +- 使用某些魔法操作,使字节码无法被 `dump` 进一步保证安全  | 
 | 81 | + | 
 | 82 | +目前的加密解密算法:  | 
 | 83 | +- 多次位运算,交换字节等  | 
 | 84 | +- 基于`XXTEA`算法,多轮加密  | 
 | 85 | +- 支持自定义密钥,进一步保护  | 
 | 86 | + | 
 | 87 | +## 构建  | 
 | 88 | + | 
 | 89 | +编译环境:  | 
 | 90 | +- Windows 11 / Ubuntu 22.04  | 
 | 91 | +- JDK 8 / Maven  | 
 | 92 | +- MSVC + ml64 (Windows) / gcc + nasm (Linux)  | 
 | 93 | +- CMake 3.x  | 
 | 94 | +- Python 3.x  | 
 | 95 | + | 
 | 96 | +## 其他  | 
 | 97 | + | 
 | 98 | +不适用于启动扫描 `class` 的项目(典型的项目比如`SpringBoot`)  | 
 | 99 | + | 
 | 100 | +正在想办法解决这个问题  | 
 | 101 | + | 
 | 102 | +## 参考  | 
 | 103 | + | 
 | 104 | +感谢以下项目或文章提供的思路:  | 
 | 105 | +- https://mp.weixin.qq.com/s/89Bmvy_uY97TZm3vR9lyWw  | 
 | 106 | +- https://juejin.cn/post/6844903487784894477  | 
 | 107 | +- https://github.com/sea-boat/ByteCodeEncrypt  | 
0 commit comments