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,找到一条符合,进入
按照大佬的讲法,将部分内容更改,理论上应该是这个样子的
但是更改后经测试,文本依旧乱码,糟心啊~求大佬指点一下,还有哪个地方疏忽了
路径你要用Unicode编码 花边下丶情未央 发表于 2021-1-26 18:33
路径你要用Unicode编码
路径改为全是字母也仍旧乱码{:17_1089:} sodiums 发表于 2021-1-26 18:42
路径改为全是字母也仍旧乱码
你要把ASCII编码转成Unicode的.W的函数涉及到字符的内容基本需要传的Unicode编码 你Hook这个函数,你用OutputDebugString输出参数你就知道怎么回事了 花边下丶情未央 发表于 2021-1-26 18:46
你Hook这个函数,你用OutputDebugString输出参数你就知道怎么回事了
老兄麻烦详细说一下,虽然我觉得你已经说出答案了,但是我还是不知道该怎么弄 用易语言写了个简单的例程,
分别Hook了CreateWindowExA和CreateWindowExW
这是CreateWindowExA的处理
CreateWindowExW
在这里 读出来的文本必须要UnicodeToAnsi 才能正常显示出ASCII编码
然后使用Depends.exe 作为被劫持的主程序
当读正常的ASCII编码时是可以正常显示出来的
但是你看下Unicode编码时是不正确的 需要转为ANSI才可正常显示出全部数据
Source就是原来的数据格式,New就是转换过的.
如果当你需要修改W函数的字符数据时,
你需要先把Ascii转成Unicode编码在将字节数组数据写入Unicode占两个字节
花边下丶情未央 发表于 2021-1-26 22:00
用易语言写了个简单的例程,
分别Hook了CreateWindowExA和CreateWindowExW
多谢多谢,我晚上研究一下
页:
[1]