sodiums 发表于 2021-1-26 17:24

CreateFontIndirectW方法求助

游戏程序在使用CreateFontIndirectA选择字库时我大概的确是悟了,
但如果使用CreateFontIndirectW根据https://www.52pojie.cn/thread-1200805-1-1.html 小木曾雪菜
写的教程显然是不适用的
CreateFontW function如下
~~~
HFONT CreateFontW(
int   cHeight,
int   cWidth,
int   cEscapement,
int   cOrientation,
int   cWeight,
DWORD   bItalic,
DWORD   bUnderline,
DWORD   bStrikeOut,
DWORD   iCharSet,
DWORD   iOutPrecision,
DWORD   iClipPrecision,
DWORD   iQuality,
DWORD   iPitchAndFamily,
LPCWSTR pszFaceName
);
~~~

与CreateFontA function的区别在于最后一项pszFaceName的类型

用x32dbg打开游戏主程序对CreateFontIndirectW下一个断点


一直运行至文本跳动,可以看到成功下断,跟到右下角那个地址去


往上找有关于dword的call


根据定义,这个call及其相似



此处有第一个问题:lfCharSet是哪个?
一眼望去,最有可能符合的是这一条,日文是0x80 中文是0x86

显然我们要想80改为86
我便是这样改了~

该游戏编码校验有明显特征
对程序搜索cmp al, 0x81,找到一条符合,进入


按照大佬的讲法,将部分内容更改,理论上应该是这个样子的


但是更改后经测试,文本依旧乱码,糟心啊~求大佬指点一下,还有哪个地方疏忽了

花边下丶情未央 发表于 2021-1-26 18:33

路径你要用Unicode编码

sodiums 发表于 2021-1-26 18:42

花边下丶情未央 发表于 2021-1-26 18:33
路径你要用Unicode编码

路径改为全是字母也仍旧乱码{:17_1089:}

花边下丶情未央 发表于 2021-1-26 18:44

sodiums 发表于 2021-1-26 18:42
路径改为全是字母也仍旧乱码

你要把ASCII编码转成Unicode的.W的函数涉及到字符的内容基本需要传的Unicode编码

花边下丶情未央 发表于 2021-1-26 18:46

你Hook这个函数,你用OutputDebugString输出参数你就知道怎么回事了

sodiums 发表于 2021-1-26 19:10

花边下丶情未央 发表于 2021-1-26 18:46
你Hook这个函数,你用OutputDebugString输出参数你就知道怎么回事了

老兄麻烦详细说一下,虽然我觉得你已经说出答案了,但是我还是不知道该怎么弄

花边下丶情未央 发表于 2021-1-26 22:00

用易语言写了个简单的例程,
分别Hook了CreateWindowExA和CreateWindowExW

这是CreateWindowExA的处理

CreateWindowExW

在这里 读出来的文本必须要UnicodeToAnsi 才能正常显示出ASCII编码

然后使用Depends.exe 作为被劫持的主程序
当读正常的ASCII编码时是可以正常显示出来的

但是你看下Unicode编码时是不正确的 需要转为ANSI才可正常显示出全部数据
Source就是原来的数据格式,New就是转换过的.

如果当你需要修改W函数的字符数据时,
你需要先把Ascii转成Unicode编码在将字节数组数据写入Unicode占两个字节

sodiums 发表于 2021-1-26 22:39

花边下丶情未央 发表于 2021-1-26 22:00
用易语言写了个简单的例程,
分别Hook了CreateWindowExA和CreateWindowExW



多谢多谢,我晚上研究一下
页: [1]
查看完整版本: CreateFontIndirectW方法求助