主要用于单人游戏。它从操作系统级别解释了如何做到这一点。
图1显示了特定一代记忆棒的硬件。处理CPU的任何硬件部分都通过其自己的控制芯片进行通信,以完成读写操作。图1是其中的。有关详细信息,请参阅参考。

图1.特定一代记忆棒的硬件
记忆棒将由操作系统作为资源接管,并将被分为几页,也称为页面框架。页面框架可以加载不同的页面框架。将一段代码编译成可执行文件K后,K文件的结构将包含所有必需的信息。当操作系统将其加载到内存中时,操作系统会为其配置相关资源。这些资源包括分配给它的页面框架信息。这时,有图2、图3(供参考)。


图2.虚拟内存和物理内存之间的连接
页面表的工作原理如下图所示

图3.页表如何工作
过程控制块和可执行文件
过程控制块,有关详细信息,请参阅:本链接博客文章的第2部分的介绍。
可执行文件,以exe文件为例。该exe文件更加复杂,属于多段结构。它是DOS最成功,最复杂的设计之一。要了解exe文件,首先需要了解exe文件的文件头结构。每个exe文件都包含一个文件头和一个可重定位程序的图像。文件头包含MS-DOS用来加载程序的信息,例如程序的大小和寄存器的初始值。文件头还指向重定位表,该表包含指向程序映像中可重定位段的地址的指针的链接列表。有关详细信息,请参阅。
游戏修饰符的原理
从PCB的代码段开始,将过程的所有相关信息记录在结构对象中。如果进程需要能够相互访问,则操作系统需要提供相应的方法以允许不同的进程相互访问。 game修改器修改游戏,可以理解为:一个进程访问并修改另一个进程的内存空间,因此您只需要知道操作系统提供的进程数据访问方法即可修改数据,如图所示。 4.图1-6显示了大约的数据访问和修改步骤。

图4独立游戏修改器的数据修改原理

模拟代码:
//--------------------------------------------------------------------------//
HWND hWnd =::FindWindow("CRHClass",NULL); //得到窗口句柄
if(hWnd ==FALSE)
MessageBox("游戏没有运行!");
else
{
GetWindowThreadProcessId(hWnd,&hProcId); // 从窗口句柄得到进程ID
HANDLE nOK =OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|
PROCESS_VM_WRITE,FALSE,hProcId); //打开进程并得到读与权限
if(nOK ==NULL)
MessageBox("打开进程时出错");
else
{
//0047EB17
WriteProcessMemory(nOK,(LPVOID)0x0047EB17,&A1,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0047EB18,&A2,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0047EB19,&A3,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0047EB1A,&A4,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0047EB1B,&A5,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0047EB1C,&A6,1,NULL);
//00506950
WriteProcessMemory(nOK,(LPVOID)0x00506950,&B1,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506951,&B2,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506952,&B3,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506953,&B4,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506954,&B5,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506955,&B6,1,NULL);
//第二句
WriteProcessMemory(nOK,(LPVOID)0x00506956,&C1,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506957,&C2,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506958,&C3,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506959,&,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0050695A,&C5,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0050695B,&C6,1,NULL);
//最后一句
WriteProcessMemory(nOK,(LPVOID)0x0050695C,&D1,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0050695D,&D2,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0050695E,&D3,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x0050695F,&D4,1,NULL);
WriteProcessMemory(nOK,(LPVOID)0x00506960,&D5,1,NULL);
CloseHandle(nOK); //关闭进程句柄
}
}
}
/
//读取并修改内力值
DWORD hProcId;
HWND hWnd =::FindWindow("CRHClass",NULL);
if(hWnd ==FALSE)
MessageBox("No");
else
{
GetWindowThreadProcessId(hWnd,&hProcId);
HANDLE nOK =OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|
PROCESS_VM_WRITE,FALSE,hProcId);
if(nOK ==NULL)
MessageBox("ProcNo!");
else
{
DWORD buf1;
DWORD write;
BOOL OK=ReadProcessMemory(nOK,(LPCVOID)0x00506961,(LPVOID)&buf1,4,NULL); //读取我们保存EDX中的基础
if(OK ==TRUE)
{
write =buf1+0x000003F4; //得到内力值的地址
DWORD Writeed =0x00; //要修改的数值
BOOL B =WriteProcessMemory(nOK,(LPVOID)write,&Writeed,1,NULL);
if(B==FALSE)
MessageBox("WriteNo");
}
}
CloseHandle(nOK);
} 其他游戏修改器类型
1、动作样式,所谓的动作样式是指使用API向窗口发送命令或使用API控制鼠标,键盘等,以便游戏中的角色可以移动或攻击。可以通过脚本软件直接开发。非常简单。
2、加速,这种插件修改时钟频率以加快速度。具体要添加。
3、数据包类型,这种插件首先拦截数据包,分析应用程序层协议,然后对其进行修改,然后转发。它适用于大多数游戏,例如WPE,并且某些游戏插件是以这种方式编写的。涉及apihook技术,winsock技术等。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-356769-1.html
直接撞它
这么惨
下次再来就撞击