Patch Vc6字体选择不能显示truetype字体缺陷

想在VC6中使用等宽编程字体比如CONSOLA字体,Vc6选项字体列表中无法显示出该字体。虽然可以通过修改注册表来设置字体以及字体大小,但是还是用的不舒服、不方便。

在默认的情况字体选择如下:

列表中出现的字体项比较少,而且没有我想要的选择的CONSOLA字体.现在我们来逆向帮助微软修改Vc6.

开启OD调试器,打开VC6.下断点bp EnumFontFamiliesA.为什么?因为我如果要在程序中实现列出系统所有字体我也要用这个函数啊。如下图:

F9运行,选择选项,源代码窗口字体,现在断在系统领空。如下图:

 

       Ctrl + G 输入50031bec 这个回调函数地址,为什么?自己去写个字体列表,就明白了。我们做字体筛选就是在回调函数里做的,是微软留给我们一个选择字体的机会。 如下图:

50031bec F2下断点,F9运行,断在这里了,将光标选中行的jnz改成jmp就可以了。

下面是修改好的VC运行效果:

呵呵,出来了,多了很多字体。也出现了我增加的等宽字体了。

下面是我写了个补丁程序,运行就可以了。核心代码如下:

    CFile file;
    
if (!file.Open(".\\DEVSHL.DLL",CFile::modeReadWrite))
    {
        MessageBox(
"打开失败");
        
return;
    }
    DWORD fileLen 
= file.GetLength();
    BYTE b;
    file.Seek(
0xc1b90,CFile::begin); //特征码
    file.Read(&b,1);
    
if (b == 0x98//sp6
    {

        file.Seek(
0x8adc7,CFile::begin);
        file.Read(
&b,1);
        
if (b == 0xeb)
        {
            MessageBox(
"sp6已经补丁过补丁成功");
        }
        
if (b == 0x74)
        {
            file.Seek(
0x8adc7,CFile::begin);
            b 
= 0xeb;
            file.Write(
&b,1);
            MessageBox(
"sp6补丁成功");
        }

    } 
else if (b == 0x04)
    {

        
//普通
        file.Seek(0x8c016,CFile::begin);
        file.Read(
&b,1);
        
if (b == 0xeb)
        {
            MessageBox(
"已经补丁成功");
        }
        file.Seek(
0x8c016,CFile::begin);
        
if (b == 0x74)
        {
            b 
= 0xeb;
            file.Write(
&b,1);
            MessageBox(
"补丁成功");
        }
    }
else
    {
        MessageBox(
"文件版本不对,无法补丁");
    }

    file.Close();

 补丁下载地址 :补丁

posted @ 2009-01-09 14:24  debugzhu  阅读(1533)  评论(0编辑  收藏  举报