·汉化新世纪 ·汉化新世纪论坛 ·百家争鸣 ·论坛集萃 ·汉化问答 ·软件介绍
文章首页 >> 汉化教学 >> VC汉化 >> WinAMP 字号的修改-C 程序字号修改一例    Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎

WinAMP 字号的修改-C 程序字号修改一例

作者: 梁利峰 来源:点睛工作室 时间:2003-08-02 点击:7859


WinAMP 字号的修改
        —— C 程序字号修改一例


声明

个人可以自由转载本文,不过应保持原文的完整性,并通知我;商业转载先请和我联系。

本文没有任何明确或不明确地提示说本文完全正确,阅读和使用本文的内容是您自己的选择,本人不负任何责任。

如果您发现本文有错漏的地方,请您给我指出;如果有什么不理解的,请您给我提出。

意见、建议和提出的问题最好写在我的主页 http://llf.126.com 的留言版上。

WinAMP 的问题

使用过 WinAMP 的人大概都会知道 WinAMP 在它的主窗体上显示歌名的时候,使用的字号小于我们常说的“宋体,9”,所以显示的结果很不好。日本人曾做了一个 WinAMP 的显示插件 Yuna Sexy Font 用覆盖的方式显示歌名,确实可以用,不过我很不喜欢 —— 只是改变一下字号而已,却需要一个插件,而浪费许多的系统资源,实在不划算!

那么可不可以直接修改 WinAMP 的可执行文件使之直接显示“宋体,9”呢,当然是可以的,不过,问题在于我们修改它的资源里的所有对话框的字体后,歌名仍然显示的并不是“宋体,9”,原因何在呢?自然是因为 WinAMP 是在源程序上设置的字体字号,这就使得修改它的字号很不容易了。

还有一点,虽然我们说要显示“宋体,9”,但是对于 WinAMP 来说并不是 9 ,从它的选项对话框里的“显示”中的“播放清单字体大小”的设置,我们可以知道,设置成 12 的时候它显示的才是我们所说的“宋体,9”。

另外还要注意,在不使用 Yuna Sexy Font 的时候需要将选项对话框中的“显示”中的“使用点阵字来显示主要标题”的选项关掉,才能显示中文字的。

修改的尝试

好的,我们开始修改 WinAMP 的字号,不过在这之前,需要先统一我们的装备。

首先,我使用的是 Windows 98 简体中文版,而 WinAMP 是 2.63 英文版,并且使用 Brucez 制作的中文语言包“Chinese.lng”,另外,如前一节所说,把“播放清单字体大小”设置为 12 ,把“使用点阵字来显示主要标题”设置关掉。

然后,我们就可以开始了。

运行 Trw2000 ,选择 Winamp.exe ,点击“Load”,出现 Trw2000 的调试画面,键入“bpx CreateFont”,让它在 WinAMP 调用 API 函数 CreateFont 的时候中断,然后按“F5”运行 WinAMP 。

好一个漫长的等待,让我都以为是死机了,不过 Trw2000 的调试画面终于又出来了,停留在 API 函数 CreateFontA (CreateFontA 是 CreateFont 的 ASCII 版本)的入口处。

现在,先看一下 WinAMP 在启动时究竟调用了多少次 CreateFont ,所以一直按“F5”,从 Trw2000 中断的次数可以知道,WinAMP 在启动时一共调用了 4 次 CreateFont 。

现在,关闭 WinAMP ,再次在 Trw2000 的窗体上点击“Load”,再次出现 Trw2000 的调试窗体,按“F5”,等到 Trw2000 的调试窗体再次出现,一直按“F10”,可以看到,CreateFont 函数位于 GDI 模块里,其中有调用了 Kernel 模块的一个函数,然后返回 WinAMP ,因为需要在调用 CreateFont 之前看到其参数,以便决定哪一个调用是对应于歌名的,所以使用“BC”清除断点,并且在 Kernel 里最后一个返回语句上按“F9”设置断点,然后一直按“F5”,直到 WinAMP 运行起来,然后关闭它。

