• 【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 于南昌

  • 相关阅读:
    [LeetCode] String to Integer (atoi) 解题报告
    [LeetCode] Spiral Matrix 解题报告
    推导基姆拉尔森公式根据日期计算星期
    gdb常用命令的用法
    利用基姆拉尔森公式根据日期计算星期
    RIM推出BlackBerry SDK 助力开发者多种应用程序开发
    ERP环境下物料清单的数据结构研究[转]
    VSTO EXCEL篇学习笔记五【原】
    高德纳传奇[转]
    PLM中BOM核心技术的研究[转]
  • 原文地址:https://www.cnblogs.com/java20130723/p/3211435.html
Copyright © 2020-2023  润新知