Гость koul Опубликовано 18 марта, 2020 Поделиться Опубликовано 18 марта, 2020 Всем привет! Недавно я посмотрел видеоуроки GameHackLab[RU] и дошёл до поиска ячейки памяти по сигнатуре и маске. Использовал утилиты: Cheat Engine 7.0, OllyDbf и x64dbg. Проблема вся в том, что он просто отказывается находить эту ячейку. Вот вызываю метод ScanSignature() : addr = pm.ScanSignature(0, sign, 0x7FFFFFF, msk); wsprintf(text, L"Сигнатура найдена по адресу: %X", addr); И передаётся это всё сюда: Спойлер DWORD64 ProcessManager::ScanSignature(DWORD64 BaseAddress, byte* Signature, DWORD64 ScanSize, char* mask) { MEMORY_BASIC_INFORMATION mbi = { 0 }; int offset = 0; byte *buffer; HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, m_PID); while (offset < ScanSize) { VirtualQueryEx(hProcess, (LPVOID)(BaseAddress + offset), &mbi, sizeof(MEMORY_BASIC_INFORMATION)); if (mbi.State != MEM_FREE) { buffer = new byte[mbi.RegionSize]; ReadMemory((DWORD64)mbi.BaseAddress, buffer, mbi.RegionSize); for (int i = 0; i < mbi.RegionSize; i++) { if (TestSignature(buffer + i, Signature, mask)) { CloseHandle(hProcess); delete (buffer); return (DWORD64)mbi.BaseAddress + i; } } delete (buffer); } offset += mbi.RegionSize; } CloseHandle(hProcess); return 0; } TestSignature(): Спойлер BOOL ProcessManager::TestSignature(byte* Buffer, byte* Signature, char* mask) { while (*mask) { if (*mask == '?') { mask++; Signature++; Buffer++; continue; } if (*Buffer++ != *Signature++) return false; } return true; } Сигнатура и маска: byte sign[] = {0x55, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00}; char msk[] = "xxxxxxxxxx"; OpenProcess(), ReadMemory() и WriteMemory() работают правильно Если нужен весь сурс - пишите, но я не думаю, что там где-то есть ошибка, потому что всё, кроме "сигнатуры" работает отлично. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 19 марта, 2020 Поделиться Опубликовано 19 марта, 2020 20 часов назад, koul сказал: addr = pm.ScanSignature(0, sign, 0x7FFFFFF, msk); В первый параметр нужно передавать не 0, а базовый адрес модуля, в этом может быть ошибка. И покажи, как у тебя объявлена сигнатура и маска. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость koul Опубликовано 19 марта, 2020 Поделиться Опубликовано 19 марта, 2020 (изменено) 1 час назад, Xipho сказал: В первый параметр нужно передавать не 0, а базовый адрес модуля, в этом может быть ошибка. Просто вы, когда писали код (на уроке), было 0 и всё работало:) Дело всё в том, что когда я пишу заместо 0 сам базовый адрес и длину (беру из ollydbg), то всё равно не работает. И тогда ещё такой вопрос: как программно узнать модуль, в котором находится ячейка памяти, чтобы постоянно не вбивать вручную. 1 час назад, Xipho сказал: И покажи, как у тебя объявлена сигнатура и маска. Я написал выше, над картинкой Вот весь код заголовка с сигнатурой и маской: Спойлер #pragma once #include "resource.h" #include "ProcessManager.h" #include "Windows.h" #define WW 640 #define WH 400 const wchar_t ClassName[] = L"SuperMegaTrainerEngine"; const wchar_t WindowName[] = L"Наш трейнер"; const wchar_t ProcName[] = L"notepad.exe"; //const wchar_t ProcWindowName[] = L"Безымянный"; ProcessManager pm; LRESULT WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); HWND MainWindowHandle = 0; WNDCLASSEX wc = { 0 }; BYTE arr[100]; byte sign[] = {0x55, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00}; char msk[] = "xxxxxxxxxx"; Изменено 19 марта, 2020 пользователем koul Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 19 марта, 2020 Поделиться Опубликовано 19 марта, 2020 Вообще странно. Должно работать. А попробуй студию от имени админа запусти. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость koul Опубликовано 19 марта, 2020 Поделиться Опубликовано 19 марта, 2020 50 минут назад, Xipho сказал: Вообще странно. Должно работать. А попробуй студию от имени админа запусти. Не работает:C Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 20 марта, 2020 Поделиться Опубликовано 20 марта, 2020 Скорее всего, что-то ты делаешь не так, к сожалению. Но что именно, пока понять не могу. Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 20 марта, 2020 Поделиться Опубликовано 20 марта, 2020 (изменено) В 18.03.2020 в 17:16, koul сказал: TestSignature(): Спойлер while (*mask) { if (*mask == '?') { mask++; Signature++; Buffer++; continue; } if (*Buffer++ != *Signature++) return false; } return true; А разве этот цикл не будет бесконечно выполняться?, я не вижу что бы тут совпадало условие на '?' хоть раз, хотя может я что то не вижу ? А всё я нашла, тогда не знаю что не так. Изменено 20 марта, 2020 пользователем imaginary Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения