找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 137|回复: 0

[教程] 实战示例3:GMS083 修复客户端日期顺序错误

[复制链接]

33

主题

12

回帖

100

积分

管理员

积分
100
发表于 2025-2-18 01:49:22 | 显示全部楼层 |阅读模式
客户端虽然经过汉化,但是道具有效期中时间的顺序依然按照国际服的 月 - 日 - 年 的顺序,这篇教程叫你如何在客户端中查找并修复



首先我们要在 StringPool 中查找到这段文字(如果你是直接汉化的 MapleStory.exe 那就用 STREDIT.exe(绿钻石)编辑 exe 查找,如果你是用的北斗客户端或者使用插件来汉化的 StringPool 的,那就在你的插件里查找)。

我们这里以北斗为例,我们在北斗的插件源码里查找这段文字,因为前面的数字全都是变量,我们并不能百分百确定它会以什么形式出现在 StringPool 中,但是后面的文字是肯定的,所以我们直接搜 "分前可用"

运气好只有一个结果


从这个搜索结果得知,这段 StringPool 的 ID 为 3138

接下来打开 ida,用“立即值”查找 3138

搜索结果也只有一个,直接跳转过来看伪代码


有一个很熟悉的方法 format 被调用了, format 顾名思义就是格式化的意思。

结合前面的内容很容易就可以联想到这一段应该是实现了类似 c++里面的(伪代码)
  1. printfs("%04d年%02d月%02d日%02d时%02d分前可用", month, day, year ,hour, min)
复制代码


其中 v15 就是第一个参数,第一个和第三个参数,其中一个就代表实际的时间。

我们把光标点击到 Format 上,然后回到反汇编页


可以看到绿色底色就是和 Format 相关的全部指令,(这里面少标记了push eax 这一行)

按照越往后的参数在反汇编里越靠前的原则
push esi 就是 v7
push eax 就是 v15
上面 5个 push 就是 后面的 SBYTE2(v20)
这里面 v7 和 v15 都是靠光标落在指令上然后转去伪代码页查看光标落点的方法确认的

如此一来就很好推测了,5个 push 刚好对应了 5个 时间  月、日、年、时、分

那我们要调整他们的顺序,只需要把 5个 movzx/push组合的实现顺序调整一下就可以了

我们右键绿色的var_12等,把他们转成16进制方便查看


还是老规矩,顺序越靠前,汇编指令越靠后
所以我们的目标就是要把
  1. movzx   ecx, word ptr [ebp-1Ch]
  2. push    ecx
  3. movzx   ecx, word ptr [ebp-16h]
  4. push    ecx
  5. movzx   ecx, word ptr [ebp-1Ah]
复制代码


调整为
  1. movzx   ecx, word ptr [ebp-16h]
  2. push    ecx
  3. movzx   ecx, word ptr [ebp-1Ah]
  4. push    ecx
  5. movzx   ecx, word ptr [ebp-1Ch]
复制代码

即可,具体的例子可以查看北斗插件源码。

这里面一定要注意一个点,如果你遇到的实际情况是操作的 esp 的话,你要注意 esp 有个特性:每次 push 操作执行完,esp 的位置会 -4。所以不能只是单纯的用codecave交换指令位置,还要重新计算push后esp的偏移量。

有什么不懂的欢迎跟帖提问。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我尽可能地不设置回复可见,希望让跟帖更有质量,有问题欢迎跟帖提问。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|蘑菇物语

GMT+8, 2025-4-20 07:27 , Processed in 0.049648 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表