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();
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();
补丁下载地址 :补丁