随笔-15  评论-5  文章-0  trackbacks-0

        昨天看了一天的《windows程序设计》,本来第三章是看过了,可是总感觉对那个线程和进程的东西理解不够深刻,于是我又回头看了一遍,今天算是理解比较深刻一点了吧,自我感觉!
        原理就是搜索到游戏进程所在的内存地址,然后直接修改内存地址的数据,前一次看,对内存地址搜索一块,只是直接拷贝代码,没有理解,今天知道了,查找过程中需要输出的中间数据也增加了点,也理解了格式“%081X”格式指的是输出8位的16进制数,不足前面补0,我是观察输出结果如此理解,不知道有没有偏差!
   另外,注意到在一个程序中打开另外进程时,路径一定不能写错,而且中间是双斜线,而不是单的,如:char szFileName[] = "E:\\VC++例子\\vclesson\\2\\Testor\\Debug\\Testor.exe"; 如果改成单的就打不开,之前错误一直没查出来,虽然只是一点点进步,心里还是很高兴的,我将继续努力!
        运行效果 
今天学习多线程同步和优先级的设定问题!

posted on 2006-03-16 10:07 学习才能进步 阅读(1086) 评论(3)  编辑 收藏 引用 所属分类: C++学习感想

评论:
# re: 游戏内存修改 2006-03-17 23:31 | Tauruser
斜杠在C/C++里是转义符号,所以要表示“\”就要同时用两个表示。  回复  更多评论
  
# re: 游戏内存修改 2006-03-18 18:46 | 真真假假
谢谢你哦,不说可能打死我也想不起来,我是不是好笨啊!没有悟性!  回复  更多评论
  
# re: 游戏内存修改 2007-09-09 19:08 | 魏尚堂
#include<windows.h>
#include<stdio.h>
#include<iostream.h>

BOOL CompareAPage(DWORD dwBaseAddr,DWORD dwValue);
BOOL FindFirst(DWORD dwValue);
BOOL CompareAPage(DWORD dwBaseAddr,DWORD dwValue);
void ShowList();

BOOL FindFirst(DWORD dwValue); //在目标进程空间进行第1次查找
BOOL FindNext(DWORD dwValue); //在目标进程地址空间进行第2,3,……次查找
DWORD g_arList[1024]; //地址列表
int g_nListCnt=0; //有效地址个数
HANDLE g_hProcess; //目标进程句柄
int main(int argc,char argv[])
{
char szFileName[]="..\\hao005\\debug\\hao005.exe";
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);
BOOL a=FindFirst(iVal);
ShowList();
::CloseHandle(g_hProcess);
cout<<"a="<<a<<endl;
return 0;
}

BOOL CompareAPage(DWORD dwBaseAddr,DWORD dwValue)
{//读一页
BYTE arBytes[4096];
if(!::ReadProcessMemory(g_hProcess,(LPVOID)dwBaseAddr,arBytes,4096,NULL))
{return FALSE;
cout<<"22222222222"<<endl;}



//此页不可读
//在这一页中读
DWORD* pdw;
for(int i=0;i<(int)1024*4-3;i++);
{
pdw=(DWORD*)&arBytes[i];
if(pdw[0]==dwValue) //等于要找的值
{
if(g_nListCnt>=1024)
return FALSE;
cout<<"找到了"<<endl;
//添加到全局变量
g_arList[g_nListCnt++]=dwBaseAddr+i;
}
}

return TRUE;
}
BOOL FindFirst(DWORD dwValue)
{
const DWORD dwOneGB=1024*1024*1024;
const DWORD dwOnePage=4*1024;
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;
cout<<"0000000"<<endl;}

else
{ dwBase=640*1024;
cout<<"111111111111"<<endl;}
//开始地址到2GB的地址空间进行查找
for(;dwBase<2*dwOneGB;dwBase+=dwOnePage)
CompareAPage(dwBase,dwValue);
printf("g_nListCnt=%d\n",g_nListCnt);
return TRUE;
}
void ShowList()
{
for(int i=0;i<g_nListCnt;i++)
printf("%8x\n",g_arList[i]);
}

我的就是查不到哟,if(pdw[0]==dwValue) //等于要找的值
{
if(g_nListCnt>=1024)
return FALSE;
cout<<"找到了"<<endl;
//添加到全局变量
g_arList[g_nListCnt++]=dwBaseAddr+i;
}这些好像根本没运行的,想不出了, 大哥学过帮看下。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理