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

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

2016-10-19 09:56
12553
前言:
OllyDbg V2.01在某些功能上比V1.10版本要强大一些,所以折腾一下OD V2.01,
但是在在看雪下载的OllyDbg V2.01中文修改版有个问题,数据窗口无法正常显示UNICODE字符;
下载页面::http://tools.pediy.com/windows/debuggers.htm
于是我在OllyDbg的官方网站下载了英文原版:http://www.ollydbg.de/odbg201.zip,该版本数据窗口可以正常显示UNICODE字符,但是原版对中文的支持又不够友好,有以下两个问题:
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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (5)
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
用开源的X64dbg吧,有源码在,怎么修改都方便
2016-10-19 10:17
0
雪    币: 15096
活跃值: (4858)
能力值: ( 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
活跃值: (1034)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6

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

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

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

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


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

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