·汉化新世纪 ·汉化新世纪论坛 ·百家争鸣 ·论坛集萃 ·汉化问答 ·软件介绍
文章首页 >> 汉化时事 >> 论坛集萃 >> 字体之客串修改    Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎

字体之客串修改

作者: 雅枫 来源:汉化新世纪论坛 时间:2003-10-23 点击:9079

字体之客串修改
雅枫

 

前几天看了炎之川兄写的那篇关于GetStockObject字体修改的教程,最后炎兄提到可不可以用CreatFontA来实现其他字体的修改,我认为是可以的(前提是输入表中要有CFA这个函数),炎兄让我试试,当时由于手头没工具也太麻烦,也就没有去做。这几天放暑假了,在狂学VC(“真正的程序员用VC++,聪明的程序员用Delphi”我不聪明,又想编程,所以就只能用VC了)。也不知道怎么想起来的,便拿起工具弄着梁兄那个例子干了起来,最后也终于成功了,黄天不负有心人哦,呵呵,其实这点技巧也没多大用处,除非输入表中都有这些函数,或许能减少一下工作量,所以我写这些的目的,在于介绍一下修改思想,或许对大家修改字体有所帮助,同时,也简略介绍用Ollydbg修改字体的方法.
用到的工具:ollydbg,hedit,Poscon,先介绍一下工具:Olldbg工具不用我说了大名鼎鼎了(btw:自从用上这个,w32dasm我基本扔了,trw备用作功能补充)HEDIT是我比较常用的16进制编辑器,原因嘛:比较小巧速度又快,感觉比UE好用,Poscon就是梁兄编的那个“偏移量转换器”了
先用Ollydbg对例子程序进行反汇编(比w32dasm快多了),完成后单击右键(在代码区)->搜索->全部交互调用,呵呵列出了调用的所用的api然后排序很容易就找到了CreatFontA与CreatFontIndirectA,且只有一次调用,没有GetStockObject函数,那就用cfa改一下cfia的字体吧,用鼠标双击CreatFontA转到了调用处代码如下
代码

. 68 B4514000     PUSH FONTSETS.004051B4    ; /FaceName = "Arial" ************
. 6A 00           PUSH 0                    ; |PitchAndFamily = DEFAULT_PITCH|FF_DONTCARE
. 6A 00           PUSH 0                    ; |Quality = DEFAULT_QUALITY
. 6A 00           PUSH 0                    ; |ClipPrecision = CLIP_DEFAULT_PRECIS
. 6A 00           PUSH 0                    ; |OutputPrecision = OUT_DEFAULT_PRECIS
. 6A 00           PUSH 0                    ; |CharSet = ANSI_CHARSET *************
. 6A 00           PUSH 0                    ; |StrikeOut = FALSE
. 6A 00           PUSH 0                    ; |Underline = FALSE
. 6A 00           PUSH 0                    ; |Italic = FALSE
. 68 90010000     PUSH 190                  ; |Weight = FW_NORMAL
. 6A 00           PUSH 0                    ; |Orientation = 0
. 6A 00           PUSH 0                    ; |Escapement = 0
. 6A 00           PUSH 0                    ; |Width = 0
. 6A E2           PUSH -1E                  ; |Height = FFFFFFE2 (-30.) ***********
. FF15 00504000   CALL[CreateFontA]          ; \CreateFontA

看到了吧?Ollydbg这方面比W32dasm强多了连Api的参数也给解释的完完整整,呵呵,我写上*的地方就是我们以前改字体常修改的地方了,我们先研究一下cfa的调用14个参数对应着14个push,这个大家可能很熟悉了,我们先看第一个push,是字体名了是push的004051b4用Poscon转换一下是41b4,41b4处是什么呢?用hedit打开转到0x41b4处呵呵是arial,真的是字体名呀!看来是压入的字串的偏移量(也就是c语言中的指针),后边的就是压入的数字,都是直接压入的,没什么好说的,不过最好记下createfonta的调用码00504000,知道了这些,我们就可以在文件头处加上我们的代码了
代码

68 F0034000       push 004003F0
6A 00             PUSH 0
6A 00             PUSH 0
6A 00             PUSH 0
6A 00             PUSH 0
6A 86             PUSH -7A
6A 00             PUSH 0
6A 00             PUSH 0
6A 00             PUSH 0
6A 00             PUSH 0
6A 00             PUSH 0
6A 00             PUSH 0
6A 00             PUSH 0
6A F4             PUSH -0C
FF15 00504000     CALL DWORD PTR DS:[<&GDI32.CreateFontA>]
C3                RETN

