游戏外挂编程---编写外挂的特点和CE(1-8)教程

 

游戏外挂编程
1。工具
VB
SPY LIST 窗口句柄捕捉工具
Cheat Engine 内存地址修改工具
2。了解外挂的特点
本人想制作的外挂
(1)在程序中呼叫程序。
(2)有个主窗口
(3)能修改游戏中的数值。
了解VB的使用
了解SPY++的使用
先了解CE的使用
步骤 2: 精确数值扫描 (密码=090453)
现在你已经在CE中打开了TUT[Tutorial],让我们进入到下一步吧.

你看到在这个窗口的下方的血值:XXX ,每次你点击"打我"时,你的血会减少.

要进到下一个步骤,你必须找到这个数值并把它改为1000.

要找到这个数值,有几个不同的方法,但我会告诉你一个最简单的:精确数值扫描,

首先确认数值类型设置为2字节或4字节,1字节也可以的,但最后在修改它时会有点麻

烦(但很容易解决)

(提示:1字节表示的最大数值是255,这里要你改为1000,但用1字节找到后要连前一字

节一起改,所以有
点麻烦)。

如果这个地址后面是0的话,8字节可能也可以,不过我不保证。单浮点数,双浮点数,

以及其他的扫描方
式不行,

因为它们储存数值的方式不同。

当数值类型设置正确后,确认扫描方式设置在"精确数值",把血的数值填在数值输入

框上,并点击"首次
扫描"

过一会儿(电脑非常慢的话)如果找到的地址的数量少于设置的数值,在扫描完成后扫描

的结果会显示在左
边.

如果你找到不止一个地址而你不知道哪一个是正确的地址,点击TUT上的"打我",并把

新的血的数值填到

数值输入框,并点"再次扫描",重复这些步骤直到你确认你已经找到它的地址了(在地

址列表上只有一个
地址)

现在双击左边列表上的地址,这样会让这个地址移动到下方的列表上并显示它的当前

数值.

双击(下方列表的)数值栏(或者选择它,并按回车),并把它修改为1000.

如果一切都OK,下一步按钮将会变成可点击的了,你就准备好了进入下一步了.


提示:
如果你在扫描过程中做错了,可以点击"新扫描"重新再来.当然,你也可以点 '打我'去

找一些更有价值的
东西.

精确扫描: 四字节


//////////////////////////////////////////////////


步骤 3: 未知初始数值 (密码=419482)
OK,看来你已经理解了怎样使用精确数值扫描找到一个数值了,让我们进入下一步吧.

在上一步中我们知道初始数值所以我们进行了精确数值扫描,但现在我们有一个进度

条,我们不知道它
开始时的数值.我们只知道这个数值是在0到500之间,并且每次你点"打我"之后你会减

一些血,每次减的
血量会显示在进度条的上方。

同样的有好几个方式找这个数值,(例如使用“减少了什么数值”的扫描方式),但我

只解释最简单的方
式,“未知初始数值”和“减少了的数值”。

因为你不知道现在它的数值是多少,所以使用精确数值不行了,所以选择扫描方式为"

未知初始数值",
同样的,数值类型选择4字节,(大多数WINDOWS应用程序使用4字节数据).
点击"首次扫描"并等它扫描完成.

当扫描完成后点击"打我",你会掉一些血. (掉的血量多少会在血条上方显示几秒然后

消失
但你不需要这个数值)
现在回到CE,并选择"减少了的数值",并点击"再次扫描"
当扫描完成后,再次点击"打我",并重复上面的步骤,直到你找到了若干地址.

我们知道这个数值是在0到500之间,所以选择比较象我们要的那个地址是,并把它加

到下边的列表.
现在,把它改为5000,才能进到下一步.

点击新扫描。
扫描类型:未知初始化数值
数值类型:4字节
点击 首次扫描
点击 减少数字
////////////////////////////////////////////////
骤 4: 浮点数 (密码=890124)
在前面的教程中,我们使用字节来扫描,但有些游戏使用了"浮点数"的记数方法.

