马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <Windows.h>
#include <TlHelp32.h> //声明快照函数的头文件
#include <stdio.h>
BOOL FindFirst(DWORD dwValue); //在目标进程空间中进行第一次搜索
BOOL FindNext(DWORD dwValue); //在目标进程空间进行第二三四次搜索
DWORD g_arList[1024]; //地址列表
int g_nListCnt; //有效地址的个数
HANDLE g_hProcess; //目标进程句柄
BOOL CompareAPage(DWORD dwBaseAddr,DWORD dwValue) //比较目标进程内存中一页大小的内存
{
//读取一页内存
BYTE arBytes[4096];
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[i];
if (pdw[0]==dwValue)//等于要查找的值?
{
if(g_nListCnt>=1024)
return false;
g_arList[g_nListCnt++]=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[i]);
}
}
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[i],&dwReadValue,sizeof(DWORD),NULL))
{
if (dwReadValue==dwValue)
{
g_arList[g_nListCnt++]=g_arList[i];
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[0],iVal))//写入新值
printf("Write data sucess\n");
CloseHandle(g_hProcess);
return 0;
}
主要代码已注释,在VC++6.0下编译通过,在Visual studio2005下编译有错,主要是Unicode和Ascii的关系转换问题。 |