这个项目演示了如何使用DLL注入技术将JAR文件注入到运行中的javaw.exe进程,并实现热重载功能。
- DLL注入: 将自定义DLL注入到目标Java进程
- JAR加载: 在目标进程中动态加载和执行JAR文件
- 热重载: 监控JAR文件变化并自动重新加载
- JNI桥接: 提供Java和C++之间的双向通信
- 进程管理: 自动发现和选择目标Java进程
- 增强安全性: 全面的安全检查和验证
- 错误处理: 详细的错误代码和错误信息
- 性能优化: 方法缓存和动态文件监控
- 内存管理: 改进的JNI引用管理
- 单元测试: 全面的测试覆盖
dll_inject_demo/
├── src/
│ ├── include/ # 头文件
│ │ ├── common.h
│ │ ├── dll_injector.h
│ │ ├── jar_loader.h
│ │ └── hot_reload.h
│ ├── injector/ # 注入器源码
│ │ ├── main.cpp
│ │ ├── dll_injector.cpp
│ │ └── process_utils.cpp
│ ├── dll/ # 注入DLL源码
│ │ ├── dllmain.cpp
│ │ ├── jar_loader.cpp
│ │ ├── jni_bridge.cpp
│ │ └── hot_reload.cpp
│ └── common/ # 通用工具
│ └── utils.cpp
├── test/
│ ├── java/ # 测试Java文件
│ │ ├── Main.java
│ │ ├── NativeBridge.java
│ │ └── TargetApp.java
│ ├── test.jar # 测试JAR文件
│ └── target-app.jar # 目标应用程序
├── build/ # 构建输出目录
├── CMakeLists.txt # CMake配置文件
├── build.bat # 主构建脚本
├── build_java.bat # Java构建脚本
└── README.md # 本文件
- Windows 10/11 (x64)
- 重构了代码结构,提高了可读性和可维护性
- 优化了JNI方法查找,添加了方法缓存机制
- 改进了热重载文件监控,动态调整检查间隔
- 修复了JNI引用管理中的潜在内存泄漏
- 确保所有JNI局部引用都被正确释放
- 添加了异常处理以确保资源清理
- 添加了详细的错误信息结构
- 改进了错误日志记录,包含上下文信息
- 统一了错误代码和错误处理机制
- 增强了输入验证和安全检查
- 添加了防止恶意注入的保护措施
- 添加了单元测试框架
- 为关键组件编写了测试用例
- 实现了自动化测试流程
- Visual Studio 2019/2022 或 Build Tools
- CMake 3.16+
- Java Development Kit (JDK) 8+
- 管理员权限(用于进程注入)
-
克隆或下载项目
git clone <repository-url> cd dll_inject_demo
-
运行构建脚本
build.bat
构建脚本会自动:
- 检查依赖项
- 配置CMake
- 编译C++代码
- 编译Java代码
- 创建JAR文件
-
启动目标应用程序
java -jar test\target-app.jar -
运行注入器
build\bin\Release\injector.exe test\test.jar
# 指定类和方法
injector.exe test\test.jar Main main true
# 参数说明:
# - test\test.jar: 要注入的JAR文件路径
# - Main: Java类名 (默认: Main)
# - main: Java方法名 (默认: main)
# - true: 启用热重载 (默认: true)- 启动目标应用程序和注入器
- 修改
test\java\Main.java文件 - 重新编译:
build_java.bat - 观察自动重新加载
负责将DLL注入到目标Java进程:
- 查找javaw.exe进程
- 分配内存并写入DLL路径
- 创建远程线程加载DLL
在目标进程中执行的核心组件:
- 初始化JVM连接
- 加载指定的JAR文件
- 调用Java方法
- 管理热重载
处理Java相关操作:
- 连接到现有JVM实例
- 动态加载JAR文件
- 调用Java类和方法
- 异常处理
监控文件变化:
- 监控JAR文件修改时间
- 自动重新加载变更的JAR
- 重新调用指定方法
提供Java和C++通信:
- 本地方法注册
- 系统信息获取
- 文件操作
- 进程信息
- DLL注入需要管理员权限
- 可能被杀毒软件误报
- 不要用于恶意目的
- 在生产环境中谨慎使用
-
"Failed to open target process"
- 确保以管理员身份运行
- 检查目标进程是否存在
-
"Failed to initialize JVM"
- 确保目标进程是Java应用程序
- 检查JNI库是否正确链接
-
"JAR file not found"
- 检查JAR文件路径是否正确
- 确保文件存在且可读
-
热重载不工作
- 检查文件权限
- 确保JAR文件没有被锁定
-
启用详细日志
- 修改
common.h中的日志级别 - 重新编译项目
- 修改
-
使用调试器
- 在Visual Studio中附加到目标进程
- 设置断点调试
-
检查进程
- 使用Process Explorer查看DLL加载情况
- 检查Java进程的类路径
- 在
NativeBridge.java中声明方法 - 在
jni_bridge.cpp中实现方法 - 重新编译项目
- 修改
jar_loader.cpp中的加载逻辑 - 添加新的类查找策略
- 实现自定义类加载器
- 添加目录监控
- 支持多文件监控
- 实现增量重载
本项目仅供学习和研究使用。请遵守相关法律法规。
欢迎提交问题报告和改进建议。
免责声明: 本项目仅用于教育目的。使用者需要对使用本项目造成的任何后果负责。