(可能是为了防止简单的内存扫描),浮点数是带有小数点的一些数字(如5.12或

11321.1)。

如下边你看到你的血和子弹。两者都以浮点数储存,但血是单精度浮点数而子弹是为

双精度浮点数
.
点击[打我]可以减少一些血,而点击[射击]可以用掉0.5的子弹

你得把这两者都修改到5000或者更多才能进下一步.

"精确数值扫描"方式在这一步能工作得很好,但也许你想试试其他的扫描方式.

提示: 不推荐"快速扫描" 双精度类型

点击新扫描。
扫描类型:两个数值之间

数值类型:浮点数值
点击 首次扫描
第二次。。。
扫描类型:两个数值之间

数值类型:双浮点数值
点击 首次扫描
///////////////////////////////////////////////////////////////
步骤 5: 代码寻找 (密码=888899)
有时一些东西的保存位置在你重新开始游戏时会改变,甚至是在你玩的时候也会变,

在这种情况下,你
用2步仍然能做出可以用的内存列表.

在这一步会说明怎样用寻找代码功能

下面的数值每次你开始这个TUT的时候会存放在不同的位置,所以一个普通的内存地址

列表将会不管用.

首先找到这个数值的内存地址.当你找到地址后,右击CE中的这个地址,并选择"查找写

入该地址的代码",
一个窗口将会出现,上面会有一个空的列表.

然后,点击这个TUT上的"改变数值"按钮,回到CE,如果一切都做得对,会看到一个地址和

一些汇编代码.
点击这个地址并选择"替换"选项把它替换成什么也不做的代码,这样还会将代码地址

加到高级选项窗口
上的代码列表(如果你保存地址表它将会一起保存)。)

点击"停止",这样游戏(TUT)将会再次正常地运行下去,并点"关闭"关掉这个窗口.

现在,点击TUT上的"改变数值"按钮,如果一切都做对,"下一步"按钮将会变成可点击

的了.

提示:如果你以足够快的速度锁定这个地址,"下一步"按钮也会变成可点击的.

点击新扫描。
扫描类型:精确

数值类型:4字节
点击 首次扫描
扫描到地址。
右键---查找写入该地址的代码
选择地址,把CE帮定在地址上面

点击帮助窗口中的改变数值
找出汇编栏中的汇编代码
替换为NOP
///////////////////////////////
步骤 6: 指针: (密码=098712)
上一步解释了怎样用代码寻找功能对付变化位置.但单独用不容易找到地址并修改成你

要的数值.
这就是为什么要用到指针了.

在TUT下面有两个按钮,一个会改变数值,另一个不但会改变数值并且还会改变数值在

内存中的位置.

在这一步,你不需要真的懂汇编,但如果你懂的话会很有帮助.

首先找到数值的地址,当你找到后,再找找是什么在改写这个地址。再次改变这个数

值,这样会找到一
个代码地址,双击这个代码地址(或者选择它并点击更多信息),这样一个新的窗口会

打开并显示详细的
信息告诉你当这个指令运行时会发生什么事(提示:这个新出来的窗口上,那条指令会

是红色的)。
如果这个汇编指令里面没有包括一个在方括号中的东西,(提示:说明这个不是我们要

的)
那么再看看代码地址列表中另一个代码地址。如果有方括号,就是说CE认为找到了数

值的指针了.

回到CE主窗口,(你可以让那个扩展信息窗口开着,但如果你关了,要记住在方括号中

间的内容)

(提示:要关了那个有代码地址列表的窗口,才能回到CE主窗口,但扩展信息窗口可以

不用关掉)

并做一次4字节的扫描,扫描扩展信息窗口告诉你的十六进制数。(提示:就是方括号

里面的内容,
如果方括号里面是[eax],那么看看扩展信息窗口下面EAX=后面的数值)。

