使用 Blackbone 读取进程内存?
Read Process Memory using Blackbone?
Blackbone 位于此处:
现在我想尝试实现的是使用上述库读取进程内存。
我已经使用模式扫描方法在内存中获取了一个地址,稍后我将在读取过程中使用该地址,但是我对是否应该读取存储在输出缓冲区中的数据感到有点困惑读取方法正在使用。
读取方法的结构如下:
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, aborting\n\n";
}
我的问题来自未能读取 pResult,我如何才能成功读取它,具体来说,我想将其作为字节数组读取。
在此先感谢你们为我提供的任何进一步帮助,我们将不胜感激!
好的伙计们,就是这样,很简单!我把自己搞得太复杂了。
我所做的是创建另一个名为 pResultBytes
的变量类型 BYTE (unsigned char byte)
,然后使用 memcpy(&pResultBytes, pResult, dwSize);
,其中 pResult
是来自 Read()
的输出缓冲区方法和 dwSize
是要复制到新变量的字节数。
接下来我开始逐字节遍历 pResultBytes
变量并进行相对转换以生成十六进制字符串并最终读取它。
糟糕,不得不提一下,我也将 pResult
初始化为 new UCHAR[dwSize];
,因此它最终具有 memcpy
所需的正确 space。
就是这样!
干杯!
Blackbone 位于此处:
现在我想尝试实现的是使用上述库读取进程内存。
我已经使用模式扫描方法在内存中获取了一个地址,稍后我将在读取过程中使用该地址,但是我对是否应该读取存储在输出缓冲区中的数据感到有点困惑读取方法正在使用。
读取方法的结构如下:
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, aborting\n\n";
}
我的问题来自未能读取 pResult,我如何才能成功读取它,具体来说,我想将其作为字节数组读取。
在此先感谢你们为我提供的任何进一步帮助,我们将不胜感激!
好的伙计们,就是这样,很简单!我把自己搞得太复杂了。
我所做的是创建另一个名为 pResultBytes
的变量类型 BYTE (unsigned char byte)
,然后使用 memcpy(&pResultBytes, pResult, dwSize);
,其中 pResult
是来自 Read()
的输出缓冲区方法和 dwSize
是要复制到新变量的字节数。
接下来我开始逐字节遍历 pResultBytes
变量并进行相对转换以生成十六进制字符串并最终读取它。
糟糕,不得不提一下,我也将 pResult
初始化为 new UCHAR[dwSize];
,因此它最终具有 memcpy
所需的正确 space。
就是这样!
干杯!