Перевірка пам'яті цільового 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++?