不明白内存修改器是个什么原理,求解释,多谢

不明白内存修改器是个什么原理,求解释,谢谢
看的是王艳平的《windows 程序设计》

他先写了个能产生数的程序1
#include <stdio.h>           // 02Testor 工程下 
int g_nNum;    // 全局变量测试 
int main(int argc, char* argv[]) 
{  int i = 198;    // 局部变量测试 
  g_nNum = 1003; 
  while(1) 
  {  //  输出个变量的值和地址 
    printf(" i = %d, addr = %08lX;      g_nNum = %d, addr = %08lX \n", ++i, &i, --g_nNum, &g_nNum); 
    getchar();    } 
  return 0; 
}


然后再写一个修改程序1 g_nNum变量的程序2
他的思路是:按页搜索,看想查找的数是否与当前遍历的数相等,如果相等,就将地址添加到全局变量数组中。然后,因为查找到的地址不唯一,所以要在全局变量数组中进行第二次查找。然后写入我们要修改的值。
BOOL CompareAPage(DWORD dwBaseAddr, DWORD dwValue) 
{  // 读取 1 页内存 
  BYTE arBytes[4096]; 
  if(!::ReadProcessMemory(g_hProcess, (LPVOID)dwBaseAddr, arBytes, 4096, NULL)) 
    return FALSE;    //  此页不可读 
  // 在这 1 页内存中查找 
  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;   // Windows 98 系列,4MB   
  else 
    dwBase = 640*1024;    // Windows NT 系列,64KB 
  // 在开始地址到2GB 的地址空间进行查找 
  for(; dwBase < 2*dwOneGB; dwBase += dwOnePage) 
  {  //  比较 1 页大小的内存 
    CompareAPage(dwBase, dwValue);    } 
  return TRUE; 

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; 

以上代码略去了在控制台显示查找到的地址和写入部分的代码
我不明白的是:在实际运行的时候,打开程序2,会自动运行程序1(因为我在2中调用了1进程)比如第一次我输入要修改的值时1002,程序会返回3个地址,然后书上说我需要在程序1上摁两下回车,然后再进行一次查找(我在这里输入的不是1002而是1000,然后程序找到了唯一的地址),这样循环直到找到的地址惟一为止。 最后输入要修改成的值,修改成功。我实在是想不明白,1002不是我想要替换的数吗?为什么要在程序1中摁两下回车?这代表什么?1002在程序1中不应该是唯一的地址码?程序为什么会返回多个地址给我?我最后替换1000成功了,如果我想到替换1002呢?

感觉我对于这个内存修改器完全不明白啊。。。。是因为我不玩游戏么。。。。。。
不明白内存修改器是个什么原理,求解释,多谢

------解决思路----------------------
修改器的原理很简单,就是修改内存中数据,既然是修改内存中的数据,当然要先确定该数据在内存中的地址。
------解决思路----------------------
修改内存数据有那么难理解吗?建议楼主去玩玩Cheat Engine和OllyDBG。
------解决思路----------------------
我说下正确逻辑吧

首先输入一个值,确定所有内存页符合这个值的内存页。可能有10个和这个值相符。
之后,再改变这个值,再在之前的10个地址查找,就有可能只有一个地址了(如果超过1个,继续改变搜索)。
------解决思路----------------------
引用:
我说下正确逻辑吧

首先输入一个值,确定所有内存页符合这个值的内存页。可能有10个和这个值相符。
之后,再改变这个值,再在之前的10个地址查找,就有可能只有一个地址了(如果超过1个,继续改变搜索)。

没错,就是这个原理。
改变值后,可以按准确值查找,也可以按改变(变大或变小)查找。