当扫描完成时它可能返回一个或几百个地址。大多数情况下你要的会是最小(提示:指

地址最小,
也就是排在列表的最上面)那一个。

现在点击手工添加内存地址并在"指针"这个选项上打勾.

这个窗口将会改变,并允许你填入指针的地址和偏移量.在地址那里填入你刚才扫描到

的地址.

如果汇编指令在后面有一个计算(例如:[esi+12])那么把数值填在后面,否则让它保

持0

(提示:就是如果有类似那样的计算,把12这个数值填在偏移量那里,否则那里填0),
如果是更复杂的指令,看看它的算式.举例说明更复杂的算式:

[EAX*2+EDX+00000310] eax=4C 并且 edx=00801234.

(提示:这时各个寄存器的值在扩展信息窗口下方,那里有各个寄存器在执行这条指令时

的值).

在这个情况下EDX会是数值的指针,而EAX*2+00000310则是它的偏移量,所以你要填的

偏移量会是
2*4C+00000310=3A8.(这些都是在十六进制下计算的,使用WINDOWS的计算器在科学方

式下用十六进制计
算).

点击新扫描。
扫描类型:精确

数值类型:4字节
点击 首次扫描
扫描到地址。
右键---查找写入该地址的代码
选择地址,把CE帮定在地址上面

