看流星社区

 找回密码
 注册账号
查看: 2141|回复: 0

内存查找

[复制链接]

该用户从未签到

发表于 2017-6-2 13:29:08 | 显示全部楼层 |阅读模式
windows程序设计中的内存查找
主程序代码:
// MemRepair.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>

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

BOOL CompareAPage(DWORD dwBaseAddr, DWORD dwValue)
{
        //读取一页内存
        BYTE arBytes[4096];
        BOOL bRead = ::ReadProcessMemory(g_hProcess, (LPVOID)dwBaseAddr, arBytes, 4096,NULL);
        if (bRead == FALSE)
        {
                return FALSE;
        }
        DWORD *pdw;
        for (int i=0;i<4096-4;i++)
        {
               
                pdw = (DWORD*)&amp;arBytes[i];
                if (pdw[0] == dwValue)
                {
                        g_arList[g_nListCnt++] = dwBaseAddr+i;
                }
                /*出错,应该将地址先转换成DWORD*,即指向DWORD的地址,然后再取[0]
                if ((DWORD)&amp;arBytes[i] == dwValue)
                {
                        g_arList[g_nListCnt++] = dwBaseAddr+i;
                }
                */
        }
        if (g_nListCnt > 1024)
        {
                printf("the position is large than 1024..");
                return FALSE;
        }
        return TRUE;
}

BOOL FindFirst(DWORD dwValue)
{
        const DWORD dwOneGB = 1 * 1024 *1024 *1024; // 1GB
        const DWORD dwOnePage = 4* 1024; // 4K
        DWORD dwBase;
        OSVERSIONINFO versionInfo={0};
        versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

        ::GetVersionEx(&amp;versionInfo);
        if (versionInfo.dwPlatformId ==  VER_PLATFORM_WIN32_WINDOWS ) //win98
        {
                dwBase = 4 * 1024 *1024; // 4MB
        }
        else
        {
                dwBase = 64 * 1024; // 64KB
        }
        //从开始地址到2GB的空间查找
        for (;dwBase<2*dwOneGB;dwBase+=dwOnePage)
        {
                CompareAPage(dwBase,dwValue);
        }
        return TRUE;
}

BOOL FindNext(DWORD dwValue)
{
        DWORD dwOriCnt = g_nListCnt;
        DWORD dwReadValue;
        BOOL bRet = FALSE;

        g_nListCnt = 0;
        for (int i=0;i<dwOriCnt;i++)
        {
                if (::ReadProcessMemory(g_hProcess,(LPVOID)g_arList[i],&amp;dwReadValue,sizeof(DWORD),0))
                {
                        if (dwReadValue == dwValue)
                        {
                                g_arList[g_nListCnt++] = g_arList[i];
                                bRet = TRUE;                       
                        }
                }
               
        }
        return bRet;
}

void ShowList()
{
        for (int i=0;i<g_nListCnt;i++)
        {
                printf("%08lX\n", g_arList[i]);
        }
}
BOOL WriteMemory(DWORD dwAddr, DWORD dwValue)
{
        //出错的情况:写入的是&amp;dwValue,而不是(LPVOID)dwValue
        return WriteProcessMemory(g_hProcess,(LPVOID)dwAddr,&amp;dwValue,sizeof(DWORD),NULL);
}
int _tmain(int argc, _TCHAR* argv[])
{
        g_nListCnt = 0;
        memset(g_arList,0,sizeof(g_arList));

        char szCommandLine[]="c:\\testor.exe";
        STARTUPINFO si={sizeof(STARTUPINFO)};
        si.dwFlags = STARTF_USESHOWWINDOW;
        si.wShowWindow = TRUE;

        PROCESS_INFORMATION        pi;
        BOOL bRet = CreateProcess(NULL, szCommandLine,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&amp;si,&amp;pi);
        if (bRet == FALSE)
        {
                printf("createProcess failed...");
                return -1;
        }
        ::CloseHandle(pi.hThread);
        g_hProcess = pi.hProcess;
        //输入修改值
        int iVal;
        printf("Input iVal=");
        scanf("%d", &amp;iVal);
        //进行第一次查找
        FindFirst(iVal);
        //打印结果
        ShowList();

        //再次查找
        while (g_nListCnt > 1)
        {
                printf("input iVal:\n");
                scanf("%d",&amp;iVal);
                FindNext(iVal);
                ShowList();
        }

        //修改值
        printf("input new value:\n");
        scanf("%d",&amp;iVal);
        if (WriteMemory(g_arList[0],iVal))
        {
                printf("write suc...");
        }
       
        ::CloseHandle(g_hProcess);
        return 0;
}




测试用的程序代码:


#include "stdafx.h"
#include <stdio.h>

int g_nNum = 1003;
int _tmain(int argc, _TCHAR* argv[])
{
        int i = 200;
        while(1)
        {
                printf("i=%d,&amp;i=%08lX...g_nNum=%d,&amp;g_nNum=%08lX\n\n",i--,&amp;i,--g_nNum,&amp;g_nNum);
                getchar();
        }
       
        return 0;
}
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 19:24

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表