无法从另一个进程的内存中找到匹配的字节数组
Can't find an array of bytes match from another process' memory
我目前正在尝试验证我使用 作为参考编写的代码是否有效。我已经设法在不崩溃的情况下将其设置为 运行,但是一旦我开始检查代码是否确实按照我的要求执行,我 运行 就遇到了问题。
虽然我认为代码遍历了属于我正在尝试搜索的进程的所有内存区域,但它可能并没有这样做?
老实说,我不确定问题出在哪里,是我在内存缓冲区中错误地搜索了我的字节数组,还是我实际上读取了错误的内存?
在检查我的代码是否从进程中找到匹配的字节数组时,我使用作弊引擎预先扫描,然后将结果与我的程序返回的结果进行比较。我使用了一个我事先知道的字节数组,在我正在扫描的程序中总是至少存在一次。
现在比较我从作弊引擎得到的结果:
还有我从我的程序中得到的结果,即 0 个结果。好像不太对。
我用以下标志打开我想从中读取内存的进程:
PROCESS_VM_READ | PROCESS_QUERY_INFORMATION
以及我调用模式匹配函数的方式:
testy.patternMatch("000000000000000001000000000000001CC80600");
至于我现在的代码:
我正在调用的函数(m_localprocess是我事先得到的进程的打开句柄)
void process_wrapper::patternMatch(std::string pattern)
{
MEMORY_BASIC_INFORMATION sys_info;
std::vector<char> pattern_conv(pattern.begin(), pattern.end());
for (unsigned char * pointer = NULL;
VirtualQueryEx(m_localprocess, pointer, &sys_info, sizeof(sys_info)) == sizeof(sys_info);
pointer += sys_info.RegionSize) {
std::vector<char> mem_buffer;
if (sys_info.State == MEM_COMMIT && (sys_info.Type == MEM_MAPPED || sys_info.Type == MEM_PRIVATE)) {
SIZE_T bytes_read;
mem_buffer.resize(sys_info.RegionSize);
ReadProcessMemory(m_localprocess, pointer, &mem_buffer[0], sys_info.RegionSize, &bytes_read);
if (GetLastError() != 0) {
std::cout << "Error: " << GetLastError();
SetLastError(0);
}
mem_buffer.resize(bytes_read);
std::cout << "\nSize: "<< mem_buffer.size() << "\n";
if (mem_buffer.size() != 0) {
find_all(mem_buffer.begin(), mem_buffer.end(), pattern_conv.begin(), pattern_conv.end(), pointer);
}
}
}
std::cout << "Results: " << results.size() << "\n";
for (void* x : results) {
std::cout << x << "\n";
}
}
并且这个函数调用了find_all函数,看起来像这样:
void find_all(std::vector<char>::iterator beg, std::vector<char>::iterator end,
std::vector<char>::iterator beg_pattern, std::vector<char>::iterator end_pattern,
const unsigned char * baseAddr) {
std::vector<char>::iterator walk = beg;
while (walk != end) {
walk = std::search(walk, end, beg_pattern, end_pattern);
if (walk != end) {
std::cout << (void*)(baseAddr + (walk - beg)) << "\n";
results.emplace_back((void*)(baseAddr + (walk - beg)));
++walk;
}
}
}
我们非常欢迎任何关于实现我正在尝试做的事情的其他方式的建议。
感谢 Jonathan 留下的评论指出我实际上是在比较 ASCII 值而不是实际的十六进制值。
代码现在可以工作了:
我对代码所做的更改(从 here 获取):
void process_wrapper::patternMatch(std::string patternOrig)
{
MEMORY_BASIC_INFORMATION sys_info;
int len = patternOrig.length();
std::string pattern;
for (int i = 0; i < len; i += 2)
{
std::string byte = patternOrig.substr(i, 2);
char chr = (char)(int)strtol(byte.c_str(), NULL, 16);
pattern.push_back(chr);
}
//...
我目前正在尝试验证我使用
虽然我认为代码遍历了属于我正在尝试搜索的进程的所有内存区域,但它可能并没有这样做?
老实说,我不确定问题出在哪里,是我在内存缓冲区中错误地搜索了我的字节数组,还是我实际上读取了错误的内存?
在检查我的代码是否从进程中找到匹配的字节数组时,我使用作弊引擎预先扫描,然后将结果与我的程序返回的结果进行比较。我使用了一个我事先知道的字节数组,在我正在扫描的程序中总是至少存在一次。
现在比较我从作弊引擎得到的结果:
还有我从我的程序中得到的结果,即 0 个结果。好像不太对。
我用以下标志打开我想从中读取内存的进程:
PROCESS_VM_READ | PROCESS_QUERY_INFORMATION
以及我调用模式匹配函数的方式:
testy.patternMatch("000000000000000001000000000000001CC80600");
至于我现在的代码:
我正在调用的函数(m_localprocess是我事先得到的进程的打开句柄)
void process_wrapper::patternMatch(std::string pattern)
{
MEMORY_BASIC_INFORMATION sys_info;
std::vector<char> pattern_conv(pattern.begin(), pattern.end());
for (unsigned char * pointer = NULL;
VirtualQueryEx(m_localprocess, pointer, &sys_info, sizeof(sys_info)) == sizeof(sys_info);
pointer += sys_info.RegionSize) {
std::vector<char> mem_buffer;
if (sys_info.State == MEM_COMMIT && (sys_info.Type == MEM_MAPPED || sys_info.Type == MEM_PRIVATE)) {
SIZE_T bytes_read;
mem_buffer.resize(sys_info.RegionSize);
ReadProcessMemory(m_localprocess, pointer, &mem_buffer[0], sys_info.RegionSize, &bytes_read);
if (GetLastError() != 0) {
std::cout << "Error: " << GetLastError();
SetLastError(0);
}
mem_buffer.resize(bytes_read);
std::cout << "\nSize: "<< mem_buffer.size() << "\n";
if (mem_buffer.size() != 0) {
find_all(mem_buffer.begin(), mem_buffer.end(), pattern_conv.begin(), pattern_conv.end(), pointer);
}
}
}
std::cout << "Results: " << results.size() << "\n";
for (void* x : results) {
std::cout << x << "\n";
}
}
并且这个函数调用了find_all函数,看起来像这样:
void find_all(std::vector<char>::iterator beg, std::vector<char>::iterator end,
std::vector<char>::iterator beg_pattern, std::vector<char>::iterator end_pattern,
const unsigned char * baseAddr) {
std::vector<char>::iterator walk = beg;
while (walk != end) {
walk = std::search(walk, end, beg_pattern, end_pattern);
if (walk != end) {
std::cout << (void*)(baseAddr + (walk - beg)) << "\n";
results.emplace_back((void*)(baseAddr + (walk - beg)));
++walk;
}
}
}
我们非常欢迎任何关于实现我正在尝试做的事情的其他方式的建议。
感谢 Jonathan 留下的评论指出我实际上是在比较 ASCII 值而不是实际的十六进制值。
代码现在可以工作了:
我对代码所做的更改(从 here 获取):
void process_wrapper::patternMatch(std::string patternOrig)
{
MEMORY_BASIC_INFORMATION sys_info;
int len = patternOrig.length();
std::string pattern;
for (int i = 0; i < len; i += 2)
{
std::string byte = patternOrig.substr(i, 2);
char chr = (char)(int)strtol(byte.c_str(), NULL, 16);
pattern.push_back(chr);
}
//...