Не удается найти массив байтов, совпадающий с памятью другого процесса
В настоящее время я пытаюсь проверить, работает ли код, который я написал, используя его в качестве ссылки. Мне удалось заставить его работать без сбоев, но как только я начал проверять, действительно ли код выполняет то, что я хочу, я столкнулся с проблемой.
Хотя я думаю, что код проходит через все области памяти, принадлежащие процессу, который я пытаюсь найти, возможно, он этого не делает?
Я, честно говоря, не уверен, в чем здесь проблема, я неправильно ищу свой массив байтов в буфере памяти или я действительно читаю не ту память?
При проверке, находит ли мой код массив байтов, совпадающий с процессом, я использовал чит-движок для предварительного сканирования, а затем сравнивал результаты с результатами, которые вернула моя программа. Я использовал массив байтов, из которого я знал заранее, что он всегда будет хотя бы один раз в сканируемой программе.
Теперь сравнивая результаты, которые я получил от чит-движка:
И те, что я получил из моей программы, что 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;
}
}
}
Любые предложения о других способах реализации того, что я пытаюсь сделать, более чем приветствуются.
1 ответ
Благодаря комментарию, оставленному Джонатаном, он фактически сравнивал значения ASCII вместо реальных шестнадцатеричных значений.
Код работает сейчас: https://s tackru.com/images/68bec63f95cc9ba3d6a8dc4825e324088ac624db.png
Изменение, которое я сделал в своем коде (получил его отсюда):
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);
}
//...