磁盘分区
+ -

获取或修改指定进程ID的内存数据

2021-08-30 73 0
磁盘分区

在进程ID已知的前提下,如何获取该进程在内存中的数据,下面提供一种方法。

void GetProcessMemory(ULONG PID,,PVOID PVOID pRaddAddr)
{

    PROCESS_INFORMATION pi;
    ZeroMemory(&pi, sizeof(pi));
    pi.dwProcessId = PID;

    HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_CREATE_THREAD | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, pi.dwProcessId);
    if (hProcess == NULL)
    {
        ::MessageBoxA(NULL,"openprocess error",  NULL, MB_OK);
        return;
    }

    SIZE_T nRead;
    BOOL ISOK = ::ReadProcessMemory(hProcess, pRaddAddr, buff, sizeof(buff), &nRead);
    if (!ISOK)
    {
        ::MessageBoxA(NULL, "ReadProcessMemory error", NULL, MB_OK);
        CloseHandle(hProcess);
        return;
    }

    //这里的数组缓冲区需要足够大,否则会产生缓冲区溢出
    char tmp[4096] = { 0 };
    int index = 0;
    if (nRead > 0)
    {
        for (SIZE_T i = 0; i < nRead; i++)
        {
            index += sprintf_s(tmp + index,128, "%02X ", buff[i]);
        }
    }
    else
    {
        ::MessageBoxA(NULL, "no date to read error", NULL, MB_OK);
    }

    CloseHandle(hProcess);
}

当然也可以使用WriteProcessMemory来重入进程内存。

注意:打开进程需要足够的权限,否则OpenProcess会失败,可提高本进程的权限或本进程以高权限运行。

0 篇笔记 写笔记

根据进程名获取进程ID
打开设备管理器,会看到系统当前所有运行的进程,运行时信息包括进程名,进程ID等。设备管理器默认不显示进程名,可点击 查看>>选择名>>进程ID但假如已知运行了一个进程,想通过编程的方法来获取进程ID,请看下列代码#include#incl......
获取或修改指定进程ID内存数据
进程ID已知的前提下,如何获取该进程在内存中的数据,下面提供一种方法。void GetProcessMemory(ULONG PID,,PVOID PVOID pRaddAddr){ PROCESS_INFORMATION pi; ZeroMemory(&pi, si......
内存数据转存成文件SaveBuffToFile
需要引入头文件这样通过多字节和UNICODE支持多语言编码编程。BOOL SaveBuffToFile(PCHAR pFileName, PVOID pBuff, ULONG len){ FILE* fp = NULL; fopen_s(&f......
使用CR3切换实现读取指定进程内存数据
首先CR3是什么,CR3是一个寄存器,该寄存器内保存有页目录表物理地址(PDBR地址),其实CR3内部存放的就是页目录表的内存基地址,运用CR3切换可实现对特定进程内存地址的强制读写操作,此类读写属于有痕读写,多数驱动保护都会将这个地址改为无效,此时CR3读写就失效了,当然如果能找到CR3的正确地址......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!