@TOC初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程
【1】什么是windows API
Windows API 中文翻译过来就是windows应用程序接口(Application Programming Interface)
我们知道,我们在使用C/C++的时候,会包含很多的头文件,例如最常用的stdio.h,里面有很多函数的声明,例如使用scanf函数能输入数据,使用printf函数能打印文本到屏幕上显示出来。又例如math.h里面有很多数学计算函数,如sqrt求平方根的函数。我们只要包含这些头文件,就能调用这些函数。只要给函数传递相应的参数,就能实现我们想要的效果,这些函数就是C语言给我们提供的“接口”。
所谓windows应用程序接口,其实就是windows提供给程序员的一组函数。
Windows api 包含几千个可调用的函数,这些函数能让我们程序员操作系统的方方面面。
我们就可以调用者几千个函数实现各种功能。如调用ExitWindowsEx来关闭计算机,CopyFile来复制文件,MessageBox来弹出系统提示框,用BitBlt来绘制图像等等。而调用这几千函数的条件,就是在代码的开头加上#include <windows.h>就行了,因为绝大部分的函数声明都在windows.h里面,我们只要包含了这个头文件,就能够使用这些函数。
所以可以这么理解
Windows API =windows提供的几千个函数
进程的概念:进程就是一个正在执行的程序。
假如我们要运行一个程序,首先找到文件(如qq.exe)或者快捷方式,双击打开。操作系统就会把这个程序的文件从硬盘上加载到内存中,等加载完毕后,CPU开始执行包含在程序中的代码,然后系统进程列表多了一个qq.exe,这就是进程——正在运行的应用程序。等到这个程序qq.exe运行结束了,系统就会释放这个程序在内存中占用的空间,并且从进程列表里移除这个程序。
进程的特点:每个进程都是相互独立的,互不干扰的。通常情况下,一个进程只能操作自己的代码和数据,无法对其他进程造成影响。这也保证了windows系统运行的稳定性。
进程=正在内存中运行的程序
【windows内存的运行原理】
这个是外挂编程的最重要部分,我们分几个方面讨论:1 什么是内存?2 进程的边界–虚拟内存空间 3 打开进程的边界
什么是内存
内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁,其存取速度比硬盘快很多倍。内存对应是电脑的内存条,能存储数据,但是与硬盘不同,在内存中的数据一断电就会消失,并且存取数据的速度是硬盘的几十倍,所以将程序加载到内存中运行将大大提高程序的运行速度。现在一般的电脑内存1GB,2GB,4GB或者更高的8GB。
计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大,并且CPU只能执行和处理在内存中代码和资源。
程序的存在形式实际上是这样的:我们的程序文件,首先是以二进制存在于硬盘上的,有的游戏特别大,几个GB,当我们打开资源管理器时,查看的,其实就是硬盘上的文件。当我们运行程序时,程序会适当的从硬盘加载自己需要的数据,然后开始运行。
由于内存比较少,当程序不需要这些数据的时候,就会从内存中释放一些不需要的资源,以保证内存的充足。
总的看来当执行一个程序的时候,系统会将exe文件中的代码和资源从硬盘加载到内存中,加载完成后,CPU开始执行程序入口点的代码,一个程序开始运行。
程序结束时,将释放所有这个进程占用的资源,以避免内存的浪费。
概括来说:内存,其实存储运行中的程序代码和数据的地方(CPU只能处理内存中的代码和数据),当进程结束时,该进程所有占用的内存空间将被系统释放。
进程的边界–虚拟内存空间、
我们设想一下,假如一个系统中有很多的程序在运行,我们只有一个内存空间,这样的话,一个程序在读写数据的过程中,由于程序自己本身的缺陷,错误的读写了其他程序的数据,这样就很容易影响其他程序,造成其他程序的崩溃。这当然是我们不愿意见到的。
为了解决程序之间使用内存互相干扰的问题,于是便有了虚拟内存。
Windows的虚拟内存机制为每个进程分配了4GB的虚拟内存空间。这里我们不免产生疑问,我们的实际物理内存空间只有1GB或者2GB的,等等,怎么能给每个进程分配4GB内存空间呢?
实际上,这4GB空间最下面的64KB是空指针赋值区域,系统保留。内存最上面的2G被系统占用。我们能够访问和使用的,也只有中间这一部分内存而已。这部分内存将近2GB,我想对所有程序来说,存储代码和数据都是够用的。
但是每个进程都有这么大内存可以用,这些内存空间从何而来呢。Windows在执行一个程序的时候,为了节约内存空间,将程序内存中暂时用不到的数据,以二进制存储到硬盘上(这些二进制文件其实就是页面文件)。等到需要的时候,再从硬盘上加载到内存中,这样就以牺牲少量CPU运行时间为代价,将硬盘当做内存使用。使得多程序同时执行成为了可能。这4GB中的数据,有的是存在于硬盘上的,有的是存在于内存中,所以说,每个进程的4GB内存空间,是“虚拟”内存。
虚拟内存的地址一般用十六进制表示,以字节为单位,地址范围是0x00000000~0xFFFFFFFF(0x表示十六进制)。
由于这样的机制,我们不难发现,进程之间就不能相互影响,保证了各进程的稳定性。例如有两个进程A和B,进程A可以在它自己内存空间0x12345678地址存储数据,进程B也可以在0x12345678地址处存储数据。当进程A访问0x12345678处的内存时,访问的是进程A的内存空间;当进程B访问0x12345678处的内存时,访问的是进程B的内存空间。进程A无法访问位于进程B的内存空间中的数据,反之亦然。
这就是进程的边界–每个进程分配了4GB的虚拟内存空间,它们在自己的内存空间内运行,不会相互干扰,保护了系统和各进程的稳定性。
为什么要以16进制表示地址
编程中,我们一般用十进制表示一个数,因为C/C++是高级语言。
例如x=78;
不过,由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决 问题。但二进制数太长了。比如int 类型占用4个字节,32位。比如100,用int类型的二进制数表达将是:  
0000 0000 0000 0000 0110 0100   
面对这么长的数进行思考或操作,没有人会喜欢。因此,C,C++ 没有提供在代码直接写二进制数的方法。用16进制可以解决这个问题。因为,进制越大,数的表达长度也就越短。
例如同样一个地址。用十进制和十六效果对比下:
十进制 十六进制
1258965451 4B0A49CB
5600 000015E0
85693 00014EBD
8965231 0088CC6F
这样可以看到用十六进制表现更直观一些。并且,在很多软件中,数值的表示都是用十六进制的,例如WinHex,CE,OllyDBG,几乎所有与内存有关的数据都是用十六进制表示。用十六进制最大的优点就是缩小了表达长度。
打开进程的边界 
当然所有的事情不是绝对的,我们有很多时候也需要访问其他进程中的数据。例如,杀毒软件要监视其他进程的行为,防止其他进程做有害系统的事,杀毒软件往往就会在其他进程里注入自己的代码,以此来监视其他进程的行为。这就是访问其他进程数据的最好例子。
当然,想要访问其他进程的内存空间,需要强大的windows api。我们知道,windows api是系统提供给程序员的一组强大的函数,几乎能实现任何关于系统的任何操作。
我们要打开进程的边界,修改其他进程的数据,当然需要调用相应的函数。
我们的目的很明确,就是要修改其他进程(如游戏进程)的数据。
下面的一些函数是访问其他进程数据和外挂编程必备的函数,在后面介绍外挂编程的时候,我会详细的介绍这几个函数,现在先熟悉一下。
1. 查找窗口函数
FindWindow
2. 通过窗口获取进程ID函数
GetWindowThreadProcessId
3. 打开进程函数
OpenProcess
4. 写其他进程数据的函数
WriteProcessMemory
5. 读其他进程数据的函数
ReadProcessMemory
6. 关闭句柄的函数
CloseHandle
这六个函数,就是写一个简单外挂的所有函数。在后面我会详细说明打开进程边界的步骤,以及如何使用这些函数。
【windows 中句柄的概念】
句柄,是整个windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个四字节长的数值,来标志系统中的不同对象。
打个比喻,一个学校有很多很多的学生,为了识别这些学生,我们会给每个学生分配一个学号。当我们要找一个学生的时候,我们只需要知道这个学生的学号,然后查阅相关信息就能找到这个学生。
同样,在windows系统中有很多很多的对象,如一个窗体,一个进程,一个图标,一张图片,甚至一块内存空间等。Windows 给它们都分配了不同的一个unsigned int型数(即无符号整型数)来标识和区分它们。这个标识号,就叫做句柄。
我们可以通过系统分配的这个标识号,也就是句柄,来访问这些对象。
例如,我们可以通过一个窗口的句柄,找到这个窗口,然后可以修改这个窗口的大小,标题名字等等。
我们可以通过一个进程的句柄,来结束这个进程。
我们可以通过一张图片的句柄,来将这张图片画在屏幕上。
等等等等。
句柄,就是系统中每个对象的标识号,我们可以通过这些标识号,来访问相应的系统对象,如窗体,进程等等。
【windows变量类型】
在windows编程中,我们往往会看到很多变量类型,如HANDLE,HWND,BYTE,DWORD等等。
这些变量类型是什么呢,和我们熟悉的char,short,int等等的变量类型有什么区别呢。
而经常要用到的  句柄  HANDLE类型,实质上是无类型指针void,HANDLE定义为:
typedef PVOID HANDLE;
HANDLE实际上就是一个PVOID,那PVOID又是什么呢?
Typeef void PVOID;
PVOID就是指向void的指针(void 
)。
所以HANDLE = void
那为什么要多此一举呢,直接用void代替就行了,为什么要用HNADLE呢?其实,这是为了让程序员更能读懂程序。只要看到变量类型就能知道这个变量是用来干什么的。
例如:我要用a,b来表示长方形的宽和高,如果都用int型我们要花费一番功夫才能理解这些意思。
但是我们分别定义两种变量类型Width,Height就能一目了然了。
typedef int Width;
typedef int Height;
Width a;   //定义width型变量a,一眼就能看出a变量是来表示宽度的
Height b;   /定义wheight型变量b,一眼就能看出b变量是来表示高度的
声明特定的变量类型其好处就不言而喻了,就是为了让程序员更好的理解任何变量的作用,使人一目了然。
下面我们需要知道的变量类型以及这些变量类型的作用;
HANDLE =void * HANDLE型变量是一个对象句柄
HWND      =void *HANDLE WINDOW 窗口句柄
DWORD    = unsigned int   无符号整型,windows通常用来表示一个对象的序号ID
BYTE       =unsigned char   无符号字符型,0255
我们做外挂,只需要了解上面3种windows数据类型就行。
另外我需要声明一点:void *型的变量,一般都是用来表明内存地址的,
如 void * Ptr=0x12345678
这个ptr指针,表示的是0x12345678这个内存地址
指针我现在不想多说了,这部分在后面的编程中会看到
【辅助的的实现原理】
我们现在做的只是游戏外挂,有一句古话说的好:知己知彼,方能百战不殆。我们要做游戏的辅助,就要先知道游戏是怎样运行的。
我们知道,一个游戏进程的有很多数据,例如,一个角色的HP,一个角色的经验,他的金钱,等级,以及装备都是通过变量来存储的。我们只要找到这些变量在内存中的地址,然后通过某种方法去修改这些数的数值,就能达到修改游戏的目的。
我们先来说说这些游戏中德数据,怎么判断是什么类型,怎么得到在内存中占的空间大小。
例如,一个人的经验一般用int型变量(4字节)来存储,为什么呢?
因为int型变量(4字节)的取值范围是2147483648~2147483647,而short型变量(2字节)的范围是,由于short的范围太小,而很多游戏的经验值一般都超过这个范围,例如在地下城与勇士的游戏中,我的经验值是108866674523,一千多万,所以,在这个游戏中,一个人物的经验值是必须是int型的,用short型变量会超出范围导致程序运行出错。
我们为什么要知道这些变量占多大内存空间呢?那是因为我们在修改其他进程的数据的时候,我们必须首先要有三个参数:1:在哪个地址 2要修改成多少 3有多大的内存数据要被修改。例如:我们要修改的地址是0x00EFFAE0,要修改成1000000,由于这个变量是int型的,所以,有4字节的内存数据要被修改。这很容易让我们想到游戏程序的源代码里面有这条代码      
int exp;     //人物经验
然后&exp就等于0x00EFFAE0
好吧,开始进入正题了。游戏辅助一般分为两大部分:
一就是找出我们想要的内存地址。
二就是写程序去修改这个内存地址的数到一个相应的数值。
我们先不谈第一个部分,因为第一个部分变化性大,因为很多游戏做了不同程度的保护,使我们找内存地址大费周折,例如CS。不过也有游戏没做任何保护,例如,植物大战僵尸。但是,我们写程序修改其他进程内存中的数据,这个方法是不变的。所以我先来说说如何修改其他进程中的内存数据。
第一步:查找游戏窗口句柄
第二步:通过窗口句柄,获取目标进程的ID
第三步:通过目标进程的ID,打开目标进程,获得句柄
第四步:通过目标进程的句柄,修改目标进程的内存数据
第五步:关闭目标进程
我想有必要说一下,第一步,第二步是为第三步服务的,我们要修改某一进程的内存数据,必须获得这个进程在系统的身份证,即进程的句柄。获取一个进程的句柄有很多方法,我在这里说的第一步,第二步,第三步是最常用的获取目标进程句柄的方法。
但是,为什么如此曲折的才能获得目标进程的句柄呢,我想,主要和我们要使用的windows api 有关。
接下来我们就要具体说说这些强大的windows api函数了。我们之前说的所有知识,很多windows运行原理,都是为了理解下一节这些函数的调用。
并且下一节用到的函数较多,我们只有经常使用,我们才能掌握它们。
[编程实现辅助]
上一节我们说了:要修改一个进程的内存数据必须先获得这个进程的句柄,就像我们要找一个人一样,我们可以通过这个人的身份证,知道这个人住在哪里,才能找到这个人。在windows系统里面也一样,我们只有知道这个进程的身份证–句柄,系统才能找到这个进程,并相应的按照我们的需求修改数据。
在开始说辅助编程之前,我先要说说一个很有用的函数,这个函数就是MessageBox,先来看看这个函数有什么效果。

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片:

