这篇文章是以北斗插件为基础去写的,如果你用的是 MapleEzorsia-v2 的话那大体上是一样的,北斗可能会有一些扩充;但是如果你用的其他版本的话,那不一定会适用,请自行判断。
前面写《如何汉化客户端内存里的字符串》时已经有提到如何用插件修改内存了,这里详细介绍一下北斗插件里几个修改内存的方法。
如果你是个小白,那么打开插件的 Client.cpp 文件,找到方法
- void Client::MoreHook() {
修改数值
常用的修改数值的命令有
- Memory::WriteByte(内存地址, 修改值);
- Memory::WriteShort(内存地址, 修改值);
- Memory::WriteInt(内存地址, 修改值);
- Memory::WriteDouble(内存地址, 修改值);
这里面要注意的是 byte、short、int、double 分别对应 1、2、4、8个字节,你必须选择对应的方法去修改,而不是乱改,否则会修改到不该改的地方。
比如有这么一段字节码(此处均为十六进制,省略0x)
B9 01
B9 10 27 00 00
假如这段字节码表示的汇编指令是
mov ecx, 1
mov ecx, 2710h
你要把第一行的 1 改为其他值,那你应该使用 WriteByte,如果你使用了 WriteInt 的话,就会把(包括第二行的) 01 B9 10 27 同时修改掉了,那么整个汇编指令就错乱了。
同样的,如果你要把第二行的 0x2710 修改为其他,那你应该使用 WriteInt,如果你只使用 WriteByte 对 10 处进行修改的话就会变成
B9 XX 27 00 00
但是这里是 XX 27 00 00 一起读取的,那么就会出现修改后的值不是你的预期值的问题。
然后是内存地址的问题,IDA 处最左边显示的内存是第一个字节的地址,也就是说你要修改第一行的 1 的话,应该用 IDA 的内存地址 +1
修改字符串
然后我们北斗封装了两个方法用于修改字符串,具体的请看《如何汉化客户端内存里的字符串》
- Memory::ReplaceString(内存地址, "替换文本", "原文本");
因为程序读取字符串的字节码时,会以0字节作为终止符,如果读不到0字节就会认为这个字符串还没结束,会继续读。
所以用原始的老方法 WriteString 去修改字符串就会遇到一个问题:比如你要把 "To Alliance" 改成 "对联盟",就会变成 "对联盟iance",你必须要改成 "对联盟 " 后面加5个空格才行。
用ReplaceString就不会有这个问题了。
批量修改字节
方法一 填充相同的字节
- Memory::FillBytes(内存地址, 修改值, 填充数量);
相当于删掉一部分指令,而不是替换成其他内容。
方法二 填充指定字节
- unsigned char byteArray[] = { 0x01, 0x02, 0x03};
- Memory::WriteByteArray(内存地址, byteArray, sizeof(byteArray));
CodeCave 用汇编指令直接写
如何汉化客户端内存里的字符串:https://moguwuyu.com/thread-14-1-1.html
"这些参数的真实类型和名称"这个在IDA怎么确定呢?
ida会根据上下文给出一个初步的类型判断,但是实际的还是得自己来判断。至于变量名都是a1 a2只能自己起
页:
[1]