|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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的关系转换问题。 |
评分
-
查看全部评分
|