1、不少兄弟一直也很想写模拟挂,但是却不知道如何下手,这里我就带大家从 0 学起,该如何写模拟挂。这里我教程重点是偏向于后台运行的模拟挂。所以向找色这些用的比较少。其实我根本不会找色。我习惯读内存。其实按键精灵难的就是怎么读内存,会弄内存了,只要直接把内存地址复制到万能模板里就行了。最近开始转学 E 语言写内挂,所以就把万能模板公开了,全套教程看完,你就能最短时间内写个模拟挂了(你只要把几个参数自己找到代入就行。)。基本上简单游大多数脚本也只有这个水平。当然我的挂只有简单找怪打怪功能,没啥变态功能。因为我都是自己用,没有啥让人激动游戏,可以提起我兴趣去写。那些自动任务什么的。汗。你找别人吧。基本要
2、求:具有高中级别的 VB 水平,不需要多高,知道常量,变量,什么是十进制,十六进制,以及简单流程控制 if do while 是什么就行,还有懂得勾股定理(挂机范围时候用到)。别说你不懂。高中就有学。人教版高一数学,选修(二),这些东西我前一阵还在教,那些学生都能学额很轻松。再不行。自己去看书去。三个小时就能看完。看懂前言:说说本教程教学计划:基础篇:(一) 找内存基址(红和蓝)(二)模拟挂主框架和红蓝自动喝药(三)读取人物和怪游戏坐标 (内存式)(四)自动找怪,又分成两次教(1) 游戏前台时候找怪(2)游戏后台时候找怪(五)指定范围挂机进阶篇:(六) 破解验证码(不会汇编的不用学了)关于学习
3、建议:(只适合新手,老鸟别看)1、按键精灵图的就是省事,有现成的东西可以用,所以很多时候不需要你懂得很多原理,只要懂得在别人的插件基础上,加上自己参数,然后组合而成。所以我在讲解过程中,我认为没必要解释的原理就不说,只要你懂得怎么套公式就行。除非一些影响你使用的原理,我才讲解,讲的时候尽量通俗,拿生活例子举例。有时间把每个原理都搞清楚,这时间也足够你写好一个不错的模拟挂。其实这些要搞清楚。光光一个 C,没有个一两年的意淫和实践。谁都不敢说自己完全入门了。2、大家会发现我的教材大多数在讲内存地址。因为写后台挂,基本都要用到内存地址。知道了地址,你直接把地址复制去我发的代码里面就能直接用了,按键代
4、码里面,我也加了解释。当然一些代码我在前面教程里解释了干嘛用的,后面发的时候就不会再解释了。 由于我电脑上个月去某网站中毒,结果硬盘废了,所以现在我的代码都不是存货了,写教程时候临时赶的,没办法一一检测有啥毛病,所以如果有错的话,希望谅解。能改的就自己改吧。3、也许会打击到某些人,但是还是要说。数学太差的人,也不用往下看我的教程了,很可能是浪费时间4、完全没有基础的兄弟,在学习教程前。必须自学一些必备知识。推荐教材不是什么 C 语言入门,或者某某入门视频,因为里面有很多我们根本用不到的东西,要么太深,要么太浅。建议直接拿高中的数学课本。现在的数学课本里有两个章节专门讲入门级别的 VB,学了后可
5、以进行简单的编程,学校教这两个单元,也只半个月,每天一节,扣掉练习课时间,实际上正课时间,就 5 节,总共就 400 分钟教完,而且给学生上课还讲究一些环节,如果自学就更省了,成人 3 个小时应该够了。我认为该书对于新手该掌握的东西写的不错。这些会了,按键的入门你也就会了。5、一定要掌握的东西有:常量,变量,基本流程控制。其他一些数组,书本翻翻,简单了解下就行。游戏里用到多少,根据进度学多少。6、我有发出来代码的,看完后不要就扔掉,要自己再写一遍,写的时候不是说把所有字母你默写一遍,我自己都不行。而是把每行的思路整理出来。然后每步骤用到什么代码再去查下,把自己的参量带进去。最后写完在某些地方使
6、用别人插件时候要注意的地方自己标注下(比方说是字符型还是什么进制的),坦白说,按键的代码,我自己也不会被,是用到什么函数,子程序,去搜索下帮助,然后把代码复制进去。而且我有一个专门记事本,记录常用的代码格式。找了一次后,以后再用,就去整理的资料里面找格式。毕竟我是学数学的,没空背那么多格式和代码,没那么多时间花在计算机上。7、“路漫漫其修远兮”,“艰难困苦玉汝于成”,“只要功夫深,铁杵磨成针“8、如果我有发辅助工具的,杀毒软件有可能报毒。因为写这些工具的E,很多外挂都用他写的,所以很多软件都把这个软件报毒处理,因为我都是自己用,不是拿去盈利的,没去做什么免杀处理。而模块我只有买了一个超级模块的
7、正版,作坊的是破解版(太贵。买不起。),所以我不敢保证我用的程序一定没毒。所以下载前请自己思考清楚,如果电脑真的中毒,我不负任何责任。好,现在开始教程。首先,要想写挂,必须要知道游戏中的数据是多少,我们才能决定有什么操作。所以本节课要解决的内容是-游戏一些简单的数据(红和蓝)。对于网游而言,用的肯定是动态内存。所以现在我们先把原理讲清楚,讲时候我尽量避免少用术语,用通俗的语言为大家解释。有的人一直不理解为什么每次血的内存位置是变的,但是既然是变的,为什么我们又能通过固定的程序找到呢? 这里我用以下图表示,并且用一些通俗话解释因此要找游戏的血量,关键是把路线图中红色的三个不变的数字找到,也就是基
8、址 1 的地址(下面就简称基址 1 了),偏移量 1,偏移量 2。然后根据以下公式得到血量基址 2=基址 1 内放的数字+偏移量 1血内存地址=基址 2 内放的数字+偏移量 2HP 值=血内存地址内放的数字从上面看到,每次游戏之所以血内存地址会变,关键是因为,每次启动游戏时候,基址 1内的数字是不同的。下面我们就以前两天刚公测的游戏昆仑 OL为例,找一找血的动态内存地址。1、首先打开 CE,在设置里面尽量使用内核模式调试器2、点击左上角的电脑图标3、选中游戏进程,按确定4、可以看到人物的血量是 220,所以输入 220,点首次搜索。其他用默认5、以下是搜索结果,可以看到结果很多6、出门让怪砍,
9、使你掉血,然后 CE 在扫描内型下拉框里选择减少的数值7、搜索完发现结果很多。8、没事我们多搜索几次,直到出现比较少的数字为止,看现在就一个地址了9、双击找到的地址,把他加入下面的方框内10、修改描述为 1.内存地址(表示第一次游戏内找到的内存地址),右击地址,选择“查找写入该地址的代码”11、以下是结果,并且双击找到的结果12、然后出现如下图片,红色内行写着 ecx+000001e0,这里 ecx 代表二级基址内放的数值,1e0 代表偏移量 2。方框内是 CE 帮我们计算好的二级基址内的数值,我们就是需要他。把这个数字记下啦。通过它寻找二级基址的位置13、点新的搜索,然后输入刚刚找到的二级基
10、址内的数值,并且勾上前面的 16 进制(因为这个数据是 16 进制),再点击首次搜索(找找看哪个地址内的数值,满足上面这个数字),得到,如下两个结果,然后双击这两个结果,把他们加入下面的方框内。并且添加注释第A 次进游戏得到的可能二级基址。14、二级基址只有一个,所以这两个结果只有一个是真的,(一般来说第一个是真的地址,但也不是绝对的。碰 RP 的话,你也可以直接用第一)所以接下来要判断哪个才是真的二级基址。刚刚说过,退到游戏选择人物画面再进游戏,一级基址不变,二级基址不变,但是二级基址内放的数字变了,这导致这个时候血的内存地址也变了。所以下面要做的就是退到人物选择画面,再进入游戏,通过刚刚方
11、法(1-13 步骤),再找次二级基址,他应该和前一回找到的二级基址一样。下面图中我描述为(B 可能的二级基址)的东东,是我第二次搜索得到的可能二级基址。比较下两次进游戏得到的二级基址,只有红色的地址是没变的,说明他就是二级基址。15、找到二级基址后,通过上图的面板你们也发现 二级基址 (10822D20 ) = 一级基址的数值() + 偏移 1()所以现在我们要找一级基址的数值 和 偏移 1.我们说过二级基址数值只要进入正式游戏都不不会改变了,只有进入人物选择画面的时候才变,下面我们要做的就是跟踪这个二级基址,回到人物选择画面,看看是谁往这个基址内写入东东16、正式进入游戏后,我们发现检测到几
12、个结果,那到底哪个才是真的呢?我们选择红色那个,因为他有 mov 17、双击这个红色,然后得到如下图。红色那行写着 eax+ecx*4,这里前面的 eax 代表一级基址内放的数值,ecx*4 代表偏移量 1。方框内是 CE 帮我们计算好的一级基址内的数值,我们就是需要他。把这个数字记下啦。通过它寻找一级基址的位置。同时我们发现 ecx 代表的是 4(十六进制),4(十六进制)*4=10(十六进制)。10 就是偏移 118、搜索一级基址内的数值 10822D10,看看哪个地址内装的是他。结果就一个19、好了现在我们知道所有的东西了,红色部分是无论哪次进游戏都不变的。找到他们,现在就能进行找血的内
13、存位置了。一级基址(012BAB94 )二级基址(10822D20 ) = 一级基址的数值(10822D10) + 偏移 1(10)血内存地址(055FCE18) = 二级基址的数值(055FCC38) + 偏移 2(1e0)下面我们要来检验下我们得到的是否正确,思路是:以下红色部分代表:无论哪次进入游戏都不会变的量基址 1 内放的数字=读取数据(基址 1)基址 2=基址 1 内放的数字+偏移量 1 基址 2 内放的数字=读取数据(基址 2)血内存地址=基址 2 内放的数字+偏移量 2 HP 值=读取数据(血内存地址)根据以上思路,写成按键精灵的代码如下:1. /下一行的目的是获取游戏窗口句柄
14、。因为下面要用到这个参数2. Plugin jzs=Window.MousePoint()3. /定义变量4. VBS Dim hp base py1 py2 hpjz1 hpjz25. Rem 程序开始6. /base,py1,py2 分别表示一级基址的门牌号,偏移 1,偏移 27. /自己修改,下面的三个参数为你自己的,你就能直接得到你自己游戏的血量多少,请注意所有十六进制的数字前都要加上&H,这样电脑才知道你输入的数字是十六进制的,不然像第二行的py2 不加&H 就变成十进制的 10,实际上十六进制的 10 代表的是十进制的 168. base=&H012BAB949. py1=&H10
15、10. py2=&H1e011. /hpjz1 代表 一级基址内放的数字,下一句话意思是从一级基址内的数据存入 hpjz1 中.顺带补充句以下所有 Memory.Read32Bit 得到的数据都是十六进制12. Plugin hpjz1=Memory.Read32Bit(jzs,base)13. /hpjz2 代表二级基址内放的数字,hpjz1+py1 意思是把基址 1 内装的数字+ 偏移 1,得到基址 2 的门牌号,下一句话意思是,计算出基址 2 的门牌号,然后从二级基址内读入数据存入 hpjz2 中14. Plugin hpjz2=Memory.Read32Bit(jzs,hpjz1+py1)15. /hp 代表。地球人都知道什么意思。hpjz2+py2 意思是把基址 2 内装的数字+偏移 2,得到 HP 内存位置的门牌号,下一句话意思是,计算出 HP 内存位置的门牌号,就从 HP 内存地址中读入数据存入 hp 中16. Plugin hp=Memory.Read32Bit(jzs,hpjz2+py2)17. /防止 HP 数值不是十进制表示,所以通通给我转成十进制18. hp=int(hp)19. /弹出 HP 是多少的信息框20. MessageBox hp复制代码接着完全关闭游戏,重新登陆,运行脚本看看读取到的血量是多少:OK,说明我们找到的是正确的。教程(一)到此结束