使用Blackbone读取进程内存?

时间:2016-10-29 14:28:48

标签: c++ memory process

Blackbone位于:

  

https://github.com/DarthTon/Blackbone

现在我想要尝试实现的是使用上述库来读取进程内存。

我已经使用了模式扫描方法来获取内存中的一个地址,我稍后会在读取过程中使用该地址,但是我是否会因为如何读取存储在输出缓冲区中的数据而感到困惑read方法正在使用。

Read方法的结构如下:

  

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

我在以下提供的模式扫描示例中采用了完全相同的方法:

  

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, aborting\n\n";
}

我的问题来自于未能阅读pResult,我怎样才能成功读取它,具体来说,我想把它作为一个字节数组来读。

感谢您提供给我的任何进一步帮助,我们将非常感谢!

1 个答案:

答案 0 :(得分:2)

好吧,伙计们,这就是它,相当简单!我让自己变得复杂了。

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

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

Woops几乎要提及,我也将pResult初始化为new UCHAR[dwSize];,因此它最终具有memcpy所需的适当空间。

那就是它!

干杯!