带尺寸的图片:

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目

    • 项目

      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to-HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ(n)=(n−1)!∀n∈N\Gamma(n) = (n-1)!\quad\forall n\in\mathbb NΓ(n)=(n−1)!∀n∈N 是通过欧拉积分

Γ(z)=∫0∞tz−1e−tdt&ThinSpace;.\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞​tz−1e−tdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06Mon 13Mon 20已完成 进行中 计划一 计划二 现有任务Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间,文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0开始我的操作确认?结束yesno
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程相关推荐

  1. 十年架构师详解JVM运行原理

    做Java开发的几乎都知JVM这个名词,但是由于JVM对实际的简单开发的来说关联的还是不多,一般工作个一两年(当然不包括爱学习的及专门做性能优化的什么的),很少有人能很好的去学习及理解什么是JVM,以 ...

  2. java中MVC原理详解,SpringMVC运行原理,MVC的基本原理

    SpringMVC运行原理,MVC的基本原理 按照上边的执行流程图,我们可以看出一个SpringMVC整体的一个执行轮廓,下面我们具体来分析下 首先服务器接收到一个请求,匹配并调用了我们的前端控制器( ...

  3. linux进程文件描述符 vnode,Linux C编程详解:进程原理分析、文件描述符和文件记录表、文件句柄和文件原理...

    一.引言 文件操作是Linux C编程中其中的一项核心技术,实际上也相当重要,这里并不是说狭义上的那种文件操作,它也非常有助于理解和学习Linux系统.为什么这样说呢?因为在Unix/Linux的世界 ...

  4. windows批处理 (cmd/bat) 编程详解

    2019独角兽企业重金招聘Python工程师标准>>> windows批处理 (cmd/bat) 编程详解 开始之前先简单说明下cmd文件和bat文件的区别:在本质上两者没有区别,都 ...

  5. 详解Windows开机自动运行

    详解Windows开机自动运行 一.经典的启动--"启动"文件夹 单击"开始→程序",你会发现一个"启动"菜单,这就是最经典的Windows ...

  6. python语言入门详解-python初级教程:入门详解

    python初级教程:入门详解 Crifan Li 目录 前言 .................................................................... ...

  7. 初级黑客安全技术命令详解

    要想做一名真正的黑客,仅仅依靠网络流传的黑软进行扫描或者攻击是没有用的,这样永远不可能成长为一名真正的黑客,大家需要注意的是,平时还得注意积累,这次笔者就简单的 为大家介绍一些系统命令,对于初学的菜鸟 ...

  8. 《Unity 3D 游戏开发技术详解与典型案例》——1.1节Unity 3D基础知识概览

    本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.1节Unity 3D基础知识概览,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...

  9. iOS-NSThread编程详解

    note:文明看帖转载是对自己的尊重也是对学者的鼓励,欢迎批评讨论 iOS多线程-NSThread编程详解 再iOS开发中存在三种比较常用的实现多线程编程的方法,NSThread,NSOperatio ...

最新文章

  1. linux宝塔如何开启gzip,宝塔nginx如何开启网站gzip
  2. Django REST framework的一些奇巧淫技(干货!!!)
  3. Spring mvc,uploadifive 文件上传实践(转自:https://segmentfault.com/a/1190000004503262)
  4. nginx+ssl+pm2 部署 nodejs 服务
  5. 程序人生:提高编程逻辑的 10 种最“疯狂”的方法
  6. [POJ 3709] K-Anonymous Sequence(斜率优化dp / 动态维护凸包)
  7. linux+shell+func,Linux shell编程笔记总结
  8. Hbase入门——安装
  9. Dojo学习笔记(7. dojo.dom)
  10. python3用什么软件_apt-get 如何给python3装软件?
  11. Web 开发 Browser 调试大全
  12. python南开大学王凯_王凯:长大后我也成了你
  13. surface 哪个系列适合java开发,iPad Pro和Surface Pro两大顶级平板该如何选择?
  14. [渝粤教育] 西南科技大学 企业生产运作管理 在线考试复习资料2021版
  15. 《More_Effective_C++》pdf
  16. 关于CSDN怎么获得积分和C币的方法
  17. 一起来作画吧「GitHub 热点速览 v.22.14」
  18. YouTube双字幕显示
  19. 实现拖拉机发牌程序——控制台版python
  20. momentum梯度下降法

热门文章

  1. Benewake(北醒) 快速实现TF03-CAN与电脑通信操作说明
  2. JEECG 3.6.4 云插件开发版发布 ,企业级JAVA快速开发平台
  3. Linux Maven 安装教程
  4. java多态主要体现在哪方面,浅谈java多态的实现主要体现在哪些方面
  5. iOS 多渠道打包的解决方案
  6. linux打地鼠游戏代码,JavaScript实现打地鼠小游戏
  7. 如何多方位布局程序化购买生态链条?
  8. 蓝牙定位技术大全:蓝牙室内定位技术解决方案--新导智能
  9. SIFT算法用VL_feat库实现(matlab)
  10. PLC(可编程逻辑控制器)——WPLSoft的基本操作