内存理解之简单的内存修改器

前段日子因为学习内存把王艳平老师的书看了一遍综合了其他书籍,简单学习做了一个内存修改器,下面是我觉得比较重要的知识,从书上抠了下来

代码:

类的形式写的代码:
// HelloGame.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"HelloGame.h"
Game::Game(DWORD ProcessID)
{
m_GameCount = 0;
IsOK = TRUE;
ToAimProcessHandle = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION,
FALSE, ProcessID);
}
Game::~Game()
{
if (ToAimProcessHandle!=NULL)
{
CloseHandle(ToAimProcessHandle);
ToAimProcessHandle = NULL;
}
}
BOOL Game::CompareAPage(DWORD BaseAddress, DWORD Value)//搜索内存
{
BYTE PageBytes[4096];
BOOL IsOK;
IsOK = ReadProcessMemory(ToAimProcessHandle, (LPVOID)BaseAddress, PageBytes, 4096, NULL);
if (IsOK == FALSE)
{
return NULL;
}
DWORD *Buffer;
for (int i = 0; i < 4 * 1024 - 3; i++)
{
Buffer = (DWORD*)&PageBytes[i];//这样才是地址的地址
if (Buffer[0] == Value)
{
m_AddressList[m_GameCount++] = BaseAddress + i;//不懂??

}

}
return TRUE;
}

