Перейти к содержанию

(С++) Поиск нужной ячейки памяти по сигнатуре


Рекомендуемые сообщения

Всем привет!

Недавно я посмотрел видеоуроки 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() работают правильно

 

1195aa4f7b87.png

 

Если нужен весь сурс - пишите, но я не думаю, что там где-то есть ошибка, потому что всё, кроме "сигнатуры" работает отлично.

 

Ссылка на комментарий
Поделиться на другие сайты

20 часов назад, koul сказал:

addr = pm.ScanSignature(0, sign, 0x7FFFFFF, msk);

В первый параметр нужно передавать не 0, а базовый адрес модуля, в этом может быть ошибка. И покажи, как у тебя объявлена сигнатура и маска.

Ссылка на комментарий
Поделиться на другие сайты

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";

 

 

Изменено пользователем koul
Ссылка на комментарий
Поделиться на другие сайты

В 18.03.2020 в 17:16, koul сказал:

TestSignature():

Спойлер

while (*mask)
	{
		if (*mask == '?')
		{
			mask++; 
			Signature++;
			Buffer++;
			continue;
		}
		if (*Buffer++ != *Signature++)
			return false;
	}
	return true;

А разве этот цикл не будет бесконечно выполняться?, я не вижу что бы тут совпадало условие на '?' хоть раз, хотя может я что то не вижу ?

А всё я нашла, тогда не знаю что не так.

 

 

 

 

Изменено пользователем imaginary
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.