• 采用的工具:x32dbg

  • 在教程一中,修改编码是定位到了CreateFontIndirectA这个函数,实际上创建字体可能还会是一些其他的函数,不过一般名字会带FONT
  • 之前研究SOFTPAL ADV SYSTEM这个引擎,发现改了字体编码之后,显示的字体依旧是乱码,查了一下资料,发现游戏字体显示实际上可能还会进行字符边界检测
    • GB2312和SHIFT-JIS编码中除了ASCII部分,都是两个字节组成一个符号的
    • 日语SHIFT-JIS的编码范围是(前一个字节0x80~0xA0)以及(后一个字节0xE0~0xFC)
    • 在打印字体的时候,有些程序会校验编码范围,过滤掉不在此范围的非法字符,而我使用的文本编码是GB2312,编码范围和日语不同,因此就算修改了编码,如果部分字符被过滤,显示出来的字符依旧会是乱码。
    • GB2312的编码范围是0xA0A0-0xFEFE
  • 因此,在修改完createFontxxx函数的编码参数之后,如果依旧乱码,则还要检查一下是否有进行字符边界检测。
    • 目前大部分游戏的字体输出都是调用GetGlyphOutlineA这个函数,一般都会在调用这个函数之前进行字符边界校验。
    • 因此需要在GetGlyphOutlineA的上面,或者是调用GetGlyphOutlineA的函数(可能不止嵌套一个)的代码上面,寻找边界检测的特征代码
    • 边界检测的代码的特征也很好认,留意一串连续的jb,ja等跳转判断(一般跳转的地址是一样的),cmp的参数有0xA0,0xE0,0xFC(或者相差+/-1的数值)
  • 下面以一个我调试的游戏为例

下面以Hearts的恋するココロと魔法のコトバ为例子

  1. 修改编码的操作忽略~~,该游戏是在pal.dll里面进行编码修改的
  2. 找到边界检测代码
  3. 分析边界检测代码
标识符 说明
JA 较大则跳转
JB 较小则跳转
JBE 较小或相等则跳转

对上述的代码使用x32dbg自带的反编译分析,得到下面的代码(实际的代码要更长,这里截取部分代码,感觉这种形式应该更加方便理解代码)。
这里的al41是当前读取到的字符(1字节),esi50->f1是下一位字符(1字节)


if (!(int1_t)(al41 == 60)) {
// 这里的60对应的ascii码是<符号,由于调试的游戏文本中存在<br>等标记符,所以猜测else是用来处理这些特殊文本的if (((uint8_t)al41 >= 0x81 && (uint8_t)al41 <= 0x9f || (uint8_t)al41 >= 0xe0 && (uint8_t)al41 <= 0xfc) //上面的条件就是用来判断第一个字节编码范围//但是这里的判断不仅是判断一个日文的前一个字节,也判断了后面一个字节这一种情况//并且判断第一位字节的时候范围偏差了1,正常来说应该是0x81~0xA0,暂时不知道是为什么&&(esi50->f1 >= 64 && esi50->f1 <= 0xfc) || (int1_t)(al41 == 37) && (esi50->f1 >= 48 && esi50->f1 <= 57)) //这里的判断条件,前半部分应该是用来判断第二个字节的范围//后半部分的判断条件有点迷,为:第一个字节为ASCII的%并且第二个字节为0~9的数字//用或连接,说明两种情况都有效{do something #1} else {do something #2}do something
}
else{do something #3
}

由上面的代码可以看出,正常显示的符号应该是#1代码块里面执行,因此修改的时候需要保证GB2312编码的字符可以进入到#1代码块执行(只看上面的代码其实无法得出这个结论,因为在第一个判断条件的else里面的代码其实有着其他逻辑,但是这里先不管,直接修改编码范围了再说)。
需要修改的地方有三处,如下图所示(红色的16进制码即为修改的地方,这里修改的不一定是对的,由于暂时没搞懂原先代码里面的判断条件,但是至少程序运行起来没什么问题)


  • 初步跑了一下程序,使用gb2312编码的文本显示并没有什么问题。
  • 上述的修改不一定是正确的,这里只是提供一下思路~~
  • 注意SOFTPAL ADV SYSTEM这个引擎,字体显示相关的函数导入了一个叫pal.dll的库,createfont这个函数的编码参数0x80就是在这个dll里面传的。
  • 在网上有看到这个dll的相关解析,具体可以看Nomeluka的GalPatches项目。
  • x32dbg个ollydbg比起来,界面好看了挺多的,也很简洁,不过缺点还是有的,插件貌似是比ollydbg要少(个人觉得)。
  • SOFTPAL ADV SYSTEM这个引擎的资料好少(一定是我的搜索姿势错了 )

调试的小技巧

  • 如果你调试到了系统的dll(像是gdi32.dll之类的)里面的函数,就直接跳出来吧,我们进行修改一般都是游戏的程序本体或者是它自己定义的dll。
  • x32dbg有一个可以看dll和游戏程序里面定义的函数的地方,可以节省我们下断点的时间。
  • x32dbg在汇编代码的区域里面右键-反编译,可以得到转化之后的c++代码

