客户端虽然经过汉化,但是道具有效期中时间的顺序依然按照国际服的 月 - 日 - 年 的顺序,这篇教程叫你如何在客户端中查找并修复

首先我们要在 StringPool 中查找到这段文字(如果你是直接汉化的 MapleStory.exe 那就用 STREDIT.exe(绿钻石)编辑 exe 查找,如果你是用的北斗客户端或者使用插件来汉化的 StringPool 的,那就在你的插件里查找)。
我们这里以北斗为例,我们在北斗的插件源码里查找这段文字,因为前面的数字全都是变量,我们并不能百分百确定它会以什么形式出现在 StringPool 中,但是后面的文字是肯定的,所以我们直接搜 "分前可用"
运气好只有一个结果

从这个搜索结果得知,这段 StringPool 的 ID 为 3138
接下来打开 ida,用“立即值”查找 3138
搜索结果也只有一个,直接跳转过来看伪代码

有一个很熟悉的方法 format 被调用了, format 顾名思义就是格式化的意思。
结合前面的内容很容易就可以联想到这一段应该是实现了类似 c++里面的(伪代码)
代码登录后可见
其中 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进制方便查看

还是老规矩,顺序越靠前,汇编指令越靠后
所以我们的目标就是要把
代码登录后可见
调整为
代码登录后可见
即可,具体的例子可以查看北斗插件源码。
这里面一定要注意一个点,如果你遇到的实际情况是操作的 esp 的话,你要注意 esp 有个特性:每次 push 操作执行完,esp 的位置会 -4。所以不能只是单纯的用codecave交换指令位置,还要重新计算push后esp的偏移量。
有什么不懂的欢迎跟帖提问。