就是调用cfa函数最后在加个c3返回了我是在0x2a0处加上的0x2a0转换后是A0024000然后随便找个地方填上A0024000,我是在0x2ca处,ox2ca转化后的地址是:CA024000记下这个地址,然后就是改动代码了,因为我们是想用cfa来改cfia所以找到cfia的代码处
代码

. 8D4C24 10       LEA ECX,DWORD PTR SS:[ESP+10]
. 51              PUSH ECX                    ; /pLogfont
. FF15 0C504000   CALL[CreateFontIndirectA>]  ; \CreateFontIndirectA

只要把51改成90,把FF150C504000改成FF15CA024000就ok了

其实就这个例子来说更简单的方法是用cfia的方法了,我们看到PUSH ECX 的前一句是LEA ECX,DWORD PTR SS:[ESP+10],这说明前一句是用来给ECX赋值的,这两句加起来足有6个字节了呵呵,直接加个logfont块然后把8D4C241051改成68XXXXXXXX90(XXXXXXXX为logfont块的指针

再接再厉
我们用cfa改了cfia的字体,然后我们再用cfia改cfa的字体cfa那么多参数一定够用cfia了,所以我们可以完全不用Ronnier兄提出的那个把函数拿出来的那个方法了直接在0x300处加一个logfont块然后在call cfia前push 00034000就行了修改后代码如下:
代码

00401092   . 90             NOP
00401093   . 90             NOP
00401094   . 90             NOP
00401095   . 90             NOP
00401096   . 90             NOP
00401097   . 90             NOP
00401098   . 90             NOP
00401099   . 90             NOP
0040109A   . 90             NOP
0040109B   . 90             NOP
0040109C   . 90             NOP
0040109D   . 90             NOP
0040109E   . 90             NOP
0040109F   . 90             NOP
004010A0   . 90             NOP
004010A1   . 90             NOP
004010A2   . 90             NOP
004010A3   . 90             NOP
004010A4   . 90             NOP
004010A5   . 90             NOP
004010A6   . 90             NOP
004010A7   . 90             NOP
004010A8   . 90             NOP
004010A9   . 90             NOP
004010AA   . 90             NOP
004010AB   . 99             CDQ
004010AC   . 0909           OR DWORD PTR DS:[ECX],ECX
004010AE   . 68 00034000    PUSH FONTSETS.00400300        ; /pLogfont = FONTSETS.00400300
004010B3   . 90             NOP                           ; |
004010B4   . FF15 0C504000  CALL [CreateFontIndirectA>    ; \CreateFontIndirectA


可以看到,我把省出来的字节都改成了nop(90)及空操作
当然我们也可以用Ronnier兄的那个方法,我就不再介绍了附件中给出了3个程序供大家参考
fontsetsa.exe ;原文件
fontsetsM.exe ;上面修改后的文件
fontsetMr.exe ;用Ronnier兄方法改后的文件

一些小启示,修改字体的3个函数中cfa用的字节最多,cfia可有需要0字节改法与5字节改法,前者比较麻烦,而后者虽比较简单但不容易找到这么多字节,而stockobject函数调用只需要2个字节,即除调用函数外只需要2个字节,如果程序的输入表中有GetstockObject函数,而想改的字体又是"宋体9"可直接改成6a11 call getstockobject就可以了.
btw:曾试着用Lordpe为程序加Api函数,程序却嗷嗷叫的非法操作.郁闷ing.不知道是这个程序的问题呢还是我改的方法不对(这个程序用Import REC找不到输入表)(新解,这个软件居然是VC++7.0编写的,可能与VC6的结构有所不同把)
还有,大家修正字体后千万别用Upx压缩,那家伙会改文件头,一压就非法操作

 

这个是里边的例子程序,大家可以对比一下

  下载附件
kechuanxiugai.rar

 

炎之川
hoho,支持支持~~

代码段重贴一下吧,用 “CODE”标签,效果会稍好一些,或者把半角空格替换成全角空格效果也很好

比如

代码
004040FB |. 6A 0A     PUSH 0A
004040FD |. 51       PUSH ECX
004040FE |. 6A 6B     PUSH 6B


原帖子在此

 

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

·上一篇: Passolo 使用全攻略之高手进阶 ·下一篇: 字串替换器 1.05 版及新的注册方法

· 版权申明: 本文引自《汉化新世纪论坛》,如有版权疑问请及时联系本站,以便本站处理。

· 转载申明: 本文引自《汉化新世纪论坛》[ 作者: 雅枫],如需转载请直接联系原始作者,并请注明原始出处。

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

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