GalGame汉化教程(二)——修改编码的扩展(编码范围校验修改)相关推荐

  1. Ubuntu 2022最新版详细图文汉化教程

    名人说:君子生非异也,善假于物也.--荀子 Code_流苏(CSDN) o(‐^▽^‐)o很高兴你打开了这篇博客,跟着步骤一步步尝试修改/汉化吧.✧ Ubuntu安装教程请点这里 目录 一.修改/汉化 ...

  2. [转自安智论坛]Android软件汉化教程(强制汉化/Apktool汉化/精简/去广告)

    前言: 现在随处都可以找到功能强大的汉化工具,操作简单,上手快,汉化不再是件麻烦事. 想学汉化的朋友只要你用心,你也可以自己汉出优秀的作品,因为汉化根本没啥技术含量,要的只是持之以恒. 不要再羡慕别人 ...

  3. MyEclipse 汉化教程(含资源)

    MyEclipse 汉化插件.汉化图文教程 一. 汉化教程 · 图文解说 点击查看文章:百度经验 官网首页的顶部导航栏中找到,"项目(翻译:Projects)",并点击进入, 然后 ...

  4. Atom使用教程:Atom下载,Atom汉化教程,Atom常用插件

    Atom 是 Github 专门为程序员推出的一个跨平台文本编辑器.具有简洁和直观的图形用户界面,并有很多有趣的特点:支持CSS,HTML,Java等网页编程语言.它支持宏,自动完成分屏功能,集成了文 ...

  5. ENVI 5.3汉化教程(适用于5.3以上版本)

    ENVI 5.3汉化教程(适用于5.3以上版本) 提示:此教程用的是官方的方法,非第三方的插件 此办法仅适用于ENVI5.3以上的版本 前言 ENVI--完整的遥感图像处理平台ENVI(The Env ...

  6. 转载ubuntu下codeblocks安装及汉化教程

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/aniuge008/article/de ...

  7. 第七章 : Git 介绍 (上)[Learn Android Studio 汉化教程]

    Learn Android Studio 汉化教程 [翻译]Git介绍 Git版本控制系统(VCS)快速成为Android应用程序开发以及常规的软件编程领域内的事实标准.有别于需要中心服务器支持的早期 ...

  8. Windows11焕新登场,使用VMware虚拟机安装Windows11以及汉化教程

    # 安装前准备 1.需要安装VMware虚拟机软件,不会安装的可以查看博主的另一篇文章. 2.下载Windows11镜像文件,百度网盘,提取码:v8au 一.虚拟机配置 1.打开VMware,新建虚拟 ...

  9. 【ZT】【BPI-M64试用体验】〇〇五之:烧录Ubuntu16.04到-eMMC-中(包含系统汉化教程

    http://bbs.elecfans.com/jishu_1126387_1_1.html [经验] [BPI-M64试用体验]〇〇五之:烧录Ubuntu16.04到-eMMC-中(包含系统汉化教程 ...

最新文章

  1. 黄聪:IE6下用控制图片最大显示尺寸
  2. 计算机c语言循环作业,计算机C语言循环语句的应用研究
  3. python常用_Python常用小技巧
  4. 两个sql交集_如何使用性能分析工具定位SQL执行慢的原因?
  5. 【Spark】reduceByKey和GroupByKey
  6. 菜鸟学Linux - 用户与用户组基础
  7. html5期末考试题答案,HTML5期末考试题型
  8. matlab仿真之大尺度衰落因子的产生
  9. 超图openlayers
  10. 注意力机制Attention Mechanism的数学原理
  11. 思科vrrp实例_VRRP配置及多备份VRRP配置实例
  12. 车牌识别对于智慧城市的重要性
  13. 自主开发新媒体,湖南卫视封杀网络转播权
  14. 看steam教育之风带来创新与变革
  15. 图解GitHub和SourceTree 入门教程 使用教程
  16. 【报错】python编码问题:UnicodeDecodeError:‘utf-8‘codec can‘t decode byte 0xce in position 52: invalid contin
  17. team网卡配置_在CentOS7中配置网路成组(Network Team)
  18. 火车头过滤 css样式_HTML5和CSS3过滤器中的网络摄像头视频捕获
  19. MAC系统免驱显卡汇总
  20. 统计qq一天中每秒在线人数

热门文章

  1. 你们推荐的项目 yyds
  2. python做公司网站_网站的建设_ 网站建设那个好_ _我要做个网站_Python语言,绘制彩虹场景...
  3. 江苏科技大学 数据结构课设
  4. html 图片 滤镜,如何使用CSS实现图像滤镜效果?
  5. TicTacToe: 基于时序差分TD(0)算法的agent实现以及完整python实现框架
  6. 波斯公主选驸马python代码及可视化
  7. No converter for [XXX] with preset Content-Type ‘application/octet-stream;‘ 的解决办法
  8. 一文详解自动驾驶的运行设计域(ODD)| 自动驾驶系列
  9. 群晖Nas通过jellyfin搭建本地影音库详细全过程(二):jellyfin影音库信息手动刮削和相关设置(100%扫库成功)
  10. 批量查验发票真伪的智能化解决方案