BOOL Game:: FindFirst(DWORD Value)
{
const DWORD OneGB = 1024 * 1024 * 1024; // 1GB
const DWORD OnePage = 4 * 1024; // 4KB

if (ToAimProcessHandle == NULL)
return FALSE;

// 查看操作系统类型,以决定开始地址
DWORD BaseAddress;
OSVERSIONINFO vi = { sizeof(vi) };
::GetVersionEx(&vi);
if (vi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
BaseAddress = 4 * 1024 * 1024; // Windows 98系列,4MB
else
BaseAddress = 640 * 1024; // Windows NT系列,64KB

// 在开始地址到2GB的地址空间进行查找
for (; BaseAddress < 2 * OneGB; BaseAddress += OnePage)
{
// 比较1页大小的内存
CompareAPage(BaseAddress, Value);
}
IsOK = FALSE;
return TRUE;
}
BOOL Game::FindNext(DWORD Value)
{/*第二次不是从原先进程内存中查找所以直接是进行一个计数而已*/
// 保存m_arList数组中有效地址的个数,初始化新的m_nListCnt值
int Count = m_GameCount;//有效个数
m_GameCount = 0;

// 在m_arList数组记录的地址处查找
BOOL IsOK = FALSE; // 假设失败
DWORD ReadValue;
for (int i = 0; i<Count; i++)
{
if (::ReadProcessMemory(ToAimProcessHandle, (LPVOID)m_AddressList[i], &ReadValue, sizeof(DWORD), NULL))
{
if (ReadValue == Value)
{
m_AddressList[m_GameCount++] = m_AddressList[i];
IsOK = TRUE;
}
}
}
return TRUE;
}
BOOL Game::WriteMemory(DWORD Address, DWORD Value)
{
return WriteProcessMemory(ToAimProcessHandle, (LPVOID)Address, (LPCVOID)Value, sizeof(Value), NULL);
}

main函数中的代码:
#include"HelloGame.h"
#include<Windows.h>
#include<iostream>

using namespace std;
Game GamePlay;
DWORD m_AddressList[4096];
ULONG GameListCount;
HANDLE ProcessHandle;
int main()
{
WCHAR FileName[] = L"..\\debug\\02testor.exe";
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
BOOL IsOK=CreateProcess(NULL, FileName, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
if (IsOK == FALSE)
{
return NULL;
}
// 关闭线程句柄,既然我们不使用它
::CloseHandle(pi.hThread);
GamePlay.ToAimProcessHandle = pi.hProcess;
int ChangeValue;
printf("输入改变的值");
scanf("%d", &ChangeValue);
GamePlay.FindFirst(ChangeValue);
GamePlay.ShowData();

while (GamePlay.m_GameCount > 1)
{
printf("二次查询:%d\r\n");
scanf("%d", &ChangeValue);

// 进行下次搜索
GamePlay.FindNext(ChangeValue);

// 显示搜索结果
GamePlay.ShowData();
}
}

时间: 2024-10-29 09:53:54

内存理解之简单的内存修改器的相关文章

用 C++ 写一个简易的《生化危机 4》修改器

思路比较简单,实现方法也不难,我这里大概说一下流程:♦ 用 CheatEngine 或者类似的内存搜索工具定位要修改的数值的内存地址:♦ 确定要修改的数值所占的字节数:♦ 提升修改器进程自身的 Privilege(特权):♦ 查找并打开目标进程,获取目标进程句柄:♦ 读取目标进程内存地址上的值:♦ 把值写入目标进程的内存地址上: 第一第二步不属于本文的讨论范围,我们从第三步开始吧: 微软从 Windows Vista  开始,引入了新的安全机制,一个进程如果没有足够的权限,是无法读写或者查询另外

UWP游戏防内存修改器的方法

最近我一直在编写适用于Windows 10商店的游戏.这款游戏比较怕玩家用修改器改金钱,因为这种修改会导致某些内购失效并且损害公平性.于是我把自己见过的三种反修改器的方法给网友们介绍一下. 首先说明一下我总结的防止游戏作弊的理念: 1.预防修改,防患于未然,让可用的修改手段减少. 比如说,你让你的UWP在PC不可用,那么修改内存这个操作本身就变得十分艰难了. 用.NET Native编译(或者干脆用c++而不是.net语言),可有效防止反编译看你的加密和解密算法然后搜内存. 2.拦截修改,修改前

Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器

Android For JNI(二)--C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器 当我们把Hello World写完之后,我们就可以迈入C的大门了,今天就来讲讲基本的一些数据类型,函数之内的 我们先来看一张传播久远的图片' 一.各种数据类型介绍 整型 整形包括短整型.整形和长整形. 短整形 short a=1; 整形 一般占4个字节(32位),最高位代表符号,0表示正数,1表示负数,取值范围是-2147483648~2147483647,在内存中的存储顺序是地位在前.高位在

最简单的基于FFmpeg的内存读写的例子:内存转码器

上篇文章记录了一个基于FFmpeg的内存播放器,可以使用FFmpeg读取并播放内存中的数据.这篇文章记录一个基于FFmpeg的内存转码器.该转码器可以使用FFmpeg读取内存中的数据,转码为H.264之后再将数据输出到内存.关于如何从内存读取数据,以及如何将数据输出到内存,可以参考文章: ffmpeg 从内存中读取数据(或将数据输出到内存) FFmpeg读写内存的关键点有2个:1.       初始化自定义的AVIOContext,指定自定义的回调函数.2.       自己写回调函数.注意函数

(转)最简单的基于FFmpeg的内存读写的例子:内存播放器

ffmpeg内存播放解码 目录(?)[+] ===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章列表: 最简单的基于FFmpeg的内存读写的例子:内存播放器 最简单的基于FFmpeg的内存读写的例子:内存转码器 ===================================================== 打算记录两个最简单的FFmpeg进行内存读写的例子.之前的所有有关FFmpe

JVM初探- 内存分配、GC原理与垃圾收集器

JVM初探- 内存分配.GC原理与垃圾收集器 标签 : JVM JVM内存的分配与回收大致可分为如下4个步骤: 何时分配 -> 怎样分配 -> 何时回收 -> 怎样回收. 除了在概念上可简单认为new时分配外, 我们着重介绍后面的3个步骤: I. 怎样分配- JVM内存分配策略 对象内存主要分配在新生代Eden区, 如果启用了本地线程分配缓冲, 则优先在TLAB上分配, 少数情况能会直接分配在老年代, 或被拆分成标量类型在栈上分配(JIT优化). 分配的规则并不是百分百固定, 细节主要取

inux内存映射和共享内存理解和区别

可以看到内存映射中需要的一个参数是int fd(文件的标识符),可见函数是通过fd将文件内容映射到一个内存空间, 我需要创建另一个映射来得到文件内容并统计或修改,这时我创建这另一个映射用的仍是mmap函数, 它仍需要用到fd这个文件标识,那我不等于又重新打开文件读取文件里的数据 1.既然这样那同对文件的直接操作有什么区别呢? 2.映射到内存后通过映射的指针addr来修改内容的话是修改共享内存里的内容还是文件的内容呢? 3.解决上面2个问题,我还是想确切知道共享内存有什么用??? 一种回答|: 1

深入理解JVM之JVM内存区域与内存分配

深入理解JVM之JVM内存区域与内存分配 在学习jvm的内存分配的时候,看到的这篇博客,该博客对jvm的内存分配总结的很好,同时也利用jvm的内存模型解释了java程序中有关参数传递的问题. 博客出处: http://www.cnblogs.com/hellocsl/p/3969768.html?utm_source=tuicool&utm_medium=referral 看了此博客后,发现应该去深入学习下jvm的内存模型,就是去认真学习下<深入理解Java虚拟机>,其内容可能会<

深入理解JMM(Java内存模型) --(一)

并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体).通信是指线程之间以何种机制来交换信息.在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递. 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信.在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信. 同步是指程序用于控制不同线程之间操作发生相对顺序的机制.在共享内存并发