查看完整版本: [-- VC++7.0软件调试心得及其修正 --]

汉化新世纪论坛 -> Windows 软件汉化 -> VC++7.0软件调试心得及其修正 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

雅枫 2003-11-22 19:45

VC++7.0软件调试心得及其修正

最近出现了一大批不能用,常规方法不能修正字体的软件,像这次的Snagit7.1便是一例,安装后,发现软件目录下有mfc71.dll应该是用vc++.net编写的吧,这种软件字体修改难度较大,又没有这方面的教程,我也头疼这样的软件,可不解决势必影响这类软件的汉化质量,只有硬着头皮上了,其实这种软件我以前也调试过,就是catalyst5.0由于这个软件较大,当时死了几次机,弄的也没了兴趣最后不了了之了。由于snagit相对较小,所以就跟踪了一下这个软件,由于没有经验,只能慢慢摸索,修正这个软件的字体,我整整花了一上午的时间,走了不少弯路,也有了一定的经验,写出来供大家参考。
由于这类软件自身的特点,这种软件并不能用ollydbg,w32dasm等软件调试,只能用si,trw2000这类动态调试工具了。因为这是mfc71.dll中的字体调用,所以前两者(只对软件进行分析)当然不能拦截到了。用trw载入程序STUDIO.EXE,下bpx createfonta;bpx createfontindirecta
两个断点,我期望看这篇文章的人能修改一般的这两个函数生成的字体,如果没有相关知识,建议先研习一下相关教程,梁兄写的那几篇和我写的那几篇均可,由于调用到这两个函数的地方非常多,而字体生成又是在初始化过程中(光弄清这一点我就费了老长时间)只能一个一个看,建议先用自动修改工具修改能自动修改的,这会为我们提供不少方便,如果是CREATEFONTA函数生成的字体(只有一处),按F12->F8然后按CTRL+上箭头看看设置是否为MS SANS……之类的字体,经过调试,发现生成的是一个以M开头的字体,这是个符号字体,(就是生成那个小叉号的字体),我们不需要改,剩下的全是CreateFontIndirectA生成的字体,每次拦截到,都打一句DEAX看看数据窗口中有没有我们熟悉的LOGFONT(这个软件一般是用EAX压入LOGFONT,也有几个是ECX至于是DEAX还是DECX可以自己确定,一般DEAX得不到LOGFONT就DECX(仅适用于这个软件)),如果已经是FFFFFF4
开头,就不用管了(以被自动修改工具修改了),如果不是以FFFFFFF4开头,这就是我们注意的地方了,往后看会有字体名一般TOHAMA字体是标题栏字体,也不用管,这样一个一个试,终于找到了两处MS SANS……字体,看来就是这两处了,重新载入软件,重复上述步骤,找到了断下来的第一处,按F12->F8发现回到的是MFC71.DLL所以这个字体是MFC71.DLL调用的CREATEFONTINDIRECT函数,这就是为什么用W32DASM找不到调用的原因所在了,同样这个用OLLYDBG也查不到,这时就有了一种方法,直接改MFC71.DLL,把其中的一个CREATEFONTA与一个CREATEFONTINDIRECTA都改成标准字体,这样只要用到MFC71.DLL生成的字体,就一律成了标准的“宋体”9,不过这比较野蛮,会出现一些“后遗症”如有些小叉号成了“r”就是因为把不该改的字体也一并改成了宋体造成的(不过这也能达到jingulong兄的字体修改工具的效果了)如果想完美修改就必须修改软件中的调用,所以继续重复F12-〉F8直到按下一次F8后到达了STUDIO.EXE的领空,这时发现返回值(当前的EAX值)居然是1,并不是字体句柄,往上翻一段下个断点,仔细调试了一下,也没有发现有如F5或者08我就跟到了MFC71.DLL发现里边的FFFFFFF5是用一个55算出来的,使用这个公式:55*60/02E5算出来,根据这个公式我们可以得出F4的压入值是61,这就好办了,只要想法把调用前的那个push改成push 61就可以了,然后就是改正(因为前边是压入eax字节不够用,需要向前边借字节(这需要读懂汇编代码。并且熟悉寻址机制也算一个难点不过想改这样的字体,自己应该能有解决这问题的能力))然后搜索ms sans serif字体名,改成“宋体”并用00补齐,本以为解决了,但是却只有利弊那标签上的字体改过来了,那些边框上的字体却仍然难看,调试发现明明还有ms sans serif字样,却愣是找不到,有心改大一号(push 69)又觉得别扭,最后干脆下了个内存断点发现这个字体名是一个字母一个字母过去的,返回后发现是调用的:WideCharToMultiByte这个函数,真够变态是!从UNICODE转化过来的,然后查找UNICODE的MS SANS改成UNICODE的宋体(需要改前边的长度值,(全部用00补齐也可以不改))
  问题全部解决,至于主文件中的字体,类似的方法也可以解决(只不过调试起来更变态,只不过是练的TRW更纯熟了)(我只改了莫名兄告诉我的那一处,别的我没发现)。
大家可以发现,这种字体改起来难度极大,一般不精通汇编与调试的就不要尝试去改了,我把MFC71.DLL处理了一下,使之能达到了FONTFLY的效果,到时候用这个DLL替换掉软件安装目录下的文件就可以了(经测试不能改CATALYST 5的字体,不过我相信大部分是能改的,CATALYST 5可能是用另外的方法设置的)。相关的文件我也不知道怎么与大家共享(400K)想要的给我去信或者给找个空间传上去把。

2003-11-22 19:59
“相关的文件我也不知道怎么与大家共享(400K)想要的给我去信或者给找个空间传上去把。”放到上传的FTP上吧,留个说明,我找地方放。

雅枫 2003-11-23 10:20
mfc71.dll传上去了,

不过我觉得如果搞到这个dll的库文件,是可以用ollydbg来试试的
不知道谁有

2003-11-23 18:41
请这里下载:http://www.hhteach.org/dl/mfc71修正.rar

merzabeg 2016-05-23 19:31
真没有想到13年前的帖子帮我找到了翻译一个软件的要点!感谢教程!


查看完整版本: [-- VC++7.0软件调试心得及其修正 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Time 0.013261 second(s),query:3 Gzip disabled