首页
社区
课程
招聘
[已解决]修复OllyDbg V2.01中文显示的问题
发表于: 2016-10-19 09:56 13158

[已解决]修复OllyDbg V2.01中文显示的问题

2016-10-19 09:56
13158
前言:
OllyDbg V2.01在某些功能上比V1.10版本要强大一些,所以折腾一下OD V2.01,
但是在在看雪下载的OllyDbg V2.01中文修改版有个问题,数据窗口无法正常显示UNICODE字符;
下载页面::f1cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4c8G2L8$3I4K6i4K6u0W2M7r3g2V1K9i4W2Q4x3X3g2U0L8$3#2Q4x3V1k6%4K9h3&6V1L8%4N6K6i4K6u0r3k6r3g2T1N6h3N6Y4k6i4u0K6i4K6u0W2K9s2c8E0
于是我在OllyDbg的官方网站下载了英文原版:7e4K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3!0D9L8s2W2V1j5X3N6Q4x3X3g2V1k6g2)9J5c8X3!0V1j5X3M7J5x3o6q4Q4x3X3g2*7K9i4m8Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0S2Q4b7f1k6Q4b7e0g2Q4c8e0N6Q4z5o6W2Q4z5o6S2Q4c8e0k6Q4z5f1y4Q4b7f1y4Q4c8e0k6Q4z5e0g2Q4b7U0m8Q4c8e0k6Q4z5p5c8Q4b7f1g2Q4c8e0N6Q4b7f1q4Q4z5e0N6Q4c8e0g2Q4z5p5k6Q4b7e0y4Q4c8e0g2Q4z5p5k6Q4b7f1k6Q4c8e0c8Q4b7V1u0Q4b7e0g2Q4c8e0k6Q4b7f1c8Q4b7e0y4Q4c8e0g2Q4b7U0S2Q4b7U0S2Q4c8e0k6Q4z5e0S2Q4b7V1g2Q4c8e0N6Q4b7e0c8Q4b7V1q4g2e0V1W2o6e0@1c8q4i4@1f1#2i4@1q4p5i4K6V1%4i4@1f1%4i4@1q4o6i4@1p5$3i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1@1i4@1u0p5i4K6R3$3i4@1f1$3i4K6V1^5i4@1q4r3i4@1f1#2i4K6S2q4i4K6W2r3i4@1f1%4i4K6R3&6i4K6R3^5i4@1f1#2i4@1q4r3i4@1t1&6i4@1f1@1i4@1t1^5i4@1q4p5i4@1f1$3i4K6V1$3i4K6R3%4i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1$3i4K6V1@1i4@1q4r3i4@1f1$3i4K6S2o6i4K6R3I4i4@1f1#2i4K6S2r3i4K6R3^5i4@1f1@1i4@1t1^5i4K6S2p5i4@1f1#2i4@1p5@1i4K6W2r3i4@1f1#2i4K6S2r3i4K6S2n7i4@1f1#2i4@1p5#2i4@1u0p5i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1$3i4K6W2o6i4K6R3&6i4@1f1@1i4@1u0n7i4@1p5#2i4@1f1@1i4@1t1^5i4K6S2n7i4@1f1@1i4@1t1^5i4@1p5@1i4@1f1@1i4@1t1^5i4@1q4m8i4@1f1&6i4K6V1%4i4@1q4q4i4@1f1&6i4@1p5J5i4K6V1^5i4@1g2r3i4@1u0o6i4K6W2m8
1.设置对话框文字太小
2.很多窗体内中文只能显示一半
于是我就想自己动手,研究一下能不能修复OD2.01的中文显示。
最后问题2没有完美解决,所以前来请教前辈!
----------------------------------------------------------------------------------------------------------
这里我复制了一份OD2.01,用一个OD2.01英文版调试另一个OD2.01英文版
首先是解决设置窗口文字太小的问题:
Win32 API中设置窗体字体一般情况是SendMessage(hwnd,WM_SETFONT,HFONT,0),所以在这里下断,经过无数次F8,F9之后找到了地址00429FFF,如下图:


OD 2.01对每个控件都进行了这个操作,设置它的字体,从wParam可以看到字体句柄,然后追踪这个句柄是从哪里来的,又经过无数次F8,F9之后,又来到了0040EA2B,如下图:

可以看到LOGFONT的Width参数被限定为5,这不科学啊,创建字体都是使用0,让系统自动匹配,

所以果断改为0,于是设置界面字体就变大了,如下图:


但是还是不对,字符间隔太宽,文本显示不全,后来研究了很久没找到原因,
最后索性把字体从原来的"MS Sans Serif"改为"宋体",字号改为12号,总算可以正常显示了。
于是第1个问题就算是解决了吧!

