其他
Galgame汉化中的逆向(二):系统字库与文字编码
本文为看雪论坛优秀文章
看雪论坛作者ID:devseed
0x0 前言
解除非日文系统区域限制
修正游戏由于编码问题无法找到对应文件
修正游戏中的乱码,标题中的乱码
修改游戏中字符的限制,为中文汉化做准备
上期:Galgame汉化中的逆向 (一):文本加密(压缩)与解密
ps. 点击文字即可跳转查看~
0x1 文字编码
Multibyte(类型表示为 char *, LPSTR, ),
WideChar(类型表示为 wchar_t *, LPWSTR, L"")。
(1) utf-8
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
(2) shift-jis, SHJIS, cp932
(3) gb2312, cp936
0x2 字符转换
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
_In_NLS_string_(cbMultiByte)LPCCH lpMultiByteStr,
int cbMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar);
var kernel32_MultiByteToWideChar = Module.findExportByName("kernel32.dll", "MultiByteToWideChar");
console.log('MultiByteToWideChar at '+ kernel32_MultiByteToWideChar);
var g_multibyte_ptr;
var g_wide_ptr;
var g_n=0;
Interceptor.attach(kernel32_MultiByteToWideChar, {
onEnter: function (args, state) {
g_multibyte_ptr = args[2];
g_wide_ptr = args[4];
console.log(g_n +", cp"+args[0].toString(10))
args[0] = ptr('932');
g_n++;},
onLeave: function (retval) {
console.log(g_multibyte_ptr.readAnsiString() + ", " + g_wide_ptr.readUtf16String()) }
0x3 调用系统字库
HFONT CreateFontIndirectA( const LOGFONTA *lplf);
typedef struct tagLOGFONTA {
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet; //0x17
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
CHAR lfFaceName[LF_FACESIZE];
} LOGFONTA, *PLOGFONTA, *NPLOGFONTA, *LPLOGFONTA;
0x4 枚举系统字库
mov edi, dword ptr ss:[ebp + 8] ;arg1
cmp byte ptr ds:[edi + 17], 80 ;japanese
int CALLBACK EnumFontFamProc(
ENUMLOGFONT FAR *lpelf, // pointer to logical-font data
NEWTEXTMETRIC FAR *lpntm, // pointer to physical-font data
int FontType, // type of font
LPARAM lParam // address of application-defined data );
int EnumFontFamiliesExA(
HDC hdc,
LPLOGFONTA lpLogfont,
FONTENUMPROCA lpProc,
LPARAM lParam,
DWORD dwFlags);
typedef struct tagENUMLOGFONT { // elf
LOGFONT elfLogFont; //这项结构如tagLOGFONTA所示
BCHAR elfFullName[LF_FULLFACESIZE];
BCHAR elfStyle[LF_FACESIZE];
} ENUMLOGFONT;
0x5 其他
(1) 系统语言检测相关
(2) 游戏窗口乱码修复
(3) 点阵字模
DWORD GetGlyphOutlineA(
HDC hdc,
UINT uChar,
UINT fuFormat,
LPGLYPHMETRICS lpgm,
DWORD cjBuffer,
LPVOID pvBuffer,
const MAT2 *lpmat2);
看雪ID:devseed
https://bbs.pediy.com/user-617776.htm
*本文由看雪论坛 devseed 原创,转载请注明来自看雪社区。
推荐文章++++
好书推荐