再次“Load”,按“F5”,这一次它停在 Kernel 中的返回语句上,再按“F10”,回到 WinAMP 所在的代码区,向上看,可以看到如下的代码:

	PUSH EDX
	CALL EDI

可以验证“CALL EDI”在这里就是“CALL GDI!CreateFontA”,另外因为 CreateFont 函数的第一个参数就是字体大小,所以在这里,“PUSH EDX”就是这个参数。在“PUSH EDX”上按“F9”设置断点,然后再次按“F5”,又到了 Kernel 中的返回语句上,按“F10”回到 WinAMP 的代码区,向上看,又有这样的一些代码:

	PUSH BYTE -0A
	CALL EDI

同样可以验证“CALL EDI”在这里就是“CALL GDI!CreateFontA”,所以在“PUSH BYTE -0A”上按“F9”设置断点,再次按“F5”,发现第三次调用 CreateFont 和第一次的地址相同,而第四次调用和第二次的地址相同,并且第一、三两次调用在执行到“CALL EDI”的时候,堆栈顶部的值是“F4 FF FF FF”,就是 fffffff4h ,而第二、四两次调用执行到“CALL EDI”的时候,堆栈顶部的值是“F6 FF FF FF”,就是 fffffff6h 。

因为调用 CreateFont 的时候,只有字体大小的值是负数的时候才显示正常,如果是正数的话则显示的结果略小,所以这里的调用都是把它赋值为负数的,fffffff4h 就是十进制的“-12”,而 fffffff6h 就是十进制的“-10”,所以我们可以推测,第一、三次调用的结果是“宋体,9”,而第二、四次调用的结果是“宋体,8”。(详细的说,第二次调用是为了在歌名显示区显示 WinAMP 的版本号的,第四次调用才是显示歌名用的)

现在,为了测试一下,在第二、四两次调用的时候,当执行到“CALL EDI”的时候,键入“E ESP”,并且修改堆栈里的参数,原来是“F6 FF FF FF”,修改成“F4 FF FF FF”,然后继续运行程序,可以看到,WinAMP 中的歌名已经显示为“宋体,9”了!

然后就是对源文件的修改了,从代码上可以看到,只需要把“PUSH BYTE -0A”改成“PUSH BYTE -0C”就可以了,不过 Trw2000 把汇编命令“A”留给了注册用户,所以我们需要自己判断要修改成的代码。

首先,“BYTE”是类型标识符,它指明后面的“-0A”是一个字节长度的值,当然,作为“PUSH”来说,在 32 位的系统上总是把四个字节的值压入堆栈的,不过 CPU 在这里做了转换,把单字节的“-0A”转换成了四字节的“-0A”,不过这并不关我们的事,我们只要知道“-0A”就是“F6”就可以了。

好的,键入“Code On”,察看字节流,相对于“PUSH BYTE -0A”的是“6A F6”,好了,想必把它修改成“6A F4”就可以了。现在记下它前面的一些字节,在这里是“68 90 01 00 00 55 55 55 6A F6”(还记得“90 01 00 00”是什么?对了,就是字符宽度,如果要修改成粗体的话,修改这里就对了:),然后退出 WinAMP 和 Trw2000 。

用 UEdit 打开 Winamp.exe ,查找“68 90 01 00 00 55 55 55 6A F6”,只找到了一个,所以就是它了,把最后的“F6”改成“F4”,然后运行 WinAMP ,很不错,不是吗? :)

最后的问题

虽然我这里使用的英文版,不过因为是对代码的修改,和资源无关,所以这种方法同样也适用于田伟男汉化的版本,不过 Brucez 汉化的版本因为做了压缩,并且使用现有工具不能完全正确的解压缩,所以不能使用这种方法,因为使用 fi 测试说是 Aspack 压缩的,但是使用 UnAspack 并不能正常解压,所以怀疑还做了加密处理。

