首页
社区
课程
招聘
[原创]Galgame汉化中的逆向(二):系统字库与文字编码
发表于: 2020-6-12 16:06 11372

[原创]Galgame汉化中的逆向(二):系统字库与文字编码

2020-6-12 16:06
11372


先上预览图。上节我们谈了谈如何找到解密文本的函数,以及如何来反汇编分析。这节来谈谈有关汉化调用系统字库与编码的问题、如何解决乱码、以及windows上常用的相关函数。通常我们要做的是:

此系列与我在隔壁还有贴吧发的相同,
上期:Galgame汉化中的逆向 (一):文本加密(压缩)与解密

以winodws系统来看,字符编码主要有两种:

Multibyte为变长字符,中ASCII字符为1字节,中文或日文等为两字节,不同系统编码不同,必须要指定对应的codepage才能正确显示。其中GB2312与shift-jis属于MultiByte;WideChar可以看作是unicode,或者说utf-16,两字节宽字符,所有系统编码都相同。

utf-8是一种Multibyte编码, 也是unicode的一种存储形式(可以理解为unicode是一种标准,utf-8是一种实现方式),最短为8位,通过位运算可以很容易和unicode进行变换。如下,将x位拼起来就是unicode,其中汉字通常为,0xEx开头。

1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx

shift-jis即 JIS X 0208子集的所有字符,可以参考sjis字符表

第一位字节 使用0×81-0×9F、0xE0-0xEF (共47个)
第二位字节 使用0×40-0×7E、0×80-0xFC (共188个),没有7F。

一般查字库的时候多用这几个边界处字符定位,0x8141[、], 0x889f[亜], 0xe040[様]

gb2312简中编码和sjis差不多,但是中间没有断层,这点要方便不少。
范围0xA1A1~0xFEFE,其中汉字编码范围是0xB0A1~0xF7FE, 详见gb2312字符表

不同编码集的字符转换通常要通过WideChar为桥梁,转换函数没MultiByteToWideCharWideCharToMultiByte。通过CodePage来进行不同字符集到WideChar转换,其中932为sjis编码,936为gb2312编码。

有时候游戏调用CreateFileW等相关需要宽字符的函数,而MultiByteToWideChar中codepage为0(跟随系统),这时候就可能找不到文件,如下图。

我们需要把代码改成0x3A4。可以通过hook此函数,hook不好用就直接改exe,如果利用push eax相关的短指令则需要用code cave了。

Frida hook MultiByteToWideChar

Code Cave

游戏中通常用CreateFontIndirectA来选择字库,函数如下:

日文游戏显示乱码原因多半是lfCharSet值输入为1(ANSI_CHARSET 0 BALTIC_CHARSET 1,跟随系统),语言根据徐通决定,我们要改成0x80 日语,汉化后要改成0x86 中文。其中lfCharSet大多在CreateFontIndirectA上面。
比如说改为,mov dword ptr ds:[532798], 80000000,修改乱码如图所示。

游戏中选择字体的时候通常用EnumFontFamiliesAEnumFontFamiliesExA来枚举可用字库,通常会在FONTENUMPROCA回调函数中,通过charset来过滤其他字库。
如:

这个函数声明如下, charset就在LOGFONT结构体里, charset 0x80为日语, 0x86为中文。

一般来说常用的函数是GetSystemDefaultLCID,返回值是系统语言代码,英文 0x409,日文 0x411, 简中0x804,繁中0x404。

游戏窗口标题可能存储在游戏资源文件里,不一定在exe里面,通过CreateWindowEx来初始化窗口标题,或者SetWindowText


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-6-12 16:07 被devseed编辑 ,原因:
收藏
免费 9
支持
分享
最新回复 (10)
雪    币: 4
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
楼主大神呀
2020-6-12 19:08
0
雪    币: 1556
活跃值: (2297)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
呐呐呐呐呐呐呐呐呐呐呐呐呐呐呐呐呐呐呐呐呐呐呐呐呐呐
2020-6-12 19:18
1
雪    币: 796
活跃值: (2054)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

2020-6-12 20:59
0
雪    币: 1103
活跃值: (521)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
白石好评!!!
2020-6-12 23:06
0
雪    币: 10017
活跃值: (3457)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6

2020-6-13 00:40
0
雪    币: 4942
活跃值: (4663)
能力值: ( LV10,RANK:171 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2020-6-18 22:45
0
雪    币: 199
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8

2020-6-20 15:16
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
楼主能不能研究一下dmm games apk上的安卓移植galgame,有很多大作已经移植到手机了,日厂也有些开窍了。要是能实现这部分的逆向,手机上玩galgame又有更多选择了
2020-7-7 10:26
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
想问个问题。如果遇到需要Locale Emulator才能打开的galgame。该怎么调试呢
我试过ollydbg的 attach 但成功率很低
游戏是LC-Script Eingine
2020-8-3 20:33
0
雪    币: 6296
活跃值: (4962)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
11
Sshwy 想问个问题。如果遇到需要Locale Emulator才能打开的galgame。该怎么调试呢 我试过ollydbg的 attach 但成功率很低 游戏是LC-Script Eingine
hook或者直接改相关api否codepage
2020-8-4 01:15
1
游客
登录 | 注册 方可回帖
返回
//