使用 x64dbg 调整 QT 程序的字体大小
QT 编译开发的程序很多时候会因为编码问题导致在汉化翻译为中文的时候出现乱码或者字体过小现象。有一些开发者会单独增加语言文件来解决多国语言或者本地化问题,可是有一些老外仅仅发布的是独立英文版,如果想要强制汉化翻译,那么您就会多多少少碰到这类问题。
今天我们就来通过使用 x64dbg 修改一款字体过小的程序,它是 SNS-HDR Pro。软件您可以直接到官网上下载。
官网:https://www.sns-hdr.com
SNS-HDR Pro 汉化翻译起来相对来说还是比较容易的,因为软件提供了多国语言,您只需要复制一份英文语言包翻译生成中文语言即可。但是在翻译后大眼仔发现了整体软件字体显示较小,低于正常的 9 像素大小。既然字体显示过小,那么我们就来通过更改软件内部的代码来修改它让它变的更大些。
上图中可以看到软件整体字体偏小
废话就不多说了,由于 SNS-HDR Pro 为 64 位程序,所以我们直接下载 x64dbg 并打开。在 x64dbg 界面中我们找到符号选项卡,在窗口中我们找到 SNS-HDR Pro.exe 进程,在右侧选项卡中我们在当前模块中搜索“Font”,中文字体为字体的意思。
在给出的结果中我们发现有个可疑的函数。
符号=?setPixelSize@QFont@@QEAAXH@Z
符号(已解码)=public: void __cdecl QFont::setPixelSize(int) __ptr64
我们就直接双击并转到程序选项汇编代码处,在代码段首直接按 F2 下断点。
直接按 F9 运行程序,按 F8 步过先跑一遍代码查看分析下相关数据。
以下是该段的所有代码:
000007FEDCD76020 | 48:895C24 08 | mov qword ptr ss:[rsp+8],rbx |
000007FEDCD76025 | 57 | push rdi |
000007FEDCD76026 | 48:83EC 40 | sub rsp,40 |
000007FEDCD7602A | 8BFA | mov edi,edx |
000007FEDCD7602C | 48:8BD9 | mov rbx,rcx |
000007FEDCD7602F | 85D2 | test edx,edx |
000007FEDCD76031 | 7F 31 | jg qt5gui.7FEDCD76064 |
000007FEDCD76033 | 48:8D4C24 20 | lea rcx,qword ptr ss:[rsp+20] |
000007FEDCD76038 | 45:33C9 | xor r9d,r9d |
000007FEDCD7603B | 45:33C0 | xor r8d,r8d |
000007FEDCD7603E | 33D2 | xor edx,edx |
000007FEDCD76040 | FF15 F2282900 | call qword ptr ds:[<&??0QMessageLogger@@QEAA@PEBDH0@Z>] |
000007FEDCD76046 | 48:8D15 5B942A00 | lea rdx,qword ptr ds:[7FEDD01F4A8] | 000007FEDD01F4A8:"QFont::setPixelSize: Pixel size <= 0 (%d)"
000007FEDCD7604D | 44:8BC7 | mov r8d,edi |
000007FEDCD76050 | 48:8BC8 | mov rcx,rax |
000007FEDCD76053 | FF15 6F062900 | call qword ptr ds:[<&?warning@QMessageLogger@@QEBAXPEBDZZ>] |
000007FEDCD76059 | 48:8B5C24 50 | mov rbx,qword ptr ss:[rsp+50] | [rsp+50]:"p?1e"
000007FEDCD7605E | 48:83C4 40 | add rsp,40 |
000007FEDCD76062 | 5F | pop rdi |
000007FEDCD76063 | C3 | ret |
000007FEDCD76064 | F641 08 02 | test byte ptr ds:[rcx+8],2 |
000007FEDCD76068 | 74 1C | je qt5gui.7FEDCD76086 |
000007FEDCD7606A | 48:8B01 | mov rax,qword ptr ds:[rcx] |
000007FEDCD7606D | 66:0F6ECF | movd xmm1,edi |
000007FEDCD76071 | F2:0F1040 28 | movsd xmm0,qword ptr ds:[rax+28] |
000007FEDCD76076 | F3:0FE6C9 | cvtdq2pd xmm1,xmm1 |
000007FEDCD7607A | 66:0F2EC1 | ucomisd xmm0,xmm1 |
000007FEDCD7607E | 7A 06 | jp qt5gui.7FEDCD76086 |
000007FEDCD76080 | 0F84 81000000 | je qt5gui.7FEDCD76107 |
000007FEDCD76086 | 48:8B01 | mov rax,qword ptr ds:[rcx] |
000007FEDCD76089 | 8338 01 | cmp dword ptr ds:[rax],1 |
000007FEDCD7608C | 75 4A | jne qt5gui.7FEDCD760D8 |
000007FEDCD7608E | 48:8B48 38 | mov rcx,qword ptr ds:[rax+38] | [rax+38]:"燼N"
000007FEDCD76092 | 48:85C9 | test rcx,rcx |
000007FEDCD76095 | 74 1B | je qt5gui.7FEDCD760B2 |
000007FEDCD76097 | F0:FF09 | lock dec dword ptr ds:[rcx] |
000007FEDCD7609A | 75 16 | jne qt5gui.7FEDCD760B2 |
000007FEDCD7609C | 48:8B03 | mov rax,qword ptr ds:[rbx] |
000007FEDCD7609F | 48:8B48 38 | mov rcx,qword ptr ds:[rax+38] | [rax+38]:"燼N"
000007FEDCD760A3 | 48:85C9 | test rcx,rcx |
000007FEDCD760A6 | 74 0A | je qt5gui.7FEDCD760B2 |
000007FEDCD760A8 | BA 01000000 | mov edx,1 |
000007FEDCD760AD | E8 BEBDFFFF | call <qt5gui.sub_7FEDCD71E70> |
000007FEDCD760B2 | 48:8B03 | mov rax,qword ptr ds:[rbx] |
000007FEDCD760B5 | 33D2 | xor edx,edx |
000007FEDCD760B7 | 48:8950 38 | mov qword ptr ds:[rax+38],rdx | [rax+38]:"燼N"
000007FEDCD760BB | 48:8B0B | mov rcx,qword ptr ds:[rbx] |
000007FEDCD760BE | 48:8B41 58 | mov rax,qword ptr ds:[rcx+58] |
000007FEDCD760C2 | 48:85C0 | test rax,rax |
000007FEDCD760C5 | 74 08 | je qt5gui.7FEDCD760CF |
000007FEDCD760C7 | 48:3BC1 | cmp rax,rcx |
000007FEDCD760CA | 74 03 | je qt5gui.7FEDCD760CF |
000007FEDCD760CC | F0:FF08 | lock dec dword ptr ds:[rax] |
000007FEDCD760CF | 48:8B03 | mov rax,qword ptr ds:[rbx] |
000007FEDCD760D2 | 48:8950 58 | mov qword ptr ds:[rax+58],rdx |
000007FEDCD760D6 | EB 0A | jmp qt5gui.7FEDCD760E2 |
000007FEDCD760D8 | 48:85C0 | test rax,rax |
000007FEDCD760DB | 74 05 | je qt5gui.7FEDCD760E2 |
000007FEDCD760DD | E8 EED4FFFF | call <qt5gui.sub_7FEDCD735D0> |
000007FEDCD760E2 | 48:8B03 | mov rax,qword ptr ds:[rbx] |
000007FEDCD760E5 | 66:0F6EC7 | movd xmm0,edi |
000007FEDCD760E9 | 48:B9 000000000000F0BF | mov rcx,BFF0000000000000 |
000007FEDCD760F3 | F3:0FE6C0 | cvtdq2pd xmm0,xmm0 |
000007FEDCD760F7 | F2:0F1140 28 | movsd qword ptr ds:[rax+28],xmm0 |
000007FEDCD760FC | 48:8B03 | mov rax,qword ptr ds:[rbx] |
000007FEDCD760FF | 48:8948 20 | mov qword ptr ds:[rax+20],rcx |
000007FEDCD76103 | 834B 08 02 | or dword ptr ds:[rbx+8],2 |
000007FEDCD76107 | 48:8B5C24 50 | mov rbx,qword ptr ss:[rsp+50] | [rsp+50]:"p?1e"
000007FEDCD7610C | 48:83C4 40 | add rsp,40 |
000007FEDCD76110 | 5F | pop rdi |
000007FEDCD76111 | C3 | ret |
在测试过程中发现 000007FEE87B60E5 中的 edi 值起到关键作用。
000007FEE87B60E5 | 66:0F6EC7 | movd xmm0,edi |
程序中默认 edi 的值为:
edi=B '\v'
那么我们先来尝试如何去修改当前 edi 的数值。
继续向上查找,在段首有一个这样的赋值操作:
000007FEDCD7602A | 8BFA | mov edi,edx | edi:"p?hd"
而 edx 的数值同样是等于 B '\v'。
那我们再继续向上找吧,检查那里对 edx 进行了这种操作。按 F8 一直在该段步过到段尾后,再执行一步跳出当前段,然后我们就会发现当前调用关键 Call 的地方有一处对 edx 赋值的命令,而这个命令刚好为 B。
按 F2 对该处下断点,重启 x64dbg 运行调试会发现程序暂停在当前断点处,使用汇编命令把 B 更改为 10,然后再继续运行。你就会发现软件的界面字体变大了,就这样变大了...
我测试时如果输入 9 字体就会变的非常小。所以当前选择中更改为 10 最合适。既然字体已经可以调整大小了,接下来的就是保存修补数据进行测试。
关于对 QT 软件字体大小的调整目前也已经完成。由于不同 QT 版本可能在函数上多少会有些差异,我这里也没有具体去分析这些内容。您如果不理解或者想更详细的了解关于 QT 相关函数的内容,建议您查阅官方文档。
以上就是今天给大家分享的小教程,当然 SNS-HDR Pro 中文版大眼仔博客上也有提供中文版下载,您也可以免费下载使用。如果您喜欢这篇文章欢迎点赞、收藏、投币或者分享给您身边有需要的人哦,三克油!