c语言如何找到进程基址,从0开始学模拟挂(一)--找内存基址,包含原理 _ 脚本

PS:12楼的兄弟,不能回到选择人物画面,那你就换个地图试试,也可以请看下篇,找内存基址方法(二),

有人问怎么自动加血,我板凳帖子里不是有了,读取血内存地址的代码了吗?

把那份代码,你用两次,第一次读取出来的数值作为最大血值,再用一次来读取,当前血量。

然后你加个判断

if 当前红

then 喝药快捷键(有兴趣的同志可以自己用CALL)

ENd if

另外补充。。我一般很少写挂,除非是没挂的游戏(中国特色估计着是不可能的)。。都是去买,买一个月才30-50.。。。虽说有模板,但是自己写光调试都要N天。。找基址,找CALL。快的一个量要5分钟,慢的半个小时都有可能。。有那闲工夫慢慢写。。不知道打工已经挣多少了。。

因为我在这个区不能再编辑帖子发图了

这里为了使大家能听得懂,所以我用了很多白话。。。(貌似有点愧对大学老师。。。讲的都很不规范。。。俺不是计算机系出来的。没办法。。)。我想不到更简单的方法了。老鸟看了别喷粪。。认为不好的少唧唧歪歪。自己去写个教程。版版能不能加个精华啊,写的很辛苦啊~不然没啥动力继续写了

不少兄弟一直也很想写模拟挂,但是却不知道如何下手,这里我就带大家从0学起,该如何写模拟挂。这里我教程重点是偏向于后台运行的模拟挂。所以向找色这些用的比较少。其实我根本不会找色。。。我习惯读内存。。其实按键精灵难的就是怎么读内存,会弄内存了,只要直接把内存地址复制到万能模板里就行了。最近开始转学E语言写内挂,所以就把万能模板公开了,全套教程看完,你就能最短时间内写个模拟挂了(你只要把几个参数自己找到代入就行。。)。基本上简单游大多数脚本也只有这个水平。当然我的挂只有简单找怪打怪功能,没啥变态功能。因为我都是自己用,没有啥让人激动游戏,可以提起我兴趣去写。那些自动任务什么的。。。汗。。你找别人吧。。。

基本要求:具有高中级别的VB 水平,不需要多高,知道常量,变量,什么是十进制,十六进制,以及简单流程控制if do while 是什么就行,还有懂得勾股定理(挂机范围时候用到)。别说你不懂。。高中就有学。。人教版高一数学,选修(二),这些东西我前一阵还在教,那些学生都能学额很轻松。。再不行。。自己去看书去。。三个小时就能看完。看懂

前言:

说说本教程教学计划:

基础篇:

(一) 找内存基址(红和蓝)

(二)模拟挂主框架和红蓝自动喝药

(三)读取人物和怪游戏坐标 (内存式)

(四)自动找怪,又分成两次教

(1) 游戏前台时候找怪

(2)游戏后台时候找怪

(五)指定范围挂机

进阶篇:

(六) **验证码(不会汇编的不用学了)

关于学习建议:(只适合新手,老鸟别看)

1、按键精灵图的就是省事,有现成的东西可以用,所以很多时候不需要你懂得很多原理,只要懂得在别人的插件基础上,加上自己参数,然后组合而成。所以我在讲解过程中,我认为没必要解释的原理就不说,只要你懂得怎么套公式就行。除非一些影响你使用的原理,我才讲解,讲的时候尽量通俗,拿生活例子举例。有时间把每个原理都搞清楚,这时间也足够你写好一个不错的模拟挂。其实这些要搞清楚。。。光光一个C,没有个一两年的意淫和实践。谁都不敢说自己完全入门了。

2、大家会发现我的教材大多数在讲内存地址。因为写后台挂,基本都要用到内存地址。知道了地址,你直接把地址复制去我发的代码里面就能直接用了,按键代码里面,我也加了解释。当然一些代码我在前面教程里解释了干嘛用的,后面发的时候就不会再解释了。 由于我电脑上个月去某网站中毒,结果硬盘废了,所以现在我的代码都不是存货了,写教程时候临时赶的,没办法一一检测有啥毛病,所以如果有错的话,希望谅解。。能改的就自己改吧。

3、也许会打击到某些人,但是还是要说。。。数学太差的人,也不用往下看我的教程了,很可能是浪费时间

4、完全没有基础的兄弟,在学习教程前。必须自学一些必备知识。推荐教材不是什么C语言入门,或者某某入门视频,因为里面有很多我们根本用不到的东西,要么太深,要么太浅。建议直接拿高中的数学课本。现在的数学课本里有两个章节专门讲入门级别的VB,学了后可以进行简单的编程,学校教这两个单元,也只半个月,每天一节,扣掉练习课时间,实际上正课时间,就5节,总共就400分钟教完,而且给学生上课还讲究一些环节,如果自学就更省了,成人3个小时应该够了。我认为该书对于新手该掌握的东西写的不错。这些会了,按键的入门你也就会了。

5、一定要掌握的东西有:常量,变量,基本流程控制。其他一些数组,书本翻翻,简单了解下就行。游戏里用到多少,根据进度学多少。

