|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 憔悴心只为你 于 2011-11-6 10:55 编辑
//不多说,直接上代码,关键地方已经注释//已经编译通过,可直接修改使用
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
BOOL FindFirst(DWORD dwValue);//在目标进程空间进行第一次查找
BOOL FindNext(DWORD dwValue);//在目标进程地址空间进行第2、3、4、...次查找
DWORD g_arList[1024];//地址列表
int g_nListCnt;//有效地址的个数
HANDLE g_hProcess;//目标进程句柄
int i=0;
BOOL CompareAPage(DWORD dwBaseAddr,DWORD dwValue)
{
DWORD* pdw;
BYTE arByets[4096];//读取一页内存
if (!ReadProcessMemory(g_hProcess,(LPVOID)dwBaseAddr,arByets,4096,NULL))
{
return FALSE;//此页不可读
}
//在这一页内存中查找
for (i=0;i<((int)4*1024-3);i++)
{
pdw=(DWORD*)&arByets[i];
if(pdw[0]=dwValue)//等于要查找的值?
if (g_nListCnt>=1024)
{
return FALSE;
g_arList[g_nListCnt++]=dwBaseAddr+i;//添加到全局变量中
}
}
return TRUE;
}
BOOL FindFirst(DWORD dwValue)
{
DWORD dwBase;
OSVERSIONINFO vi={sizeof(vi)};
const DWORD dwOneGB=1024*1024*1024;//1GB
const DWORD dwOnePage=4*1024;//4KB
if (g_hProcess==NULL)
{
return FALSE;
}
//查看操作系统类型,以决定开始地址
GetVersionEx(&vi);
if (vi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
{
dwBase=4*1024*1024;//windows 98系列,4MB
}
else
{
dwBase=640*1024;//windows NT系列,64KB
}
//在开始地址到2GB的地址空间进行查找
for (;dwBase<(2*dwOneGB);dwBase+=dwOnePage)
{
//比较一页大小的内存
CompareAPage(dwBase,dwValue);
}
return TRUE;
}
void ShowList()
{
for (i=0;i<g_nListCnt;i++)
{
printf("%081x\n",g_arList[i]);
}
}
BOOL FindNext(DWORD dwValue)//注释参见FindFirst函数
{
BOOL bRet=FALSE;//假设失败
DWORD dwReadValue;
int nOrgCnt=g_nListCnt;
g_nListCnt=0;
for (i=0;i<nOrgCnt;i++)
{
if (ReadProcessMemory(g_hProcess,(LPVOID)g_arList,&dwReadValue,sizeof(DWORD),NULL))
{
if (dwReadValue==dwValue)
{
g_arList[g_nListCnt++]=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[])
{
int iVal;
char szFileName[]="APPFileName";//这里的APPFILENAME是你要修改内存的程序
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;
//输入要修改的值
printf("Input val= ");
scanf("%d",&iVal);
FindFirst(iVal);//进行第一次查找
ShowList();//打印出搜索的结果
while (g_nListCnt>1)//当结果数大于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 会不认的,会报错,希望大家以后写程序注意这个问题*/
[/i][/i] |
|