PPC字体修改之初步尝试

来源:互联网 发布:桥梁 健康 监测 软件 编辑:程序博客网 时间:2024/05/21 12:15
     现在让我们尝试着修改一个软件的字体,其实PPC的字体函数只有一个(我知道的),就是CreateFontIndirectW函数,虽然MFC中也有个CreateFont,但这只是CreateFontIndirectW的封装而已。Win32中不是还有个GetStockObject吗?可惜现在它只能生成一种字体,就是SYSTEM_FONT,并且显示非常正常所以GetStockObject就不必考虑了。所以似乎字体问题简单了起来……,不过PPC程序有些程序使用了动态的库如MFC库。又没有好用的Debug。所以好多程序的修改难度比较大,我现在也是处于摸索阶段。

现在先介绍一下CreateFontIndirectW这个函数:

HFONT CreateFontIndirect(
  const LOGFONT* lplf
);
Parameters
lplf

[in] Long pointer to a LOGFONT structure that defines the characteristics of the logical font.

Return Values
A handle to a logical font indicates success. NULL indicates failure. To get extended error information, call GetLastError.

上边是PPC2003的sdk里边的介绍,在MSDN里边也有。这个函数只有一个参数,就是Logfont结构体。返回值是一个字体的句柄,如果调用失败则返回NULL。Logfont是一个结构体,是如下定义的:
This structure defines the attributes of a font.
typedef struct tagLOGFONT {
  LONG lfHeight;
  LONG lfWidth;
  LONG lfEscapement;
  LONG lfOrientation;
  LONG lfWeight;
  BYTE lfItalic;
  BYTE lfUnderline;
  BYTE lfStrikeOut;
  BYTE lfCharSet;
  BYTE lfOutPrecision;
  BYTE lfClipPrecision;
  BYTE lfQuality;
  BYTE lfPitchAndFamily;
  TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;
这些参数不用我介绍了吧?有用的就是第一个即字体的高度。还有就是Charset,这是设置字符集的,不过在PPC下,似乎没啥用处。最后一个则是字体名,如“宋体”,“Tahoma”等。下边尝试着改一下一个软件的字体。
       第一个被动刀子的是大树(谁是大树?当然是风流倜傥,玉树临风的……还是自己到bbs.hanzify.org去问吧:)汉化的FunnySnake TKCreater这是个非常好用的主题编辑软件。这个软件几乎在我的PDA上没有一个标准字体-_-b,当然是先修改标准字体。我发现对话框字体全是Tahoma 8,可能是我PDA的分辨率问题吧。显示效果很差。所以我都改成了Tahoma 9就有些地方显示效果比较好了。但界面还有许多地方字体烂,譬如说主界面:


打开IDA Pro反汇编,搜索Font字串,找到几处:

一共找到7处,先分析第一处:

我们知道CreateFontIndirectW的参数只有一个。前面文章我们分析。前四个参数是通过寄存器传递。所以R0里边就是Logfont的地址了。看看上边图,IDA已经标出来了。R0里边的值是SP+#0xC0+var_BC。第一个参数也就是字体高度了。我们可以往上翻,找到设置字体高度的地方:

MOV    R3, #0xD

STR     R3, [SP,#0xC0+var_BC]

先把0d放入r3,然后把r3,放入SP+#0xC0+var_BC,这个地址。所以字体高度就是0d.我试着改成0e,其他也照样都改成0e.只是最后一个有点麻烦:

 


首先我们看到参数在
R4里边。再看前边:



首先,字体高度是在R7里边,而从上图的第一行来看则是来源于R2。R2又是这个字函数传入的第二个参数,所以改法即有两种:一是把  MOV     R7, R2,改成  MOV     R7, 0x0E,这样不管传入什么参数,得到的都是0x0E的字体,再一种改法便是到函数外边改:



双击图中的黄色部分,就到了调用处



修改这里就可以了。全部修改完后效果如下:



但是……


菜单成了这样字这是真么回事呢?原来是因为本来这地方是两行一样的字体摞起来的。字体改大后由于不一样了就成酱紫了。并且只要这地方改好了,主界面字体就完了,弄了好一阵子才改的像点样子了(这个太麻烦,我就不写了)。可惜最上边一行时间没法弄好了。算一个美中不足吧。还有一处美中不足的地方是关于对话框的那个连接,我也暂时没找到改法。