告别乱码!手把手教你编译支持中文的X64dbg 2021修改版(附源码与成品)
逆向工程利器:X64dbg中文支持深度改造指南
在逆向分析领域,X64dbg已成为继OllyDbg之后的新一代调试工具标杆。但许多中文用户在使用过程中都遭遇过令人头疼的字符显示问题——调试窗口中的中文字符变成了一堆乱码,严重影响了分析效率。本文将彻底解决这个痛点,从底层编码原理到实际编译改造,带你打造一个完美支持中文的X64dbg增强版。
1. 环境准备与源码获取
1.1 编译工具链配置
不同于常规Windows应用,X64dbg的编译需要特定版本的工具链组合。经过多次测试验证,以下环境配置最为稳定:
- Visual Studio 2013 Update 5(必须使用SP5补丁)
- QT 5.6.3两个关键组件:
- qt-opensource-windows-x86-msvc2013_64-5.6.3.exe
- qt-opensource-windows-x86-msvc2013-5.6.3.exe
- Windows SDK 8.1(注意不是10版本)
- QT VS Tools 2.3.2扩展
注意:新版Visual Studio和QT会导致兼容性问题,这是X64dbg源码框架的历史限制
1.2 源码获取与子模块处理
官方源码仓库位于GitHub,但国内直接克隆可能较慢。建议使用镜像加速:
git clone -b development https://hub.fastgit.org/x64dbg/x64dbg.git cd x64dbg sed -i 's/github.com/hub.fastgit.org/g' .gitmodules git submodule update --init --recursive关键子模块包括:
- TitanEngine:核心调试引擎
- lz4:压缩算法支持
- Jansson:JSON处理库
2. 中文编码支持原理剖析
2.1 字符编码的底层差异
现代软件中常见的中文编码主要有三种形式:
| 编码类型 | 标识字节 | 汉字表示 | 适用范围 |
|---|---|---|---|
| GBK/GB2312 | 无 | 2字节 | 传统Windows中文系统 |
| UTF-16 (Unicode) | 0xFEFF | 2字节 | Windows API内部 |
| UTF-8 | 无 | 3字节 | 现代跨平台应用 |
X64dbg原始版本仅能正确处理GBK编码,对UTF-8序列完全无法识别。我们需要修改其字符串检测逻辑。
2.2 核心修改点定位
字符串处理的核心代码位于src/dbg/disasm_helper.cpp,关键函数包括:
isunicodestring():检测UTF-16编码isasciistring():检测ANSI编码disasmgetstringat():统一字符串处理入口
我们需要新增UTF-8检测逻辑,并在显示层做对应适配。
3. 编码支持深度改造
3.1 UTF-8检测算法实现
在disasm_helper.cpp中添加新的检测函数:
bool isutf8string(const unsigned char* data, int maxlen) { if(maxlen < 3) return false; // 三字节UTF-8模式检测 if((data[0] & 0xE0) == 0xE0 && (data[1] & 0xC0) == 0x80 && (data[2] & 0xC0) == 0x80) { // 中文Unicode范围检查 uint16_t unicode = ((data[0] & 0x0F) << 12) | ((data[1] & 0x3F) << 6) | (data[2] & 0x3F); return (unicode >= 0x4E00 && unicode <= 0x9FFF); } return false; }3.2 字符串处理流程改造
修改disasmgetstringatwrapper()函数,增加UTF-8处理分支:
if(disasmispossiblestring(addr, &strtype)) { switch(strtype) { case str_ascii: sprintf_s(dest, "\"%s\"", string); break; case str_unicode: sprintf_s(dest, "L\"%s\"", string); break; case str_utf8: sprintf_s(dest, "U\"%s\"", string); break; } }3.3 界面显示优化
在src/gui/Src/Disassembly.cpp中修改显示逻辑,支持多编码同屏显示:
void Disassembly::tokenizeString(... if(isUtf8) { QTextCodec *codec = QTextCodec::codecForName("UTF-8"); return codec->toUnicode(data); } //...原有处理逻辑 )4. 编译与部署实战
4.1 QT工程配置要点
使用QT VS Tools导入工程时需注意:
- 选择
x64-Release配置 - 在项目属性中添加预定义宏:
QT_NO_DEBUGUNICODE_UNICODE
- 确保QT版本指向5.6.3安装目录
4.2 常见编译错误解决
- LNK2001错误:检查QT库路径是否包含空格
- C1083文件缺失:重新运行
qmake生成makefile - 中文路径问题:整个工程路径不要包含中文
4.3 成品打包与分发
建议使用Enigma Virtual Box将编译结果打包为单文件版,包含:
- x64dbg.exe主程序
- plugins目录(核心插件)
- themes目录(界面主题)
- lang目录(中文语言包)
5. 增强功能扩展
除了基础的中文支持,还可以进一步优化:
- 智能注释系统:自动识别API调用中的中文字符串
- 编码自动识别:根据PE文件特征猜测编码类型
- 跨平台适配:通过QT特性实现Linux/macOS支持
// 智能注释示例 void addAutoComment(duint addr) { if(isChineseString(addr)) { setComment(addr, tr("中文字符串: %1").arg(getString(addr))); } }经过完整编译后,新版X64dbg将具备完美的中文处理能力。在实际逆向分析中,无论是字符串参考、堆栈查看还是内存dump,中文字符都能正确显示。这个改造过程不仅解决了具体问题,更深入理解了调试器的工作原理,为后续自定义功能开发奠定了基础。
