【VC++积累】之一、搜索内存

搜索到内存然后修改它,就像金山游侠游戏修改器。


BOOL FindFirst(DWORD dwValue);
BOOL FindNext(DWORD dwValue);
DWORD g_arList[1024];
int g_nListCnt;
HANDLE g_hProcess;

FindFirst进行第一次搜索,然后将搜索到的地址保存在g_arList中,地址的个数记录在g_nListCnt中。
然后检查g_nListCnt的值,如果大于1 那么就说明搜索到的地址多于1个。

然后来修改,调用FindNext函数,它在g_arList中查找,并更新,并将地址的个数写到g_nListCnt中
然后检查g_nListCnt  直到最终g_nListCnt等于1为止。


BOOL FindFirst(DWORD dwValue)
{
         constDWORD dwOneGB = 1024*1024*1024;        //1GB
         constDWORD dwOnePage = 4*1024;              //4KB
         if(g_hProcess== NULL)
                   returnFALSE;
         
         //查看操作系统类型,以决定开始地址
         DWORDdwBase;
         OSVERSIONINFOvi = { 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);
         }
         returnTRUE;
}

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;
}


2012/8/5

jofranks 于南昌

原文地址:https://www.cnblogs.com/java20130723/p/3211435.html