GalGame汉化教程(一)——Ollydbg修改编码和字体

使用的工具:

吾爱破解专用版Ollydbg
010 Editor


以下的教程为全局的字体修改,是在接近最底层的文字打印函数的附近修改参数实现的。
如果想实现局部的字体修改,则需要自己定位到相应的地方。


1.定位到CreateFontIndirectA函数

首先将要进行汉化的软件使用ollydbg运行起来,并且运行到出现打印字体(即要修改的字体)的地方,然后在ollydbg查找所有模块中的函数
在这里插入图片描述
找到CreateFontIndirectA函数,选第一个CreateFontIndirectA函数即可,第二个应该是第一个的具体实现(PS:这里定位到函数名直接打字就行了,会在第一个箭头的地方显示你打的字符)。
在这里插入图片描述
双击函数名进入对应的汇编代码,使用F2在retn处下断点,然后运行程序,使用F8单步跳过进入调用这个函数的上一级函数。
在这里插入图片描述


2.修改CreateFontIndirectA函数的参数

在汇编里面,函数的调用的时候都是将函数的参数入栈,然后进入函数执行的时候将参数出栈使用,因此这里的主要思路是先搞清楚该函数的参数,并且留意关于栈修改的操作,如MOV,PUSH等

这里先看一下CreateFontIndirectA的官方文档

可以看到这个函数只有一个LOGFONT的结构体指针,接下来查看该结构体的具体定义,即可找到我们要改的数据的位置。

typedef struct tagLOGFONTA {
  LONG lfHeight;
  LONG lfWidth;
  LONG lfEscapement;
  LONG lfOrientation;
  LONG lfWeight;
  BYTE lfItalic;
  BYTE lfUnderline;
  BYTE lfStrikeOut;
  BYTE lfCharSet;//编码
  BYTE lfOutPrecision;
  BYTE lfClipPrecision;
  BYTE lfQuality;
  BYTE lfPitchAndFamily;
  CHAR lfFaceName[LF_FACESIZE];//字体名
} LOGFONTA, *PLOGFONTA, *NPLOGFONTA, *LPLOGFONTA;
a.参数查找

参数的查找只要在调用CreateFontIndirectA的上方查找即可(注意一般范围不是很大,就在附近,不要跑远了)

首先说一下编码,日语的lfCharSet是0x80,而gb2312的lfCharSet是0x86,修改的时候只要留意那个地方的值是0x80就可以了

接下来说一下字体名,由于汉化的是日语软件,而我的Ollydbg无法显示日语字符(不知道有没有相关的插件),所以这里在找的时候就留意一下Ollydbg自动生成的注释(就是那些在右边的程序名.xxxxxxx),由于这是一个字符串,所以入栈的时候一定会先找到字符串的地址,然后再将字符串拷贝进栈。

b.例子

以下为上面调用CreateFontIndirectA的函数,关键参数已经标出来了,编码的修改十分简单,直接在原来的地方改即可,下面的图是已经修改成了gb2312了。接下来我会着重讲一下字体的修改。(注意fontname入栈的注释应该是下面一条指令的,这里我只是为了不破坏原来的注释,才在指令的上一条做注释)
在这里插入图片描述

c.字体的修改

字体修改的原理无非就是将原本要写入栈的字符串的地址换成我们要改的字符串的地址,这里要分两种情况来分析。
(PS:这里的关键是你得先找到原先字体名字符串的地址,不过由于Ollydbg已经将地址常量用注释标出来了,因此不是很难发现,一般看到常量之后就右键跟随到内存,如果是一小段乱码并且以00结尾,就极有可能是字符串)

情况一:exe文件里面有字体设置的代码

这种情况是最简单的,当我们定位到了那个字符串的地址(图片的地址是008C2CF4)时候,选择在数据窗口跟随,可以看到一段乱码,将其复制出来粘贴到010-Editor里面观察
在这里插入图片描述
字体的编码如图
在这里插入图片描述
拿到这段二进制代码,然后用010-Editor打开游戏程序,搜索一下这段二进制,如果找到了,那么很好,你只要在找的地方修改二进制,将换成你要修改的字体名的二进制即可(PS:注意这里的字体名需要和上面设置的编码一样的编码,如果设置为gb2312,那么字体名的二进制也要是gb2312下的二进制,并且二进制的长度不能超过原来的二进制的长度,如果原来的短的话,还需要补00对齐,保证后面的汇编指令对齐)。

情况二:exe文件里面有没有字体设置的代码

在这种情况,我们就只能在Ollydbg里面搜索空白的程序段,如INT3,NOP指令的程序段,然后右键二进制编辑,将要字体名的二进制输入去,并记下地址。

在我上面那张图里面,由于空间不足以将地址写进去,所以我们需要找到esi被赋值的地址观察代码,发现上文都没有esi的修改代码,因此猜测是在更上一级的函数,继续定位到上一级的函数

在这里插入图片描述
这里的查找方法就只能你先发现原先字体字符串的地址,然后观察那里有那个地址的赋值,照常往上检索。检索到之后就看一下够不够空间修改,这里我们发现是够的,因此只要将0x00413F79处的汇编指令中的第二个操作数改成上面自定义的字符串的地址即可。


3.保存修改

右键-复制到可执行文件-所有修改
然后会弹出另外一个子窗口
右键-保存文件


  • 17
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值