--------------------------------------------
第2个问题就困难了:
OD的窗体是自绘的控件,文本使用的是ExtTextOutW来输出,在所有ExtTextOutW下断,无数个F8,F9之后,锁定了0041D52F,如下图:

观察它的输入参数,在有中文的情况下RECT的宽度少了一半,导致中文显示不全,找到了问题所在,
这回就要跟踪这个输入RECT是怎么计算出来的了,这里的代码逻辑比较复杂,跟踪了很长时间,最后找到了这里0041B1C8,如下图:

判断[EBP-2F]的BIT1是否为1,为1则使用GetTextExtentPoint32来计算文本宽度,否则使用
单个字符宽度乘以字符数量来决定宽度,
一开始我不明白为什么要分这两种情况?理论上应该用GetTextExtentPoint32来计算才正确啊,
所以我直接将判断条件改为TRUE,这样无论如何都会调用GetTextExtentPoint32来计算文本的宽度,果然解决了中文只显示一半的问题,
然而却又发现了新的问题,那就是和在看雪下载的修改版的问题一样,数据窗口无法正常显示UNICODE字符:


于是只能继续调试,看看[EBP-2F]这个标志位是怎么来的,又无数次的F8,F9终于找到了0041AE40,下图:

其实[EBP-2F]只是变量[EBP-30]的第2个字节,它是一个DWORD类型的FLAG,一开始是清0了,
调用回调函数之后,得到正确的FLAG置位,在这里发现每个窗口的回调函数是不一样的,
因此我想在回调函数里给FLAG |= 0x200,结果行不通,
因为有一些窗口的回调函数里根本就没有修改[EBP-30],所以我想干脆给FLAG初始值就为0x200吧,还是行不通:
因为在地址0041AE3E处有这2条指令:

地址        十六进制数据            指令                                       注释
0041AE3E  |.  33D2          XOR EDX,EDX
0041AE40  |.  8955 D0       MOV DWORD PTR SS:[EBP-30],EDX            ; FLAG清零


要改为 MOV DWORD PTR [EBP-30],200一条指令,需要6个字节的空间,而原来只有5个字节!

本来想解决了这个问题,得到完美版的中文OD2.01,发到论坛分享一下的,奈何技能不够用,解决不了这个问题,所以只能前来寻找前辈指点!
另外有没有人打赏几个Kx给我呀,...

-----------------------------------------------------------------------------------------------------------
2016.10.20添加
按照LOCKLOSE前辈的指点,基本解决了OllyDbgV2.01的中文显示问题,
大功告成,现上传附件,分享一下!
还有一点瑕疵,就是CPU INFO窗口,显示"(当前寄存器)"这个红色警告,稍微挡住了前面一个字符,不过可以在“设置”里面关闭这个红色警告.

OllyDbgV2.10.zip

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (5)
雪    币: 231
活跃值: (2666)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
用开源的X64dbg吧,有源码在,怎么修改都方便
2016-10-19 10:17
0
雪    币: 16004
活跃值: (5769)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
找个缝隙,
xor edx,edx
的地方JMP过去,正好5个字节.然后
xor edx,edx
mov dword[ebp-0x30],edx
JMP回去.就行了
至于怎么修改,有缝隙就随便你改了.
2016-10-19 15:18
0
雪    币: 31
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=LOCKLOSE;1449026]找个缝隙,
xor edx,edx
的地方JMP过去,正好5个字节.然后
xor edx,edx
mov dword[ebp-0x30],edx
JMP回去.就行了
至于怎么修改,有缝隙就随便你改了....[/QUOTE]
多谢前辈指点,这个方法非常好!
2016-10-20 14:19
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
零零九九  活跃值 2016-10-20 14:19
  引用  举报  4 楼  0
[QUOTE=LOCKLOSE;1449026]找个缝隙,
xor edx,edx
的地方JMP过去,正好5个字节.然后
xor edx,edx
mov dword[ebp-0x30],edx 
JMP回去.就行了
至于怎么修改,有缝隙就随便你改了....[/QUOTE]
多谢前辈指点,这个方法非常好!
2021-3-12 19:13
0
雪    币: 101
活跃值: (1075)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6

这篇文章很好,图文并茂很详细,但是我发现还有个问题。

在内存布局页面,的包含一列,如果加载了汉化文件的话,中文的第一个字符会乱码,如下图所示:

经过查找,来到 0045A90F 这一行,ax 里面把汉字的一半替换成了 00 ,又覆盖到了字符串的起始位置,造成第一个汉字编码错误,所以显示出来就是乱码

最简单的办法就是把这行代码 nop 掉,汉字就正常显示了,暂没发现有其他影响,修改后的显示效果如下:


借楼主的帖子,发布在这里,方便问题汇总。

2021-8-20 17:01
0
游客
登录 | 注册 方可回帖
返回