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

Внешний сканер байтов (c++)


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

Добрый день.

После о-о-очень длительного отсутствия я наконец-таки собрал комп! Пока что без видеокарты, сижу на встроенке hd 4600. На ней идет только перывый AS на минималках.

Итак, захотелось быть бессмертным. Нашел адрес здоровья (благо, он без шифрования и в 4 byte) и адресом жизни игрока занимается одна лишь инструкция, которая легко убивается.

Захотелось написать трейнер. Внешний. У кого есть исходник внешнего сканера сигнатур? Поиск процесса, запись - имеется, не хватает только поиска байтов.

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

Что значит внешний?

нужна теория...

есть два вида хуков: внешние (создание собственного процесса, окна\консоли и из своего адресного пространства ты хукаешь игру) и внутренний (.dll файл инжектишь в процесс и дллка хукает игру).

.dll файл эффективен, но он более геморный в плане использования. Хочу сделать внешний трейнер, чтобы из своего процесса хукать чужой. Такое возможно, инфа 168%

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

си шарп. Как перенести это на с++ ?

Так он там ничего сверхъествественного не использует, перенести в два счёта можно.

Разве что типы поменять и в цикле пробел поставить  :-D

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

Так он там ничего сверхъествественного не использует, перенести в два счёта можно.

Разве что типы поменять и в цикле пробел поставить  :-D

Сможешь обработать и сюда скинуть?

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

Сможешь обработать и сюда скинуть?

Делать мне нечего, могу помочь если возникнут вопросы по конкретным вещам.

Вот кстати урок от кодера про сканеры сигнатур (на плюсах)

P.S. всё уже давно сделано за тебя, знай себе копипасти :-D

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

Делать мне нечего, могу помочь если возникнут вопросы по конкретным вещам.

Вот кстати урок от кодера про сканеры сигнатур (на плюсах)

P.S. всё уже давно сделано за тебя, знай себе копипасти :-D

Я и хочу копипастить! Урок этот от кодера, там приводится пример внутреннего хука. А мне нужен внешний...

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

скопируй блок в котором ехе из проц. игры в трейнер и сканируй, так быстрее.. потом -база +база проц. игры = адрес

ps в длл варианте легче в сотни раз чем в ехе при правильной планировке xD

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

скопируй блок в котором ехе из проц. игры в трейнер и сканируй, так быстрее.. потом -база +база проц. игры = адрес

ps в длл варианте легче в сотни раз чем в ехе при правильной планировке xD

длл геморно инжектить и следить за инжектом

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

длл геморно инжектить и следить за инжектом

даааа ладно. зацени: http://forum.gamehacklab.ru/topic/3648-need-for-speed-rivals-tablitca-trejner/#entry27837

посмотри на нее в CFFExplorer и в дебагере. она сама себя инжектит через виндовую фичу

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

даааа ладно. зацени: http://forum.gamehacklab.ru/topic/3648-need-for-speed-rivals-tablitca-trejner/#entry27837

посмотри на нее в CFFExplorer и в дебагере. она сама себя инжектит через виндовую фичу

че-че?

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

 

Вот, из урока Coderа, нахождение адреса по сигнатуре

 

DWORD start_adress,  - базовый адрес модуля

DWORD length, - размер модуля

BYTE * pattern, - сигнатура "\xFF\xFF\x86"

char * mask - маска "x?xx"

 

 

Надеюсь поможет :):-P

	DWORD FindePatern(DWORD start_adress, DWORD length, BYTE * pattern, char * mask)	{		BYTE* bytebuffer = new BYTE[length];		HANDLE proc_handle = OpenProcess(PROCESS_ALL_ACCESS, false, pID);		ReadProcessMemory(proc_handle,(LPCVOID)start_adress, bytebuffer, length, NULL);		for (DWORD i = 0; i < length; i++)		if (DataCompare((bytebuffer + i), pattern, mask))		{			CloseHandle(proc_handle);			delete[] bytebuffer;			return (DWORD)(start_adress + i);		}		delete[] bytebuffer;		CloseHandle(proc_handle);		return NULL;	}	bool DataCompare(const BYTE* pData, const BYTE* pattern, const char* mask)	{		for (; *mask; ++mask, ++pattern, ++pData)		if (*mask == 'x' && *pData != *pattern)			return false;		return true;	}
Изменено пользователем elvis66666
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

DWORD   cExMemory::FindSignature(DWORD base, DWORD size, byte* sign, char* mask)

{

MEMORY_BASIC_INFORMATION mbi = { 0 };

DWORD offset = 0;

while (offset < size)

{

VirtualQueryEx(this->pHandle, (LPCVOID)(base + offset), &mbi, sizeof(MEMORY_BASIC_INFORMATION));

if (mbi.State != MEM_FREE)

{

byte* buffer = new byte[mbi.RegionSize];

ReadProcessMemory(this->pHandle, mbi.BaseAddress, buffer, mbi.RegionSize, NULL);

for (size_t i = 0; i < mbi.RegionSize; i++)

{

if (DataCompare(buffer + i, sign, mask))

{

delete[] buffer;

return (DWORD)mbi.BaseAddress + i;

}

}

delete[] buffer;

}

offset += mbi.RegionSize;

}

return 0;

}

bool cExMemory::DataCompare(byte* data, byte* sign, char* mask)

{

for (; *mask; mask++, sign++, data++)

{

if (*mask == 'x' && *data != *sign)

return false;

}

return true;

}

this->pHandle - передаешь хендл нужного процесса

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

DWORD   cExMemory::FindSignature(DWORD base, DWORD size, byte* sign, char* mask){	MEMORY_BASIC_INFORMATION mbi = { 0 };	DWORD offset = 0;	while (offset < size)	{		VirtualQueryEx(this->pHandle, (LPCVOID)(base + offset), &mbi, sizeof(MEMORY_BASIC_INFORMATION));		if (mbi.State != MEM_FREE)		{			byte* buffer = new byte[mbi.RegionSize];			ReadProcessMemory(this->pHandle, mbi.BaseAddress, buffer, mbi.RegionSize, NULL);			for (size_t i = 0; i < mbi.RegionSize; i++)			{				if (DataCompare(buffer + i, sign, mask))				{					delete[] buffer;					return (DWORD)mbi.BaseAddress + i;				}			}			delete[] buffer;		}		offset += mbi.RegionSize;	}	return 0;}bool  cExMemory::DataCompare(byte* data, byte* sign, char* mask){	for (; *mask; mask++, sign++, data++)	{		if (*mask == 'x' && *data != *sign)			return false;	}	return true;}
this->pHandle - передаешь хендл нужного процесса

Ооо, Крайслер? Не ожидал увидеть тебя тут) 

Спасибо за инфу)

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

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

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

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