游戏内存修改器
#include <Windows.h>#include <TlHelp32.h> //声明快照函数的头文件
#include <stdio.h>
BOOL FindFirst(DWORD dwValue); //在目标进程空间中进行第一次搜索
BOOL FindNext(DWORD dwValue); //在目标进程空间进行第二三四次搜索
DWORD g_arList; //地址列表
int g_nListCnt; //有效地址的个数
HANDLE g_hProcess; //目标进程句柄
BOOL CompareAPage(DWORD dwBaseAddr,DWORD dwValue) //比较目标进程内存中一页大小的内存
{
//读取一页内存
BYTE arBytes;
if(!ReadProcessMemory(g_hProcess,(LPVOID)dwBaseAddr,arBytes,4096,NULL));
return FALSE;//此页不可读
//在这一页内存中查找
DWORD* pdw;
for (int i=0;i<(int)4*1024-3;i++)
{
pdw=(DWORD*)&arBytes;
if (pdw==dwValue)//等于要查找的值?
{
if(g_nListCnt>=1024)
return false;
g_arList=dwBaseAddr+i;//添加到全局变量中
}
}
return true;
}
BOOL FindFirst(DWORD dwValue)
{
const DWORD dwOneGB=1024*1024*1024;//1GB
const DWORD dwOnePage=4*1024;//4KB
if(g_hProcess==NULL)
return false;
//查看操作系统类型,以决定开始地址
DWORD dwBase;
OSVERSIONINFO vi={sizeof(vi)};
GetVersionEx(&vi);
if (vi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
{
dwBase=4*1024*1024;//windows98系列,4MB
}
else
dwBase=640*1024;//windows NT系列,64KB
//在开始地址到2GB的地址空间进行查找
for (;dwBase<2*dwOneGB;dwBase+=dwOnePage)
{
//比较一页大小的内存
CompareAPage(dwBase,dwValue);
}
return TRUE;
}
void ShowList()
{
for (int i=0;i<g_nListCnt;i++)
{
printf("%081x\n",g_arList);
}
}
BOOL FindNext(DWORD dwValue)
{
//保存m_arList数组中有效地址的个数,初始化新的m_nListCnt值
int nOrgCnt=g_nListCnt;
g_nListCnt=0;
//在m_arList数组记录的地址处查找
BOOL bRet=FALSE;//假设失败
DWORD dwReadValue;
for (int i=0;i<nOrgCnt;i++)
{
if (ReadProcessMemory(g_hProcess,(LPVOID)g_arList,&dwReadValue,sizeof(DWORD),NULL))
{
if (dwReadValue==dwValue)
{
g_arList=g_arList;
bRet=TRUE;
}
}
}
return bRet;
}
BOOL WriteMemory(DWORD dwAddr,DWORD dwValue)
{
return WriteProcessMemory(g_hProcess,(LPVOID)dwAddr,&dwValue,sizeof(DWORD),NULL);
}
int main(int argc,char* argv[])
{
char szFileName[]="";//这里是修改内存的程序的名字
STARTUPINFO si={sizeof(si)};
PROCESS_INFORMATION pi;
::CreateProcess(NULL,szFileName,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
//关闭线程句柄,既然我们不需要它
::CloseHandle(pi.hThread);
g_hProcess=pi.hProcess;
int iVal;//输入要修改的值
printf("Input val=");
scanf("%d",&iVal);
FindFirst(iVal);//进行第一次查找
ShowList();//打印出搜索的结果
while (g_nListCnt>1)
{
printf("Input val=");
scanf("%d",&iVal);//进行下次搜索
FindNext(iVal);
ShowList();//显示搜索结果
}
printf("New value=");//取得新值
scanf("%d",&iVal);
if(WriteMemory(g_arList,iVal))//写入新值
printf("Write data sucess\n");
CloseHandle(g_hProcess);
return 0;
}
主要代码已注释,在VC++6.0下编译通过,在Visual studio2005下编译有错,主要是Unicode和Ascii的关系转换问题。 在Visual studio2005下编译有错
可以关闭Unicode的选项 仰望天上的光 发表于 2011-11-16 16:20 static/image/common/back.gif
可以关闭Unicode的选项
恩啊{:5_102:} 这个很不错啊~
CreateProcess(NULL,szFileName,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);CreatProcess()里竟然有这么多参数啊 :$ 好啊 我留下了 我发现这个win 32编程, 编程的字母 有的是全是大小,而有的是首个字母大小,看起来不舒服。 而不像C++编程字母基本是小写的,除了宏定义是大写。这样看起来很舒服的。 seuer126 发表于 2011-11-22 16:49 static/image/common/back.gif
我发现这个win 32编程, 编程的字母 有的是全是大小,而有的是首个字母大小,看起来不舒服。 而不像C++编程 ...
哪个大写,哪个小写其实是很有讲究的,你接触多了就会习惯了 憔悴心只为你 发表于 2011-11-22 17:11 static/image/common/back.gif
哪个大写,哪个小写其实是很有讲究的,你接触多了就会习惯了
恩,小弟明白了! 赞一个。。好东西 不错啊,好东西。、。。。。。。。。。。。 不地道,竟然还让改错,%081X是什么鬼 支持大神
页:
[1]