点击帮助窗口中的改变数值
找出汇编栏中的汇编代码
双击汇编代码----查找扩张汇编地址
01f3da48(注意:这个数值是在EAX中 指令中[]内
扫描这个16进制地址 4次
找到最小地址0045DC34
手动添加内存地址 并勾上指针项
建立一个指针
改变指针所指的内容5000 注意要“缩定”

然后就可以了

并做一次4字节的扫描,扫描扩展信息窗口告诉你的十六进制数
//////////////////////////////////////////////////////////////////
步骤 7: 代码注入: (密码=013370)
代码注入是一个将一小段代码注入到目标进程中的技巧,然后使这个进程执行你写入的自己的代码

在这一步教程中,你将有一个血值和一个"打我"按钮,这个按钮每按一次将减少1点血值。
你的任务是使用代码注入来增加这个生命值,使得每按一次按钮增加2点血值

开始查找这个地址然后进入"查找写入此地址的代码".
然后减小生命值,当你已经找到地址后,点击"显示反汇编程序", 并找到这个地址,然后打开
自动汇编窗口(菜单-工具->自动汇编)(Ctrl+a),在"模板"上点击然后再点击"代码注入",
并给出减少生命值的地址(如果程序没有正确填写的话)
那样,将产生一个基本的自动汇编程序窗口你可以用于你的代码.

注意alloc, 那将用于为你的代码分配内存, 而在Win2000系统之前, 这种行为存在安全隐患,是不安
全的(提示:在Win2000以前,对系统内存进行分配及代码查找之类的操作,可能会导致系统崩溃),幸运的是
这种情况在win2000以后的版本得到改善
同样,也要注意line newmem语句及原始代码,以及文本"此处放置你的代码",正如你猜测的那样,在这
儿写下你每次增加2点生命值的代码.
在这种情况下,一个有用的汇编指令是"ADD".
下面是一些示例:
"ADD [00901234],9" 使[00901234]地址的值增加9
"ADD [ESP+4],9"   使地址指针[ESP+4]的值增加9
在这种情况下,你必须使用同样的东西在括号里表示减少血值的原始代码

注意:
推荐你从原始生成代码中删除减少你血值的那行代码, 否则你将不得不增加3点生命值(你增加3点,而
原始代码减少1点,那样最终结果是增加2点),这样可能会造成混乱.

注意2:
在一些游戏中,原始代码可能存在在多指令之外,并且某些时候(并非一直如此),这可能会发生在其他地方
跳转到你的跳转指令结束,那样将引起未知的行为.如果这种情况发生的话,你通常应该查看附近的指令,
查看跳转情况并进行修改,或者选择使用一个不同的代码注入开始地址.
最后,点击 "写入代码"


第八步: 多级指针 (密码=525927)
7PWeaT >< Step 8: Multilevel pointers: (PW=525927)
$R 'ye$*fC ................................
Xo ^ 3* 这个窗口的下方的数值2025 还有Change value和Change pointer两个按钮。
,- ]n$8cSy
0 gbCn2cg} 开始指针扫描,选择CE输入扫描数值,如有看到New Scan先点击它后才输入数值。
&r%F_J(u0
7]E$GB18o Value :2025
QL 3T CV Scan type :Exact Value
HCF d- Value type:4 Bytes
z7Oq"D Cd
6sa -=/Z r 点击First Scan →Found:1 →选择TUT并点击Change value →双击列表上找到的地址将它加入
7Ok D^EQ L 下方的列表并右击地址,即Address下面(不是数值哦)。在右键菜单选择
Cm I r[A7~ “Find out what writes to this address”,这会弹出“The following opcodes ch...."
v?pGi2?"iJ 一个空的列表窗口。选择TUT点击ChangeValue这就会将改变的地址加入空列表中并选择它后点击
}* a%k ~s9 Show Disassembler按钮,这会弹出“Memory Viewer”窗口。在窗口列表选择最上面的地址并记住它,
HpT @ W= 然后点击列表右边滚动条上面的箭头,将地址滚向下面要记住刚才的地址哦,
o%%v}o aZ:
_yluj }VT3 列如:
L E4 |8W 5. :00456153 - a1 18 c.. - mov eax,[0045cc18] 这记下0045cc18
7[SjXWu Uc 4. :00456158 - 8b 40 0c - mov eax,[eax+0c]
&WQ{ l # 3. :0045615B - 8b 40 14 - mov eax,[eax+14]
} u[Ey/1th 2. :0045615E - 89 00 - mov eax,[eax]
?R V6**5 1. 是最上面的地址 :00456160 - 89 70 18 - mov [eax+18],esi 向下滚动后到这里,
d#r4 ]O c 现在要写下这以上的4个地址的数值,这要从下向上数。我将倒数的地如下:
%jN)R2} 8E 1. :00456160 - 89 70 18 - mov [eax+18],esi 这记下 18
"qF m(Ro 2. :0045615E - 89 00 - mov eax,[eax] 没有+号这记下 0
C T? bw 5 3. :0045615B - 8b 40 14 - mov eax,[eax+14] 这记下 14
:v9 luqyd 4. :00456158 - 8b 40 0c - mov eax,[eax+0c] 不要0这记下 c
Mg`WU@{PB
l 40 iikt 记下了就选择CE然后点击“Add address manually”,这会弹出Add address对话板,
Sijyy ?iJ< 将Pointer旁边的小方格打勾,点击3次Add pointer按钮,这样就有4个Address of pointer,
q} [] : 然后将数值填入
{rqpUAh_q Address of pointer:不填 Offset (Hex):18
+l 6 WQa Address of pointer:不填 Offset (Hex):0
> DfoR_CB Address of pointer:不填 Offset (Hex):14
@FtG s 4(5 Address of pointer: 0045cc18 Offset (Hex):c
^ o h8 O
EKH! _ ! 然后点击OK键。现在双击CE下方列表地址前面带有P->00D722E8地址的数值(Value),这会弹出
mDCKC Z= Value对话板,将数值修改为5000,先不要点OK键并将Value对话板移到TUT的Change pointer
0 JF 4 L 按钮的下方,既是当我选择了TUT的时候也能看得见Value对话板的OK键,这样我就可以在点了
T( oQVw u TUT的Change pointer按钮后能快速的点击得到Value对话板的OK键(3秒钟内)。
[ y{ fO z 我哈哈!!点到了。

你可能感兴趣的:(游戏,编程,汇编,扩展,hex,Pointers)