使用Blackbone读取进程内存

Read Process Memory using Blackbone?

本文关键字:内存 取进程 读取 Blackbone 使用      更新时间:2023-10-16

Blackbone位于此处:

https://github.com/DarthTon/Blackbone

现在我想尝试实现的是使用前面提到的库读取进程内存。

我已经使用模式扫描方法来获取内存中的地址,稍后将在读取过程中使用,但是我对是否应该如何读取存储在读取方法使用的输出缓冲区中的数据有点卡住。

Read方法的结构如下:

https://github.com/DarthTon/Blackbone/blob/master/src/BlackBone/Process/ProcessMemory.h L57

我完全遵循了patternscan示例中所采用的方法:

https://github.com/DarthTon/Blackbone/blob/master/src/TestApp/PatternTest.cpp

只是有一点差别:

void FindKeys()
{
Process p;
std::vector<DWORD> procs;
std::vector<ptr_t> results;
ptr_t   dwAddress;
size_t  dwSize;
PVOID   pResult;
bool    handleHoles = true;
Process::EnumByName(L"Notepad++.exe", procs);
if (!procs.empty())
{
    p.Attach(procs.front());
    auto pMainMod = p.modules().GetMainModule();
    // Initialize patterns
    PatternSearch ps1{ 0x33, 0xC5, 0x89 };
    // Scan all allocated process memory
    std::wcout << L"[+] Searching for Pattern Scan...n";
    ps1.SearchRemoteWhole(p, false, 0, results);
    std::wcout << L"[+] Found at Address: [0x";
    std::wcout << std::hex << results[0];
    std::wcout << L"]!n";
    dwAddress = results[0];
    dwSize = 0x10;
    p.memory().Read(dwAddress, dwSize, pResult, handleHoles);
    results.clear();
}
else
    std::wcout << L"Can't find Notepad++.exe, abortingnn";
}

我的问题来自于未能读取pResult,我如何能够成功地从中读取,具体来说,我想将其作为字节数组读取。

提前感谢你们为我提供的任何进一步的帮助,我将不胜感激!

好了,伙计们,就是这样,相当简单!我把自己复杂化了。

我所做的是创建另一个名为pResultBytes的变量类型BYTE (unsigned char byte),然后使用memcpy(&pResultBytes, pResult, dwSize);,其中pResultRead()方法的输出缓冲区,dwSize是要复制到新变量的字节数。

接下来,我开始逐个字节地迭代pResultBytes变量,并进行相对转换以生成十六进制字符串并最终读取它。

哎呀,不得不提一下,我也将pResult初始化为new UCHAR[dwSize];,所以它最终有memcpy所需的适当空间。

就是这样!

干杯!