# inject **Repository Path**: goccoder/inject ## Basic Information - **Project Name**: inject - **Description**: No description available - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-13 - **Last Updated**: 2025-09-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Inject ## 项目简介 这是一个小工具,也是一个示例,演示了如何在Windows系统中实现DLL注入和子类化窗口。 ## 工具使用 1. [ProcessExplorer](https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer) - 用于查看目标进程是否已加载注入的模块 2. [ProcessMonitor](https://learn.microsoft.com/en-us/sysinternals/downloads/procmon) - 查看进程的具体行为细节 ## 实现说明 ### 主程序 1. 主程序通过`CreateToolhelp32Snapshot`读取系统的进程列表,并建立一个进程树方便后续操作 2. 实现一个简单的UDP服务,监听8888端口,接收子模块日志信息并显示 3. 使用远程注入技术将DLL注入到目标进程 * 相关细节请参考[Windows 核心编程](https://www.tup.tsinghua.edu.cn/bookscenter/book_02688201.html)第22章 ### 注入模块 1. 模块只需通过`LoadLibraryW`加载,不需要导出任何函数 2. `DllMain`函数返回值不能是0,否则会引起模块被卸载 3. 窗口枚举 * 使用`CreateToolhelp32Snapshot`获取进程映像,遍历所有线程和对应的窗口用于子类化 4. 技术细节 * 监听窗口消息是使用子类化实现的,而不是钩子函数 * 子类化使用的是ATL的功能,避免手写代码的麻烦 ## 项目结构 * Inject/ - 主程序目录 * contrl/ - 控制模块 * log.cpp/.hpp - 日志显示控制 * process.cpp/.hpp - 进程列表控制 * core/ - 核心功能实现 * injector.cpp/.hpp - DLL注入和卸载的核心实现 * dialog.cpp/.hpp - 主界面实现 * app.cpp/.hpp - 应用程序入口 * win_proc/ - DLL注入模块 * core/ - 窗口处理核心代码 * enum_wnd.cpp/.hpp - 窗口枚举实现 * sub_wnd.cpp/.hpp - 窗口子类化实现 * log_sink.cpp/.hpp - 日志发送实现 * dllmain.hpp - DLL入口点实现 * singleton.hpp - 单例模式模板 * win_proc.cpp/.hpp - 窗口过程处理 ## 技术要点 ### DLL注入 1. DLL注入使用标准的CreateRemoteThread和LoadLibraryW技术 * 在目标进程中分配内存存储DLL路径 * 使用WriteProcessMemory将DLL路径写入目标进程内存 * 创建远程线程执行LoadLibraryW加载DLL * DLL卸载同样使用CreateRemoteThread和FreeLibrary技术 2. 获取目标进程中已加载模块的句柄 * 使用CreateToolhelp32Snapshot和Module32First/Next枚举进程中的模块 * 比较模块路径是否匹配目标DLL 3. 创建远程线程执行FreeLibrary卸载DLL * 使用CreateRemoteThread创建远程线程执行FreeLibrary卸载DLL * 确保在目标进程中正确释放资源 ### DLL模块实现 1. 在DllMain中正确处理DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH事件 * DLL_PROCESS_ATTACH时调用attach()函数进行窗口子类化 * DLL_PROCESS_DETACH时调用unattach()函数恢复窗口过程 2. 注意DllMain函数的返回值必须为TRUE,否则会导致模块被立即卸载 ### 窗口子类化 1. 使用ATL的CWindowImpl进行窗口子类化,处理键盘消息(WM_KEYDOWN, WM_KEYUP)和字符消息(WM_CHAR) * SubWin类继承自CWindowImpl * 通过消息映射处理不同类型的窗口消息 2. 窗口枚举使用CreateToolhelp32Snapshot和EnumThreadWindows * 获取进程的所有线程ID * 枚举每个线程的窗口句柄 ### 日志 1. 通过UDP服务收集和显示注入模块的日志信息 * DLL模块通过UDP客户端发送日志到主程序 * 主程序实现UDP服务器接收并显示日志 2. 日志信息包括键盘按键和字符输入信息,用于监控窗口消息 ## 编译 1. 安装vcpkg * 参考[官方文档](https://github.com/microsoft/vcpkg)安装vcpkg 2. 安装依赖库 * 打开命令行,切换到项目目录(有些依赖,就光依赖,没实质使用) * 执行 ``` powershell vcpkg install boost-headers boost-filesystem boost-nowide wtl wxwidgets yalantinglibs ``` 3. 创建`CMakeUserPresets.json` ```json { "version": 10, "configurePresets": [ { "name": "msvc_debug", "displayName": "msvc debug", "inherits": [ "msvc" ], "binaryDir": "${workspaceFolder}/vscode-build-debug", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug" }, "environment": { "VCPKG_ROOT": "${env:VCPKG_ROOT}", "VCPKG_TARGET_TRIPLET": "x64-windows" } } ] } ``` 即可以使用vscode的cmake工具编译项目