我个人是比较喜欢中文语言包“Chinese.lng”的,那么,这种“.lng”文件究竟是什么呢?其实就是动态链接库罢了,而且 Brucez 做的“Chinese.lng”也压缩了,不过使用 UnAspack 可以正常解压缩,当然,这并没有什么用处,因为不解压也可以正常使用,而如果要得到其中的资源,不论其使用什么方法压缩、加密,使用 API 函数 LoadLibary 都可以完全得到,毕竟既然 Windows 能正常读取并显示,我们也一样可以!

好了,回到 WinAMP 上,我们可以看到,虽然歌名的区域确实显示成“宋体,9”了,不过字体最上面一行被剪切了,这才是我们应该解决的问题,对于这个问题,我是没有精力解决了,不过我想,如果只是把字显示的低一些的话,可以试着跟踪 API 函数 TextOut (一定会有很多的 TextOut 调用的吧),如果要修改歌名显示区的大小的话,我想应该跟踪剪切函数,究竟是什么呢?我不知道。 :(

我想说一下,Trw2000 是一个调试工具,而不是(或不只是)一个破解工具,不要总想着如何破解,多想想如何完善软件应该更有意义吧。

另一种方法

在写完本文并上传之后,我发现我以上的介绍其实非常繁琐,而使用 Trw2000 是不需要这么麻烦的,所以增加这一节,简单说一下这种方法。这种方法不需要像我上面说的“一直按‘F10’,直到…”,而只需要使用一条“pmodule”指令就可以了,所以非常方便。

打开 Trw2000 ,选择 Winamp.exe ,点“Load”,出现调试窗体。键入“bpx CreateFont”,然后按“F5”,等到 Trw2000 的调试窗体再次出现,键入“pmodule”,回到了 WinAMP 所在的代码区,向上看,可以看到如下的代码:

	PUSH EDX
	CALL EDI

在“PUSH EDX”上按“F9”设置断点,再次按“F5”运行,等到 Trw2000 的调试窗体再次出现,键入“pmodule”,回到了 WinAMP 所在的代码区,向上看,可以看到如下的代码:

	PUSH BYTE -0A
	CALL EDI

在“PUSH BYTE -0A”上按“F9”设置断点,然后按“F5”运行,发现第三、四两次调用和上面两次调用地址相同,进而得知把“PUSH BYTE -0A”修改成“PUSH BYTE -0C”即可。

以后的步骤相同,略。

不得不说,“pmodule”指令非常好用(“pnewsec”也非常好用),而我总是想不起来,实在是不应该的。 :(

点睛工作室·梁利锋 结稿于 2000.6.8(6.9 补充)

汉化新世纪 责任编辑: 乾 .:|:. 标签(Tag): 字体 Trw2000

·上一篇: 突出重围-VB 程序字体字号修改之四 ·下一篇: ProcDump 字号的修改-C 程序字号修改另一例

· 版权申明: 本文引自《点睛工作室》,如有版权疑问请及时联系本站,以便本站处理。

· 转载申明: 本文引自《点睛工作室》[ 作者: 梁利峰],如需转载请直接联系原始作者,并请注明原始出处。

相关文章                                                                                发表评论 打印此文 关闭窗口

| 设为首页 | 加入收藏 | 联系我们 | 友情链接
Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎
本站内容,除转载或版权特别申明的内容外,皆遵守 创造共用协议中文版之“署名-非商业性使用-禁止演绎 2.5 中国大陆”条款
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 2.5 China License.
本网站内容源自汉化新世纪论坛的摘录和汉化新世纪成员的原创文章。
凡汉化新世纪论坛的文字皆默认为汉化新世纪与原作者共同拥有并授权发布。
如对本站发布文章有所异议请来信告知,我们将及时删除。
凡商业摘录本站文字请先与我们联系,本站将保留非授权商业发布的追究权利。
凡非商业摘录本站文字请明显注明出处和原作者,并不得改动,凡改动必先征求原作者同意。
苏ICP备05002283号