c++MFC ReadProcessMemory代码调整

img

想要把 DWORD dwValue换成 Cstring dwValue
这一段代码该怎么调整才能正常使用

BYTE byPage[KPAGE] = { 0 };
if (!ReadProcessMemory(hProcess, (LPCVOID)dwBaseAddr, (LPVOID)byPage, KPAGE, NULL))
{
    return TRUE;
}
DWORD *pdwPointer = NULL;
pdwPointer = (DWORD *)byPage;
for (DWORD i = 0;i < KONEK;i++)
{
    if (*pAddrListCounter >= addrListMax)
    {
        return FALSE;
    }
    if (pdwPointer[i] == dwValue)
    {
        pAddrList[*pAddrListCounter] = dwBaseAddr + i * sizeof(DWORD);
        (*pAddrListCounter)++;
    }
}

按你的要求修改很简单,但不知道能否实现你的最终目的,你看看是否可以,有帮助请采纳,谢谢!


BOOL Cdemodlg::CompareOnePage(HANDLE hProcess, DWORD dwBaseAddr, CString strValue, ...略过不修改)
BYTE byPage[KPAGE] = { 0 };
if (!ReadProcessMemory(hProcess, (LPCVOID)dwBaseAddr, (LPVOID)byPage, KPAGE, NULL))
{
    return TRUE;
}
DWORD *pdwPointer = NULL;
pdwPointer = (DWORD *)byPage;
for (DWORD i = 0;i < KONEK;i++)
{
    if (*pAddrListCounter >= addrListMax)
    {
        return FALSE;
    }
    if (strValue.compare(pdwPointer[i]) == 0)    //主要修改这里
    {
        pAddrList[*pAddrListCounter] = dwBaseAddr + i * sizeof(DWORD);
        (*pAddrListCounter)++;
    }
}

望采纳


如果想要查找一个Cstring类型的字符串的数据内存地址,可以按照下面的方式调整代码:

  • 首先,需要使用CString类型来定义字符串变量,并通过该变量来存储要查找的字符串。
  • 然后,可以使用CString类的GetBuffer函数来获取字符串的首地址。
  • 最后,可以使用这个地址来查找字符串的内存地址。
#include <iostream>
#include <Windows.h>

const int KPAGE = 1024;
const int KONEK = KPAGE / sizeof(DWORD);

// 定义字符串变量
CString str = "asdga";

// 获取字符串的首地址
LPCSTR lpStr = str.GetBuffer();

int main()
{
    // 使用首地址来查找字符串的内存地址
    BYTE byPage[KPAGE] = { 0 };
    if (!ReadProcessMemory(hProcess, (LPCVOID)dwBaseAddr, (LPVOID)byPage, KPAGE, NULL))
    {
        printf("read Memory error\n");
        return TRUE;
    }

    DWORD *pdwPointer = NULL;
    pdwPointer = (DWORD *)byPage;

    for (DWORD i = 0; i < KONEK; i++)
    {
        if (*pAddrListCounter >= addrListMax)
        {
            printf("Too many data, can not save....\n");
            return FALSE;
        }

        if (pdwPointer[i] == dwValue)
        {
            pAddrList[*pAddrListCounter] = dwBaseAddr + i * sizeof(DWORD);
            (*pAddrListCounter)++;
        }
    }

    return TRUE;
}

字符串指针不就是字符串存储地址吗?还用查

如有帮助,望采纳
举个例子

#include <iostream>
using namespace std;
int main()
{
     string var1 = "c++";
     int var2 = 10086;
     cout << "var1 变量的地址: ";
     cout << &var1 << endl;
     cout << "var2 变量的地址: ";
     cout << &var2 << endl;
 
};

你可以先在代码中声明一个指针变量:

DWORD *pdwPointer = NULL;

然后在读取进程内存的部分,通过指针将数据读取到指针变量中:

if (!ReadProcessMemory(hProcess, (LPCVOID)dwBaseAddr, (LPVOID)pdwPointer, KPAGE, NULL))
{
printf("read Memory error\n");
return TRUE;
}

最后在遍历指针变量的时候,通过指针来访问指针变量的数据:

for (DWORD i = 0;i < KONEK;i++)
{
if (*pAddrListCounter >= addrListMax)
{
printf("Too many data, can not save....\n");
return FALSE;
}
if (pdwPointer[i] == dwValue)
{
pAddrList[*pAddrListCounter] = dwBaseAddr + i * sizeof(DWORD);
(*pAddrListCounter)++;
}

电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

嗯,辛苦看一下这个【CString 操作指南】,看是否能帮助到你,主要讲使用方法,链接:http://www.jzxx.wj.czedu.cn/html/article4420891.html