魔兽争霸3字体乱码乱码怎么办

【原创】解决进退魔兽争霸3中文名乱码问题
打开OllyDbg,载入War3.exe,由于全屏不便调试,还要加上参数-window窗口化
调试,运行,忽略了若干错误和异常之后,War3顺利启动。对War3来说,比较重要的文件有War3.exe,Storm.dll,Game.dll
等,查看,可执行模块里下断点,写注册表的API一般用RegSetValueExA,War3退出时写入注册表,最后在Storm.dll里唯一的一处
RegSetValueExA断下。
&& CALL DWORD PTR
DS:[&&ADVAPI32.RegCreateK&;
ADVAPI32.RegCreateKeyExA
1503612C&&&
8BF0&&&&&&&&&&&
MOV ESI,EAX
1503612E&&&
85F6&&&&&&&&&&&
TEST ESI,ESI
59&&&&&&&&&& JNZ
SHORT storm.1503618B
14&&&&&&&& MOV ECX,DWORD
PTR SS:[EBP+14]
10&&&&&&&& MOV EDX,DWORD
PTR SS:[EBP+10]
0C&&&&&&&& MOV EAX,DWORD
PTR SS:[EBP+C]
1503613B&&&
51&&&&&&&&&&&&&
1503613C&&& 8B4D
08&&&&&&&& MOV ECX,DWORD
PTR SS:[EBP+8]
1503613F&&&
52&&&&&&&&&&&&&
EDX&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; 把参数依次压进堆栈
50&&&&&&&&&&&&&
56&&&&&&&&&&&&&
57&&&&&&&&&&&&&
51&&&&&&&&&&&&&
&&& FF15 && CALL DWORD PTR
DS:[&&ADVAPI32.RegSetValu&;
ADVAPI32.RegSetValueExA
1503614A&&& 8B3D && MOV EDI,DWORD
DS:[&&ADVAPI32.RegClos&;
ADVAPI32.RegCloseKey
此时堆栈里可以看到
&& 0000258C& |hKey = 258C
0012D91C&& 6F7E70F8& |ValueName = "reswidth"
&& & |Reserved = 0
&& & |ValueType = REG_DWORD
&& 0012DA74& |Buffer = 0012DA74
0012D92C&& & \BufSize = 4
&& 6F7E70F8& ASCII "reswidth"
跟到写入userlocal的时候,把ValueType由REG_SZ改成REG_BINARY,发现BufSize大了1,写入的数据后面多了0x00一个字节,应该是C\C++字符串结束符的问题。
ValueType是用寄存器压进去的,而且RegSetValueExA只有一处调用,所以初步断定War3应该是用表或数组存储各个需要写入的注册表项,然后调用同一过程。往前走,一直到返回Game.dll的领空。
6F003170&&&
56&&&&&&&&&&&&&
6F003171&&&
8BCB&&&&&&&&&&&
MOV ECX,EBX
6F003173&&& E8 C8FFFFFF&&&& CALL
Game.6F003140&&&&&&&&&&&&&&&&&&&&&&
; Call到Storm.dll里的写入过程
6F003178&&&
46&&&&&&&&&&&&&
6F003179&&& 83FE
4C&&&&&&&& CMP
ESI,4C&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; 一共有0x4C个项需要写入
6F00317C& ^ 72
F2&&&&&&&&&& JB
SHORT Game.6F003170
用户名是保存在HKEY_CURRENT_USER\Software\Blizzard
Entertainment\Warcraft III\String里,F7跟进上面的这个Call,来到如下地方
6F00318C&&& 68
&&&& PUSH 104
6F003191&&& 68 046C7E6F&&&& PUSH
Game.6F7E6C04&&&&&&&&&&&&&&&&&&&&&&
; ASCII "Warcraft III"
6F003196&&& 8D85 FCFEFFFF&& LEA EAX,DWORD
SS:[EBP-104]&&&&&&&&&&
; 之前跳过了一段代码,是取注册表项前缀
6F00319C&&&
50&&&&&&&&&&&&&
EAX&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; 此处取完Warcraft III
6F00319D&&& E8 1E073900&&&& CALL
&JMP.&Storm.#501&&&&&&&&&&&&&&&&&&&
; 这两个CALL是取其他的参数
6F0031A2&&&
8BF7&&&&&&&&&&&
MOV ESI,EDI
6F0031A4&&& C1E6
04&&&&&&&& SHL ESI,4
6F0031A7&&& 8B8E 5C5D706F&& MOV ECX,DWORD
PTR DS:[ESI+6F705D5C]&&&&&
; 第二次进入循环,查看这里的内存地址
6F0031AD&&& 8B148D 405D706F MOV EDX,DWORD PTR
DS:[ECX*4+6F705D40]&&& ;
发现其实是储存在Game.dll文件里的一个表
6F0031B4&&& 68 &&&& PUSH
6F0031B9&&&
52&&&&&&&&&&&&&
6F0031BA&&& 8D85 FCFEFFFF&& LEA EAX,DWORD
PTR SS:[EBP-104]
6F0031C0&&&
50&&&&&&&&&&&&&
6F0031C1&&& E8 &&&& CALL
&JMP.&Storm.#503&
6F0031C6&&& 8B86 605D706F&& MOV EAX,DWORD
PTR DS:[ESI+6F705D60]
6F0031CC&&& 83E8
00&&&&&&&& SUB
EAX,0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; 其实就是判断标志是否为0
6F0031CF&&& 74
54&&&&&&&&&& JE
Game.6F003225&&&&&&&&&&&&&&&&&&
; 这里跳则写入的是REG_DWORD
6F0031D1&&&
48&&&&&&&&&&&&&
EAX&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; 不为零则为1(表里只存了0和1)
6F0031D2&&& 74
0B&&&&&&&&&& JE
Game.6F0031DF&&&&&&&&&&&&&&&&&&
; 跳这里,写入的是REG_SZ
6F0031D4&&&
5F&&&&&&&&&&&&&
6F0031D5&&&
5E&&&&&&&&&&&&&
6F0031D6&&&
33C0&&&&&&&&&&&
XOR EAX,EAX
6F0031D8&&&
5B&&&&&&&&&&&&&
6F0031D9&&&
8BE5&&&&&&&&&&&
MOV ESP,EBP
6F0031DB&&&
5D&&&&&&&&&&&&&
6F0031DC&&& C2
0400&&&&&&&& RETN
上面的两个JE跳转,第一个跳则写入REG_DWORD项,第二个跳则写入REG_SZ项,没有写入REG_BINARY的跳转,跟着跳转向前走,一路小跑来到这里。
6F003245&&& 8B45
08&&&&&&&& MOV EAX,DWORD
SS:[EBP+8]&&&&&&&&&&&&
; RegSetValueExA的参数五:数据体
6F003248&&& 8B8E 585D706F&& MOV ECX,DWORD
PTR DS:[ESI+6F705D58]&&&&&
; ECX="resheight",参数二:子键名
6F00324E&&&
50&&&&&&&&&&&&&
6F00324F&&& 6A
00&&&&&&&&&& PUSH
0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; 参数三:0
6F003251&&&
51&&&&&&&&&&&&&
6F003252&&& 8D95 FCFEFFFF&& LEA EDX,DWORD
SS:[EBP-104]&&&&&&&&&&
; EDX="Warcraft III\Video"
6F003258&&&
52&&&&&&&&&&&&&
6F003259&&& E8 &&&& CALL
&JMP.&Storm.#426&&&&&&&&&&&&&&&&&&&
; 还有一个CALL,进去
6F00325E&&&
5F&&&&&&&&&&&&&
6F00325F&&&
5E&&&&&&&&&&&&&
6F003260&&&
5B&&&&&&&&&&&&&
6F003261&&&
8BE5&&&&&&&&&&&
MOV ESP,EBP
6F003263&&&
5D&&&&&&&&&&&&&
下面又回到storm.dll,其中PUSH
4是关键,决定着写入的数据类型,可惜的是,只有4(REG_DWORD)和1(REG_SZ)两个过程,而且是写死并且共用的
10&&&&&&&& MOV EDX,DWORD
PTR SS:[EBP+10]
1503622B&&& 6A
04&&&&&&&&&& PUSH
1503622D&&& 8D45
14&&&&&&&& LEA EAX,DWORD
PTR SS:[EBP+14]
50&&&&&&&&&&&&&
EAX&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; 参数五:数据体
04&&&&&&&&&& PUSH
4&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; 参数四:REG_DWORD = 4
52&&&&&&&&&&&&&
EDX&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; 参数三:0
8BD6&&&&&&&&&&&
EDX,ESI&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; 参数二:子项名
&&& E8 65FEFFFF&&&& CALL
storm.&&&&&&&&&&&&&&&&&&&&&
; RegCreateKeyExA,并写入注册表项
1503623B&&&
5E&&&&&&&&&&&&&
1503623C&&&
5D&&&&&&&&&&&&&
1503623D&&& C2
1000&&&&&&&& RETN
走完一遍,War3写注册表项的流程差不多清楚了,有个标志决定着此项是REG_DWORD或REG_SZ,然后跳转到相应的过程写项,由于标志只决定跳向哪个跳转,而非直接给RegSetValueExA的参数四ValueType传值,所以简单修改标志实现其中一项单独写入REG_BINARY类型应该是不可行的,只有把PUSH
1改成PUSH 3,使所有原来的REG_SZ项都变成REG_BINARY。再进入一次循环,找到此处
56&&&&&&&&&&&&&
03&&&&&&&&&& PUSH
3&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; 把原来的PUSH 1改成PUSH 3(这个是改后的)
50&&&&&&&&&&&&&
8BD3&&&&&&&&&&&
MOV EDX,EBX
8BCF&&&&&&&&&&&
MOV ECX,EDI
150361EA&&& E8 B1FEFFFF&&&& CALL
150361EF&&&
5F&&&&&&&&&&&&&
5E&&&&&&&&&&&&&
5B&&&&&&&&&&&&&
5D&&&&&&&&&&&&&
1000&&&&&&&& RETN
修改后,原来所有的REG_SZ项都变成REG_BINARY写入,后面多了一个字节0x00也就是字符串结束符,War3用的时候直接指针传参地址。修改完,中文名无论怎么取,退完魔兽再进都不会乱码了。
暴雪的代码写得够紧凑,导致无法单独修改其中一项的键值类型,程序是怎么存储这些信息的呢?
6F0031A7&&& 8B8E
5C5D706F&& MOV ECX,DWORD PTR
DS:[ESI+6F705D5C]&&&&& ;
第二次进入循环,查看这里的内存地址,ESI应该就是数组(表)下标
6F0031AD&&& 8B148D 405D706F MOV EDX,DWORD PTR
DS:[ECX*4+6F705D40]&&& ;
发现其实是储存在Game.dll文件里的一个表
这里查看地址6F7060E0,可以看到Game.dll里的一个表,下面复制一小段
6F706110& 00 00 00 00 C8 70 7E 6F D0 6D 7E
6F 02 00 00 00& ....萷~o衜~o...
6F706120& 00 00 00 00 F8 6F 7E 6F C4 6D 7E 6F 03 00 00
00& ....鴒~o膍~o...
6F706130& 01 00 00 00 F4 B4 84 6F B8 6D 7E 6F 03 00 00
00& ...舸刼竚~o...
6F706140& 01 00 00 00 F4 B4 84 6F AC 6D 7E 6F 05 00 00
00& ...舸刼琺~o...
前四个字节是标志,为0则写入REG_DWORD为1写入REG_SZ,第二个四字节指向的地址存的是默认值(读注册表时用到),第三个四字节指向的地址就是子项名,第四个四字节标志着写入HKEY_CURRENT_USER\Software\Blizzard
Entertainment \Warcraft
III\下的哪个子分支,Video或者是String等。若要修改,右击,查看可执行文件,知道了静态地址就可以改了,可以修改某一项的数据类型,子项名,存放分支等,也可以把标志改成2以上的数字,这样War3退出时就不写入此项了。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。魔兽争霸,改了分辨率。怎么才能不乱码?_百度知道
魔兽争霸,改了分辨率。怎么才能不乱码?
我有更好的答案
一般的情况的话 要是魔兽分辨率设置的对不上你的电脑分辨率 就会出现黑边或者魔兽屏幕超出了电脑的边框
现在就是修改方法 记得修改之后以后进游戏了 不要再去点击设置里面的图像选项 不然就又会还原了 又需要重新修改
首先 关闭你的魔兽文件
点击 开始 然后进入注册表
要是你是xp系统的话 就这样进入注册表 (点击运行 然后输入regedit 然后回车)
要是你是win7系统 直接在搜索文件输入 regedit就行了
现在进入了注册表 然后按照这个步骤来 到达魔兽的注册表位置
HKEY_CURRENT_USER\Software\Blizzard Entertainment\Warcraft
这样的话 你就进入了魔兽的注册表 现在你要开始修改魔兽的分辨率了
reheight是高度 rewidth是宽度 比如说你电脑的分辨率是 那么就在reheight里面的十进制输入900 rewidth就是1440 然后点击确定就行了
再次打开魔兽 你就可以看到修改好了分辨率了这样打字的话 就不回出现乱码了
采纳率:61%
为您推荐:
其他类似问题
魔兽争霸的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。拒绝访问 | www.ou99.com | 百度云加速
请打开cookies.
此网站 (www.ou99.com) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(f043c5-ua98).
重新安装浏览器,或使用别的浏览器魔兽争霸字体乱码... 求解决...
从论坛获得的筹码:
注册时间:
贡献6, 距离下一级还需14贡献
注册时间:
自动加载图片
楼主 电梯直达 楼
我的魔兽版本是1.20E字体修改器:字体:方正粗圆简体修改了魔兽背景当我玩RPG.玩的时候长了之后.按回车键聊天..输入的字就会有重叠的现象.然后在&结束游戏.保存录像那里.也是重叠字.我之前认为是字体修改器的问题.我发给我朋友尝试了一下.他没事.然后我就重新下载过一个魔兽.发现还是有问题.那是我认为是QQ输入法的问题.我又重新下载了QQ输入法.结果还是出现了这个现象.我朋友也修改了魔兽背景.修改了字体.用QQ输入法.为什么他没事.而我就....我在网上看过有很多人有这问题.有人说是显卡的问题.有人说是魔兽争霸本来的一个BUG.有人说要修改什么什么注册表.请高手指点一下.怎么解决这个问题,感谢了.
从论坛获得的筹码:
注册时间:
贡献6, 距离下一级还需14贡献
注册时间:
补充一下.我的电脑分辨率是&色魔兽分辨率是&色.画面设置:全部&中等.&闭塞.单位是打开.电脑系统:&深度技术&ghost&xp专业版V9.0CUP:AMD&Athlon(tm)Ⅱ&X2&240&Processor&2.80GHz.内存:1.75GB显卡:是主板自带的AMD780L.&&&&&芯片类型:AMD&760G&(0x09616)&&&&&DAC类型:Internal&DAC(400MHZ)&&&&&显存:700MB&&&&&适配器字符串:AMD&780L&&&&&BIOS信息:113-B27732-X03显卡驱动程序提供商:&ATI&Technologies&Inc.&&&&驱动程序版本:8.631.0.0希望这些信息能给高手们一些帮助
回帖后跳转到最后一页
您需要登录后才可以发帖&&}

我要回帖

更多关于 魔兽争霸打字乱码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信