6、我有发出来代码的,看完后不要就扔掉,要自己再写一遍,写的时候不是说把所有字母你默写一遍,我自己都不行。而是把每行的思路整理出来。然后每步骤用到什么代码再去查下,把自己的参量带进去。最后写完在某些地方使用别人插件时候要注意的地方自己标注下(比方说是字符型还是什么进制的),坦白说,按键的代码,我自己也不会被,是用到什么函数,子程序,去搜索下帮助,然后把代码复制进去。而且我有一个专门记事本,记录常用的代码格式。找了一次后,以后再用,就去整理的资料里面找格式。毕竟我是学数学的,没空背那么多格式和代码,没那么多时间花在计算机上。

7、“路漫漫其修远兮”,“艰难困苦玉汝于成”,"只要功夫深,铁杵磨成针"

8、如果我有发辅助工具的,杀毒软件有可能报毒。因为写这些工具的E,很多wai挂都用他写的,所以很多软件都把这个软件报毒处理,因为我都是自己用,不是拿去盈利的,没去做什么免杀处理。而模块我只有买了一个超级模块的正版,作坊的是**版(太贵。买不起。),所以我不敢保证我用的程序一定没毒。所以下载前请自己思考清楚,如果电脑真的中毒,我不负任何责任。

好,现在开始教程。首先,要想写挂,必须要知道游戏中的数据是多少,我们才能决定有什么操作。所以本节课要解决的内容是---游戏一些简单的数据(红和蓝)。对于网游而言,用的肯定是动态内存。所以现在我们先把原理讲清楚,讲时候我尽量避免少用术语,用通俗的语言为大家解释。

有的人一直不理解为什么每次血的内存位置是变的,但是既然是变的,为什么我们又能通过固定的程序找到呢? 这里我用以下图表示,并且用一些通俗话解释

<
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C++代码实现: ```c++ #include <iostream> #include <string> #include <vector> using namespace std; // 进程控制块 struct PCB { string name; // 进程名称 PCB* next; // 队列指针 int base; // 分配的物理内存区域基址 int length; // 分配的物理内存区域长度 }; // 空闲内存空间 struct FreeSpace { int base; // 基址 int length; // 长度 }; vector<PCB*> readyQueue; // 就绪队列 vector<FreeSpace*> freeSpaces; // 空闲内存空间 // 初始化空闲内存空间 void initFreeSpaces() { FreeSpace* space1 = new FreeSpace; space1->base = 0; space1->length = 100; freeSpaces.push_back(space1); FreeSpace* space2 = new FreeSpace; space2->base = 200; space2->length = 50; freeSpaces.push_back(space2); } // 分配空闲内存空间 int allocateMemory(int length) { for (int i = 0; i < freeSpaces.size(); i++) { FreeSpace* space = freeSpaces[i]; if (space->length >= length) { int base = space->base; space->base += length; space->length -= length; if (space->length == 0) { freeSpaces.erase(freeSpaces.begin() + i); } return base; } } return -1; // 内存不足,分配失败 } // 创建进程 PCB* createProcess(string name, int length) { int base = allocateMemory(length); if (base == -1) { cout << "分配内存失败!" << endl; return NULL; } PCB* pcb = new PCB; pcb->name = name; pcb->base = base; pcb->length = length; // 初始化PCB并加入就绪队列 pcb->next = NULL; readyQueue.push_back(pcb); cout << "创建进程成功!" << endl; return pcb; } // 销毁进程 void destroyProcess(PCB* pcb) { // 释放分配的内存空间 FreeSpace* space = new FreeSpace; space->base = pcb->base; space->length = pcb->length; freeSpaces.push_back(space); // 从就绪队列中删除PCB for (int i = 0; i < readyQueue.size(); i++) { if (readyQueue[i] == pcb) { readyQueue.erase(readyQueue.begin() + i); break; } } delete pcb; cout << "销毁进程成功!" << endl; } // 显示就绪队列 void displayReadyQueue() { cout << "就绪队列:" << endl; for (int i = 0; i < readyQueue.size(); i++) { PCB* pcb = readyQueue[i]; cout << "进程名称:" << pcb->name << ",基址:" << pcb->base << ",长度:" << pcb->length << endl; } } int main() { initFreeSpaces(); while (true) { cout << "请输入指令(1:创建进程,2:销毁进程,3:显示就绪队列,0:退出):" << endl; int command; cin >> command; switch (command) { case 1: cout << "请输入进程名称和长度:" << endl; string name; int length; cin >> name >> length; createProcess(name, length); break; case 2: cout << "请输入要销毁的进程名称:" << endl; cin >> name; for (int i = 0; i < readyQueue.size(); i++) { PCB* pcb = readyQueue[i]; if (pcb->name == name) { destroyProcess(pcb); break; } } break; case 3: displayReadyQueue(); break; case 0: return 0; default: cout << "无效的指令!" << endl; break; } } return 0; } ``` 以上代码实现了一个简单的进程管理系统,可以创建和销毁进程,并显示就绪队列。通过输入不同的指令来触发进程状态转换的事件。具体实现中,空闲内存空间采用了一个简单的vector来管理,每次分配内存时从vector中寻合适的空间,如果不到则分配失败。同时,将创建的PCB加入就绪队列中,销毁时从就绪队列中删除。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值