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

[教程] 用插件修改客户端的基础方法

[复制链接]

33

主题

12

回帖

100

积分

管理员

积分
100
发表于 2025-1-16 19:12:04 | 显示全部楼层 |阅读模式

这篇文章是以北斗插件为基础去写的,如果你用的是 MapleEzorsia-v2 的话那大体上是一样的,北斗可能会有一些扩充;但是如果你用的其他版本的话,那不一定会适用,请自行判断。

前面写《如何汉化客户端内存里的字符串》时已经有提到如何用插件修改内存了,这里详细介绍一下北斗插件里几个修改内存的方法。

如果你是个小白,那么打开插件的 Client.cpp 文件,找到方法
  1. void Client::MoreHook() {
复制代码
在这个方法内添加你的修改,如果你有一定的c++经验,那么你可以自行发挥。

修改数值
常用的修改数值的命令有
  1. Memory::WriteByte(内存地址, 修改值);
  2. Memory::WriteShort(内存地址, 修改值);
  3. Memory::WriteInt(内存地址, 修改值);
  4. Memory::WriteDouble(内存地址, 修改值);
复制代码
其中内存地址都是 0x 开头的十六进制地址,你只需要把 ida 中复制出来的内存前面加上 0x 即可。修改值的话可以是十进制也可以是0x开头的十六进制,保持风格统一,看得懂即可。

这里面要注意的是 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

修改字符串
然后我们北斗封装了两个方法用于修改字符串,具体的请看《如何汉化客户端内存里的字符串》
  1. Memory::ReplaceString(内存地址, "替换文本", "原文本");
复制代码
这个方法是在覆盖掉源文本后,自动计算源文本和替换文本的字节数量差,然后补足0字节来彻底覆盖掉源文本。
因为程序读取字符串的字节码时,会以0字节作为终止符,如果读不到0字节就会认为这个字符串还没结束,会继续读。
所以用原始的老方法 WriteString 去修改字符串就会遇到一个问题:比如你要把 "To Alliance" 改成 "对联盟",就会变成 "对联盟iance",你必须要改成 "对联盟     " 后面加5个空格才行。
用ReplaceString就不会有这个问题了。

批量修改字节
方法一 填充相同的字节
  1. Memory::FillBytes(内存地址, 修改值, 填充数量);
复制代码
这个方法一般用于批量填充 0x90,0x90表示当前内存里啥都没有,就是一个占位符而已。
相当于删掉一部分指令,而不是替换成其他内容。

方法二 填充指定字节
  1. unsigned char byteArray[] = { 0x01, 0x02, 0x03};
  2. Memory::WriteByteArray(内存地址, byteArray, sizeof(byteArray));
复制代码
这里面 byteArray 的内容要替换成自己的内容。

CodeCave 用汇编指令直接写


如何汉化客户端内存里的字符串:https://moguwuyu.com/thread-14-1-1.html

购买主题 已有 4 人购买  本主题需向作者支付 3 蘑菇币 才能浏览
我尽可能地不设置回复可见,希望让跟帖更有质量,有问题欢迎跟帖提问。

4

主题

11

回帖

8

积分

新手上路

积分
8
发表于 2025-1-16 20:40:42 | 显示全部楼层
坐等ling总

评分

参与人数 1金钱 +30 收起 理由
leevccc + 30 神马都是浮云

查看全部评分

4

主题

12

回帖

111

积分

注册会员

积分
111
发表于 2025-1-16 21:03:33 | 显示全部楼层
马克!

评分

参与人数 1金钱 +30 收起 理由
leevccc + 30 神马都是浮云

查看全部评分

0

主题

2

回帖

24

积分

新手上路

积分
24
发表于 2025-1-17 10:19:38 | 显示全部楼层
楼上都是大佬,膜拜!

评分

参与人数 1金钱 +30 收起 理由
leevccc + 30 神马都是浮云

查看全部评分

0

主题

3

回帖

15

积分

新手上路

积分
15
发表于 2025-2-2 23:18:50 | 显示全部楼层
师傅!!!!!!!

4

主题

11

回帖

8

积分

新手上路

积分
8
发表于 2025-3-7 18:09:57 | 显示全部楼层
"这些参数的真实类型和名称"这个在IDA怎么确定呢?

33

主题

12

回帖

100

积分

管理员

积分
100
 楼主| 发表于 2025-3-8 00:56:28 | 显示全部楼层
BurgerKing 发表于 2025-3-7 18:09
"这些参数的真实类型和名称"这个在IDA怎么确定呢?

ida会根据上下文给出一个初步的类型判断,但是实际的还是得自己来判断。至于变量名都是a1 a2只能自己起
我尽可能地不设置回复可见,希望让跟帖更有质量,有问题欢迎跟帖提问。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|蘑菇物语

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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