Як сканувати пам’ять процесу за допомогою C++?

Перевірка пам'яті цільового exe файлу є досить простою за допомогою C++.

Спочатку зчитайте пам'ять з цільового процесу

std::vector<uint8_t> buffer;  
buffer.resize(mbi.RegionSize);  

SIZE_T bytesRead = 0;  
if (ReadProcessMemory(hProcess, mbi.BaseAddress, buffer.data(), mbi.RegionSize, &bytesRead)) {  
 // Пам'ять успішно зчитано  
} else {  
 // Обробка помилки читання  
 DWORD error = GetLastError();  
 // Обробка коду помилки за потреби  
}

Тепер шукаємо конкретну послідовність байт

Після того, як ви зчитали регіон пам'яті в буфер, можна шукати конкретну послідовність байт. Це може бути певна структура даних, рядок або магічне число в цільовому процесі.

// Визначте шаблон байтів, який ви шукаєте  
std::vector<uint8_t> pattern = { 0xDE, 0xAD, 0xBE, 0xEF };  

// Функція для пошуку шаблону в буфері  
void SearchPattern(const std::vector<uint8_t>& buffer, const std::vector<uint8_t>& pattern, uintptr_t baseAddress) {  
 for (size_t i = 0; i <= buffer.size() - pattern.size(); ++i) {  
 if (std::equal(pattern.begin(), pattern.end(), buffer.begin() + i)) {  
 // Шаблон знайдено  
 uintptr_t foundAddress = baseAddress + i;  
 printf("Шаблон знайдено за адресою пам'яті: 0x%p\n", (void*)foundAddress);  
 }  
 }  
}  

// Викликаємо функцію пошуку  
SearchPattern(buffer, pattern, reinterpret_cast<uintptr_t>(mbi.BaseAddress));

Використання стандартних алгоритмів:

Як альтернатива, можна використати std::search з бібліотеки стандартних шаблонів C++:

auto it = std::search(buffer.begin(), buffer.end(), pattern.begin(), pattern.end());  

while (it != buffer.end()) {  
 size_t index = std::distance(buffer.begin(), it);  
 uintptr_t foundAddress = reinterpret_cast<uintptr_t>(mbi.BaseAddress) + index;  
 printf("Шаблон знайдено за адресою пам'яті: 0x%p\n", (void*)foundAddress);  

 // Переміщуємо ітератор вперед, щоб продовжити пошук  
 it = std::search(it + 1, buffer.end(), pattern.begin(), pattern.end());  
}

І ось і все! Пам'ятайте, що 32-бітний процес не може надійно зчитувати пам'ять 64-бітного процесу. Якщо вам потрібно працювати з 64-бітним процесом, ви повинні компілювати ваш інструмент в 64-бітному режимі.

Перекладено з: How to scan process memory with C++?

Leave a Reply

Your email address will not be published. Required fields are marked *