【王艳平WINDOWS API书】游戏内存修改器之C++类实现

为了不在枯燥繁杂的语法中发神经。。数据结构也看腻了。。难的部分留着再说吧。。想动手写点实际的程序。。

找了本王艳平的《WINDOWS程序设计》第一版来看。。再不敲几行代码,脑袋就秀逗了。。断断续续看到第二章。。章末有个作业。。封装“游戏内存修改器”成一个类。。就动手做吧。。代码贴在这儿,怕以后丢了:

游戏CPP文件:

欲修改的数据为g_nNum和i.按一下回车键,数据相应的变化,以使我们的数据独一无二,要不然没法确定改我们想改的数据。

Code:
  1. #include <iostream.h>      
  2.      
  3. // 全局变量测试      
  4. int g_nNum;       
  5. int main(int argc, char* argv[])      
  6. {      
  7.     int i = 198;    // 局部变量测试      
  8.     g_nNum = 1003;      
  9.      
  10.     while(true)      
  11.     {      
  12.         // 输出个变量的值和地址      
  13.         cout<<" i = "<<++i<<" addr = "<<&i<<" g_nNum = "<<--g_nNum<<" addr = "<<&g_nNum<<endl;      
  14.         getchar();      
  15.     }      
  16.      
  17.     return 0;      
  18. }    

修改器CPP:

输入要改的游戏中的数据,如果确定了唯一的该数据的地址,就输入新的值后退出,如果不唯一就切到游戏中按一下回车改变一下数据,直到唯一为止。

