Posted on

外挂制作基本知识


什么是基址?

我们可以想象一棵苹果树,树有根,树上也有苹果,

某个苹果对应某个偏移,而树根就是基址,通过基址往上找就能找到某个苹果

而找到的这个苹果,相对于有个偏移。通过基址 + 偏移就能确定是哪个苹果。

例如:基址 = 00401000 偏移是 20,代表 1 号苹果,那 OD 里:dd [00401000]+20 就能找到这个 1 号苹果。

dd 命令 是以内存地址的方式查看数据。

为什么要找基址?

因为游戏退出基址不会变化,只有游戏更新后才会变化

而要是用找到的内存地址,例如:血的内存地址,游戏退出是会变化的,不方便我们编写辅助调用。

用什么工具适合找基址和偏移?

Ollydbg(简称 OD)
Cheat Engine(简称 CE)

强烈推荐这两款游戏数据分析高手都必备的工具。

偏移最多有多少级?

最少偏移就是一个基址代表一个数据,例如:dd 00401000 就是血数量
最多偏移可以是无穷大,分析过最多的是 20 多偏移。

例如:dd [00401000]+20 20 就是一级偏移
而类推:
dd [[00401000]+20]+30 30 就是二级偏移

什么是 CALL?

CALL 就是相当于易语言里的子程序,相当于 C++ 里面的函数。

每个 CALL 都有用途,很多独立的功能都可以封装在 CALL 里,这样调用这个 CALL 也就调用了对应封装的功能。

CALL 有 “参数”,也有 “返回值”

“参数” 可以是没有,也可以是多个。

“返回值” 一般通过 EAX 寄存器返回。

如何识别 CALL 有多少个参数?

实战举例说明:

这个 CALL:

进入 CALL 里面,OD 里是用 enter 回车键进入:

再举例 说明有参数的识别:

如何调试 CALL 可能对应的功能?

当你在找某个 CALL 数据的时候,例如:吃药 CALL,

吃药 CALL 相关的 CALL 你可以通过 :

  1. 无参数 CALL,可以直接 OD 里,右键 – 二进制 – 用 NOP 填充 该 CALL,填充后,回游戏看是否能吃药,能的话,说明与吃药 CALL 不想干。
  2. 有参数 CALL,可以直接修改 CALL,OD 里按空格键修改反汇编,修改为 add esp,4 4 代表 1 个参数,如果是三个参数的话,就修改为:add esp,0c 这样使堆栈平衡了,游戏才不会出错,然后也是回游戏看是否能吃药,能的话,说明也是与吃药 CALL 不想干的 CALL。

知道了有参数 CALL 的参数数据,如何调试 CALL 效果?

可以通过 “代码注入器” 这个工具来调试 CALL 效果.

举例 有参数 CALL:

// 上 CALL 有 2 个参数,通过 PUSH 看出来的,这 2 个参数的值假设分别是

那我们在代码注入器如何来写汇编的呢?

具体是:

然后按下 注入远程代码 就能看效果了。

无参数 CALL 直接写 call 00401000 即可。

能达到 CALL 效果,但游戏出错怎么办?

用代码注入器测试能达到 CALL 效果,但游戏出错了,这如何解决?

这通常是由于有参数的 CALL,有个堆栈不平衡导致的,

那如何恢复堆栈平衡呢?

举例 有参数 CALL:

这个 CALL 有 2 个参数,代码注入器能达到效果,但会出错,

这时候要加上堆栈平衡汇编语句

具体是:

1 个参数是 4 字节,2 个参数是 8 字节,所以是 add esp,8

这样就不会达到 CALL 效果同时游戏出错了。

游戏数据分析 “汇编” 很重要吗?

汇编看得懂就行,例如:mov eax,ebx 是什么意思?
mov eax,[00401000] 是什么意思?

你能看懂就 OK 了。

什么是内存挂,什么是变态挂,什么是脱机挂?

  1. 内存挂就是获取游戏里面的 CALL 数据,主要以调用游戏数据为主。
  2. 变态挂就是修改游戏里面的数据,例如:像单机游戏一样修改数据,或者修改汇编,达到游戏本没的功能。主要以修改游戏数据以及汇编为主。
  3. 脱机挂就是向服务器发送封包数据,可以不用开客户端也能挂机。主要以封包数据为主。

发送封包的函数都有哪些?OD 如何下断?

这四个是常用的发送封包函数,OD 里获取 CALL 数据的时候相当有用。

OD 下断点就是:

不同的游戏可能用了不同的发送封包函数,在实际的实践当中,可以灵活运用。

列出 2 个最常用函数原型:

以上了解了解就 ok。

什么是 OD 死码,如何设立?为什么要设立?

什么是 OD 死码?

OD 死码指的就是 OD 反汇编中游戏更新后也不变的汇编。

如何设立?

规则:最多 8 条汇编,因为 OD 里 ctrl+s 搜的时候最多只能 8 条

哪些汇编不能用于 OD 死码:call 内存地址
jz/jnz/je(等跳转语句) 内存地址
mov eax,[ecx+0abc] 偏移 abc 比较大的不可以。

mov eax,[esp+30] 汇编里有 ESP 堆栈寄存器的不可以,后面跟的偏移 + 30 会变化

为什么要设立?

因为游戏更新基址,较大的偏移会变化,为了方便,所以设立 OD 死码,
方便快速获取游戏更新后的相关数据。

One thought on “外挂制作基本知识

  1. 好文,学习学习外挂

发表评论

电子邮件地址不会被公开。 必填项已用*标注