我目前正在尝试验证我使用this作为参考编写的代码是否有效。我已经设法使其运行起来而不会崩溃,但是一旦我开始检查代码是否确实执行了我想要的操作,就会遇到问题。
虽然我认为代码遍历了我要搜索的进程的所有内存区域,但可能不是那样吗?
老实说,我不确定问题出在哪里,是我在内存缓冲区中错误地搜索了字节数组,还是我实际上读取了错误的内存?
在检查我的代码是否从进程中找到一个字节数组匹配时,我使用了作弊引擎进行了事先扫描,然后将结果与程序返回的结果进行了比较。我使用了一个事先知道的字节数组,该字节数组在我正在扫描的程序中将至少存在一次。
从程序中得到的结果为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;
}
}
}
这是实现我想要做的其他方式的任何建议都超过欢迎。
答案 0 :(得分:0)
由于乔纳森(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);
}
//...