Galgame汉化中的逆向(七):动态汉化分析2_以AZsystem引擎为例
好久没发帖了,不知不觉又到了除夕,祝大家新年快乐~
by devseed , 本贴论坛和我的博客 同时发布
本贴代码开源详见我的github: GalgameReverse , ReverseUtil 。
上篇链接:Galgame汉化中的逆向(六):动态汉化分析_以MAJIROv3引擎为例
0x0 前言
上节 [Galgame汉化中的逆向(六):动态汉化分析_以MAJIROv3引擎为例](),我们介绍了动态汉化。动态汉化不用分析封包结构,不用分析opcode,看上去很方便,但是动态汉化解决同步问题会很麻烦,比如说改完文本后backlog文本仍是日文、返回主界面再载入文本没有变动等问题。动态汉化也有可能出现莫名其妙的崩溃bug,且这些bug不容易被调试。
针对动态汉化的上述缺点,本节我们将介绍一种这种半动态汉化的方案。与上节的方法不同,本节不进行文本级替换,而是文件级别的替换。即去hook相关函数,动态将解密后的缓冲区替换为我们汉化后的文件。适合于那种封包与加密特别麻烦或复杂 的游戏。
本文将以azsystem为例,来分析:
引擎如何加载游戏脚本,如何定位关键点提取脚本
引擎如何加载图片,如何解压各通道数据,如何将图片数据送入帧缓存渲染
汉化如何用inline hook对加载后的内容进行替换
0x1 脚本文件分析与提取
(1) asb文件的分析
和上节相同,第一步先分析文件,无论静态分析算法还是动态dump缓冲区,先把文件提取出来。
由于方法差不多,这里不再详细展开了。
这个游戏封包为.arc文件,用文件长度哈希值来作为加密密钥,里面有若干个.asb脚本文件。IDA里面直接搜.asb字符串就能找到相关函数了,读取脚本文件函数如下:
int __thiscall sub_43112A(_DWORD *this, char *script_name)
{
char *raw_data; // edi
int v4; // eax
unsigned int v5; // ecx
_DWORD *v7[4]; // [esp+8h] [ebp-34h] BYREF
int v8; // [esp+18h] [ebp-24h] BYREF
unsigned int compressed_size; // [esp+1Ch] [ebp-20h]
unsigned int raw_size; // [esp+20h] [ebp-1Ch]
int v11; // [esp+24h] [ebp-18h]
int (__thiscall **v12)(void *, char); // [esp+28h] [ebp-14h]
char *compressed_data; // [esp+2Ch] [ebp-10h]
int v14; // [esp+38h] [ebp-4h]
v7[0] = off_460A6C;
sub_40BD95(v7);
v14 = 1;
v12 = &off_462CDC;
v11 = 0;
sub_430FC9((int)this);
if ( fopen_40C102(v7, script_name, 0x80000000) != 1 )
{
logprintf_407C41("CScript::Create", byte_4679CC, script_name);
goto LABEL_13;
}
readfile_40C03E(v7, (char *)&v8, 0xC);
if ( v8 == 0x1A4253
支付6UD,阅读全文
还有更多的精彩内容,作者设置为付费后可见