Code:
  1.   
  2. #include "windows.h"   
  3. #include "stdio.h"   
  4. #include <iostream.h>   
  5. #include <stdexcept>   
  6.   
  7.   
  8. class CMemFinder   
  9. {   
  10. public:   
  11.     CMemFinder(DWORD dwProcessId);   
  12.     virtual ~CMemFinder();   
  13.   
  14.     BOOL IsFirst() const { return m_bFirst; }   
  15.     BOOL IsValid() const { return m_hProcess != NULL; }   
  16.     int GetListCount() const { return m_nListCnt; }   
  17.     DWORD operator[](int nIndex) { return m_arList[nIndex]; }   
  18.   
  19.     virtual void FindFirst(DWORD dwValue);   
  20.     virtual void FindNext(DWORD dwValue);   
  21.     virtual void WriteMemory(DWORD dwValue);   
  22.     void DispList();   
  23.   
  24. protected:   
  25.     virtual void CompareAPage(DWORD dwBaseAddr,DWORD dwValue);   
  26.     DWORD m_arList[1024];   
  27.     int m_nListCnt;   
  28.     HANDLE m_hProcess;   
  29.     BOOL m_bFirst;   
  30. };   
  31.   
  32. CMemFinder::CMemFinder(DWORD dwProcessId):m_nListCnt(0),m_bFirst(TRUE)   
  33. {   
  34.     HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);   
  35.     if(hProcess == NULL)   
  36.     {   
  37.         throw std::runtime_error("Process Error occured!");   
  38.     }   
  39.     m_hProcess = hProcess;   
  40. }   
  41.   
  42. CMemFinder::~CMemFinder()   
  43. {   
  44.     if(m_hProcess != NULL)   
  45.     {   
  46.         CloseHandle(m_hProcess);   
  47.     }   
  48. }   
  49.   
  50. void CMemFinder::FindFirst(DWORD dwValue)   
  51. {   
  52.     const DWORD dwAPage = 1024 * 4;   
  53.     const DWORD dwAGB = 1024 * 1024 * 1024;   
  54.     DWORD dwBase;   
  55.     OSVERSIONINFO vi = { sizeof(vi) };   
  56.     if (vi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)   
  57.     {   
  58.         dwBase = 4*1024*1024;   // Windows 98系列,4MB    
  59.     }   
  60.     else  
  61.     {   
  62.         dwBase = 640*1024;      // Windows NT系列,64KB   
  63.     }   
  64.     for(;dwBase < dwAGB * 2;dwBase += dwAPage)   
  65.     {   
  66.         CompareAPage(dwBase,dwValue);   
  67.     }   
  68.     m_bFirst = FALSE;   
  69. }   
  70.   
  71. void CMemFinder::FindNext(DWORD dwValue)   
  72. {   
  73.     if( IsFirst() )   
  74.     {   
  75.         throw std::runtime_error("First Error!");   
  76.     }   
  77.     DWORD dwOrgCnt = this->m_nListCnt;   
  78.     this->m_nListCnt = 0;   
  79.     DWORD buffer;   
  80.     for(DWORD i = 0;i < dwOrgCnt;i++)   
  81.     {   
  82.         ::ReadProcessMemory(m_hProcess,(LPCVOID)m_arList[i],&buffer,sizeof(DWORD),NULL);   
  83.         if( buffer == dwValue)   
  84.         {   
  85.             m_arList[m_nListCnt++] = m_arList[i];   
  86.         }   
  87.     }   
  88. }   
  89.   
  90. void CMemFinder::WriteMemory(DWORD dwValue)   
  91. {   
  92.     if(m_nListCnt != 1)   
  93.     {   
  94.         throw std::runtime_error("m_nListCnt != 1 Error!");   
  95.     }   
  96.     ::WriteProcessMemory(m_hProcess,(LPVOID)m_arList[0],(LPVOID)&dwValue,sizeof(DWORD),NULL);   
  97. }   
  98.   
  99. void CMemFinder::CompareAPage(DWORD dwBaseAddr,DWORD dwValue)   
  100. {   
  101.     const DWORD dwAPage = 1024 * 4;   
  102.     BYTE buffer[4096];   
  103.     DWORD* aDw;   
  104.     ::ReadProcessMemory(m_hProcess,(LPCVOID)dwBaseAddr,(LPVOID)buffer,dwAPage,NULL);   
  105.     for(DWORD i = 0;i < dwAPage;i++)   
  106.     {   
  107.         aDw = (DWORD*)&buffer[i];   
  108.         if(*aDw == dwValue)   
  109.         {   
  110.             m_arList[m_nListCnt++] = dwBaseAddr + i;   
  111.         }   
  112.     }   
  113. }   
  114.   
  115. void CMemFinder::DispList()   
  116. {   
  117.     for(DWORD i = 0;i < m_nListCnt;i++)   
  118.     {   
  119.         cout<<hex<<m_arList[i]<<endl;   
  120.     }   
  121. }   
  122.   
  123. int main()   
  124. {   
  125.     CHAR appName[]="..//process//debug//process.exe";   
  126.     STARTUPINFO si={sizeof(si)};   
  127.     PROCESS_INFORMATION pi;   
  128.   
  129.     CreateProcess(NULL,appName,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);   
  130.     CloseHandle(pi.hThread);   
  131.     CloseHandle(pi.hProcess);   
  132.   
  133.     CMemFinder cmf(pi.dwProcessId);   
  134.   
  135.     cout<<"Input a Number"<<endl;   
  136.     DWORD search;   
  137.     cin>>search;   
  138.   
  139.     try  
  140.     {   
  141.         cmf.FindFirst(search);   
  142.         cmf.DispList();   
  143.         while(TRUE)   
  144.         {   
  145.             cout<<"Input Again!"<<endl;   
  146.             cin>>search;   
  147.             cmf.FindNext(search);   
  148.             cmf.DispList();   
  149.             if(cmf.GetListCount() == 1)   
  150.             {   
  151.                 cout<<"Input New Value!"<<endl;   
  152.                 DWORD newValue;   
  153.                 cin>>newValue;   
  154.                 cmf.WriteMemory(newValue);   
  155.                 break;   
  156.             }   
  157.         }   
  158.     }   
  159.     catch(std::runtime_error re)   
  160.     {   
  161.         cout<<re.what()<<endl;   
  162.     }   
  163.   
  164.     cout<<"finished!"<<endl;   
  165.     return 0;   
  166. }   

最后上张图:

呵呵,继续加油吧

你可能感兴趣的:(游戏,C++,windows,api,null,buffer)