IDAHook 是一个专为 Windows 平台设计的 API Hook 与汉化框架,该项目基于 C++17 标准开发,采用模块化架构设计,广泛应用于逆向分析、软件本地化、动态调试等场景。它基于微软 Detours 技术,支持对目标程序的 API 拦截、界面文本自动汉化、日志追踪、特征码定位等高级功能,极大提升了二次开发和自动化分析的效率。
本项目主要针对 IDA Pro(ida.exe) 进行汉化和功能增强,默认 Hook 的目标函数包括:
- Qt 框架相关字符串与界面显示函数:
QString::fromUtf8QString::fromAscii_helperQCoreApplication::translateQWindow::setTitleQLabel::setTextQPainter::drawText
这些函数的 Hook 目的是拦截界面文本的生成与显示过程,实现自动汉化和自定义替换。
如需支持其他程序或函数,只需实现新的 Hook 模块并注册即可,支持 WinAPI、Qt、MFC 等多种目标。
- 易用的规则管理:支持运行时动态添加/移除汉化规则,支持优先级与追加规则。
- 兼容性强:适配 IDA Pro 及其他基于 Qt 的 Windows 应用。
- 多目标、多模块扩展:不仅支持 IDA Pro,理论上可支持任何 Windows 程序,只需实现对应 Hook 模块。
- 高效 API Hook 框架:基于微软 Detours 技术,支持多模块、多函数的高效拦截与管理。
- 自动汉化与批量替换:支持精确与模糊两种替换规则,结合 AC 自动机算法,能高效处理大规模文本替换,适合汉化工程。
- 规则热插拔:支持运行时动态添加汉化规则,无需重启目标程序。
- 特征码定位机制:支持开发/发布双模式,适应不同版本和变种程序,便于动态定位目标函数。
- 多线程安全日志系统:支持多实例、格式化、十六进制转储,便于自动化分析和问题追踪。
- 强兼容性与可移植性:兼容主流 Windows 版本和多种目标程序,适配 IDA Pro 及其他基于 Qt 的应用。
- 易用的扩展机制:只需实现 IHookModule 派生类并注册,即可快速扩展新功能。
- 支持多语言和多编码:UTF-8、Unicode 全面支持,适合国际化和本地化需求。
- HookManager:统一管理所有 Hook 模块的注册、安装与卸载。
- IHookModule:抽象接口,所有 Hook 功能模块需继承并实现 Install/Uninstall/Name 方法。
- 扩展方式:
- 新建类继承 IHookModule,实现相关接口。
- 通过
HookManager::RegisterModule(std::make_unique<YourHook>());注册。
- 典型的 Hook 模块,专为 IDA Pro 设计。
- 拦截 Qt 字符串相关函数,实现界面文本的自动翻译与替换。
- 支持窗口标题、标签、绘制文本等多种 UI 元素的汉化。
- 字符串规则管理器,支持精确与模糊两类规则。
- 精确规则:直接 key-value 替换,适合固定文本。
- 模糊规则:支持优先级,采用 AC 自动机批量高效匹配,适合大批量、部分匹配场景。
- 支持 UTF-8 和宽字符两套完整的字符串处理体系, 共8种自定义字典
- 规则可运行时动态添加。
- 支持条件编译,通过
DEBUG_MODE宏控制日志功能 (详见Logger.h) - 线程安全的日志系统,支持多实例、格式化输出、十六进制转储。
- 日志文件自动管理,支持编码标记与时间戳。
- 便于调试、问题追踪和自动化分析。
- 特征码定位工具,支持全模块/区段扫描、掩码匹配、正向/反向搜索、偏移量硬编码。
- 支持开发模式(日志输出详细匹配信息)与发布模式(硬编码偏移校验)。
- 适合动态定位目标函数、逆向分析等场景。
StringUtils.h 提供了一系列字符串处理工具函数,主要包括:
- 编码检测与转换:支持 UTF-8、GBK、UTF-16、wchar_t 等多种编码的有效性检测与互转,确保汉化和 Hook 过程中字符串处理的正确性。
- 高性能实现:所有操作均基于 Windows API,兼容性强,效率高。
- 支持的编码:
- UTF-8 ↔ GBK
- UTF-8 ↔ UTF-16
- UTF-8 ↔ wchar_t
- 各种输入格式:字符串、字符串视图、向量 该模块为整个汉化与 Hook 流程中的字符串处理、日志输出、规则匹配等提供了底层支撑。
- 导出表伪装: 通过
#pragma comment(linker, "/EXPORT:...")导出所有 winmm.dll 的函数 - 函数转发: 将调用转发给真正的 winmm.dll
- 初始化钩子: 在 DLL 加载时自动安装钩子
- 技术特点:
- 动态加载真正的 winmm.dll
- 获取所有导出函数的地址
- 使用 x64 汇编实现高效透明转发
- 支持所有 winmm.dll 导出函数
- 保持完整的调用约定和参数传递
通过伪装成
winmm.dll系统库,利用 DLL 搜索顺序实现自动注入,避免使用第三方注入工具。
IDAHook20250711/
├── IDAHook.sln # Visual Studio 解决方案文件
├── IDAHook.vcxproj # 工程文件
├── include/ # 头文件目录
│ ├── detours.h # Detours 库头文件
│ ├── HookManager.h # Hook 管理器头文件
│ ├── HookModule.h # Hook 模块抽象接口
│ ├── IDAHook.h # 典型 Hook 模块实现
│ ├── Logger.h # 日志系统头文件
│ ├── SignatureUtils.h # 特征码工具头文件
│ ├── StringExactRules.h # 精确替换规则表
│ ├── StringFuzzyRules.h # 模糊替换规则表
│ ├── StringManager.h # 字符串管理器
│ ├── StringUtils.h # 字符串工具
│ └── syelog.h # 日志库头文件
├── lib/ # 第三方库文件
│ ├── detours.lib # Detours 静态库
│ ├── detours.pdb # Detours 调试符号
│ └── syelog.lib # 日志库
├── src/ # 源代码目录
│ ├── HookManager.cpp # Hook 管理器实现
│ ├── IDAHook.cpp # 典型 Hook 实现
│ ├── Logger.cpp # 日志系统实现
│ ├── SignatureUtils.cpp # 特征码工具实现
│ ├── StringManager.cpp # 字符串管理器实现
│ ├── StringUtils.cpp # 字符串工具实现
│ ├── winmm_jump.asm # 汇编跳板代码
│ └── winmm.cpp # winmm 相关 Hook 实现
- 推荐使用 Visual Studio 2022 版本
- 支持 Windows 7/10/11 x64
- Detours 库已随项目自带,无需额外下载
本项目支持以下两种主要使用方式:
- 方式一:DLL 劫持(推荐):
# 将 winmm.dll 复制到 IDA Pro 安装目录
cp build/winmm.dll "C:/Program Files/IDA Pro 9.x/"- 方式二:手动注入:
// 使用注入工具或自写 Loader
HMODULE hMod = LoadLibrary(L"winmm.dll");- DLL 劫持:通过实现和注册自定义 Hook 模块,直接在目标程序运行时劫持指定 API,实现功能增强、自动化分析等。
- DLL 注入:将编译生成的 DLL 注入到目标进程(如 IDA Pro),即可实现 API Hook 和界面汉化。常用注入工具包括 Process Hacker、DLL Injector 等。
- 使用 Visual Studio 打开
IDAHook.sln解决方案 - 选择合适的编译配置(Release, x64)
- 编译生成 DLL文件
- 按需选择注入或集成方式:
- 注入:使用注入工具将 DLL 注入目标进程
- 集成:将源码集成到你的项目,注册自定义 Hook 模块
- 可通过修改
StringExactRules.h和StringFuzzyRules.h,自定义汉化规则 - 日志文件默认输出到当前目录,便于调试和问题追踪
无论采用哪种方式,均可灵活扩展和集成到不同的 Windows 应用场景。
- 精确规则:编辑
include/StringExactRules.h,添加{"原文", u8"译文"}或{L"原文", L"译文"} - 模糊规则:编辑
include/StringFuzzyRules.h,添加{"原文", u8"译文", 优先级}或{L"原文", L"译文", 优先级} - 运行时动态添加:
StringManager::AddDefaultRule("原文", "译文"); StringManager::AddFuzzyDefaultRule(L"原文", L"译文", 100);
- 新建类继承
IHookModule,实现 Install/Uninstall/Name 方法 - 在合适位置注册:
HookManager::RegisterModule(std::make_unique<YourHook>()); - 参考
IDAHook.h/cpp实现 Qt/WinAPI 等函数的拦截与处理
- 使用
SignatureUtils::DevFindSignature在开发阶段定位目标函数偏移 - 发布时用
SignatureUtils::GetHardcodedAddress校验模块大小与偏移,防止版本不符 - 支持掩码、区段、正反向、多匹配等高级用法
- 日志系统支持多线程安全、格式化输出、十六进制转储
- 可通过
Logger::SetShowEncodingTags和Logger::SetShowTimestamp控制日志格式 - 日志文件默认名为
Hook.log或IDAHook.log - 调试建议:优先在
Logger.h开启调试宏,便于追踪 Hook 安装、规则匹配、特征码定位等信息
- 支持多模块、多线程环境,适合复杂项目集成
- 字符串替换支持优先级、追加规则,便于灵活控制
- AC 自动机算法适合大规模模糊匹配,性能优越
- 日志系统建议定期清理,避免日志过大
- 特征码定位建议开发/发布分离,提升稳定性
- Detours:微软开源的 API Hook 框架
- syelog:Detours 附带的日志库
- AheadLibEx:用于 API 劫持的通用导出表劫持库,本项目 winmm.cpp 支持基于 AheadLibEx 的劫持方式,相关源码可自行修改。
- AheadLibEx作者:i1tao
所有依赖库已包含在 lib/ 和 include/ 目录,无需额外下载。
- 作者:XiangXin
- 联系方式:xiangxin229@foxmail.com
- 致谢:神月、Wanfu、雪很冷、MonKeyDu、i1tao
- Detours 项目:https://github.com/microsoft/Detours
- AheadLibEx项目:https://github.com/i1tao/AheadLibEx
- 如有问题或建议,欢迎反馈与交流。
- 本项目仅用于学习和研究目的,请遵守相关软件的许可协议和法律法规。