-
-
[原创]逆向分析某网游对话框删除汉字异常的bug并修复
-
发表于:
2020-2-7 23:54
5499
-
[原创]逆向分析某网游对话框删除汉字异常的bug并修复
一、前言
二、准备工具
三、分析
四、修复
五、总结
看雪萌新,
正儿八经学习逆向不到半年时间,期间学习了不少关于逆向的理论基础知识作为铺垫,扎实自己的基础。在此要感谢看雪图书《加密与解密四》与《C++反汇编与逆向分析技术揭秘》补足了我基础知识的空白。作为闭关修炼后的第一次实战分析,虽然没有什么技术含量,但起码是自己的一次实践、尝试;也是对这几个月所掌握知识的检验。在看雪记录自己一次次的分析过程,也见证自己一步步的成长,话不多说,我们进入正题。 因为游戏是从国外某服直接汉化的 未修改代码,所以有了“对话框删除汉字异常”的bug,具体现象为对话框输入的汉字删除时,一个汉字需要两次摁删除键才能删除。具体现象如下:
本次的目的就是通过逆向分析找到问题所在并修复它。
分析环境:
win7 32位虚拟机
所用工具:OD、Cheat Engine、LordPE、WinHex
首先我们能想到的一条思路就是利用CE找到字符串的写入地址,设置内存访问断点,找到调用该地址的函数从而定位问题所在。进入游戏,CE中打开游戏进程,在对话框中随便输入字符串,CE搜索结果如下:
红框标注绿色的地址即为字符串实际存放的地址,用od附加的方式打开游戏主模块so3d.exe,F9继续运行,我们在od数据窗口中ctrl+g输入01172050,找到了存放该字符串的内存地址,ASCII显示为“hello”。
反复测试我们发现,对话框中字符串的写入地址总是为01172050,因此我们在游戏对话框中重新输入“看雪”, 回到od在01172050可以看到ascii显示为“看雪”:
既然我们找到了字符串写入的地址,不妨先看看写入过程中程序都进行了哪些操作。清空游戏对话框内容,在数据窗口01172050第一个字节处设置内存写入断点,游戏中输入字符后od中断到如下位置:
通过分析上下文,程序写入数据的流程为:堆栈取出要本次写入字符的ascii码值放入bl,将bl与0x26(ASCII为“&”)比较,若相等,则跳过本次写入,然后依次将esi+118和esi+114中存放的字符串数组中的索引值与esi+110中存放的数值(0x41)作比较,若大于或等于,则跳过本次写入,这意味着对话框中最多只能输入64个字符。符合写入条件后,将索引值赋给ecx,在0061775E处用数组下标寻址的方式将bl写入地址,其中esi+0x4为要写入字符串数组的首地址,ecx为索引值,写入后,将三处存放的数组索引值(esi+528、esi+118、esi+114)依次+1,再将写入地址的后一个字节清零后返回。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!