Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 11.01.2016, 12:15   #1
Новичок
 
Регистрация: 11.01.2016
Сообщений: 2
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
Botter100 пока неопределено
Печаль

Посоны привет! Я тут это все читаю, чето все всё перехватывают. А я понять не могу - это все делается на клиенте с откусанной темидой и ГГ или прям со всем этим добром? Я просто пытаюсь делать хук и у меня крэшится. Причем крэшится не доходя до моего кода, но и не сразу, а только там где я залез своми грязнуми руками в енжин.длл.

Моя первая цель - вызвать MessageBox при вызове OnNpcHtmlMessage

Вот тут хукаю

Код:
bool Entry()
{
	HMODULE hEngine = GetModuleHandle(L"Engine.dll");

	if (hEngine == INVALID_HANDLE_VALUE)
		MessageBox(HWND_DESKTOP, L"Can't get module handle.", L"Error", MB_OK | MB_ICONERROR);

	char* addr = (char*)GetProcAddress(hEngine, "?OnNpcHtmlMessage@UGameEngine@@UAEHPAUUser@@PA_WHH@Z");

	if (!addr)
		MessageBox(HWND_DESKTOP, L"Can't get proc address.", L"Error", MB_OK | MB_ICONERROR);

	DWORD protection;
	DWORD ff = (DWORD)UGameEngine__OnNpcHtmlMessage;

	Log::putstring(L"dump_UGameEngine__OnNpcHtmlMessage.txt", L"UGameEngine__OnNpcHtmlMessage = 0x%0X\n", ff);
	Log::putstring(L"dump_UGameEngine__OnNpcHtmlMessage.txt", L"UGameEngine::OnNpcHtmlMessage = 0x%0X\n", (DWORD)addr);

	//VirtualProtect(addr, 5, PAGE_EXECUTE_READWRITE, &protection);
	*addr = char(0xE9);	// op code
	memcpy(addr + 1, &ff, 4);
	//VirtualProtect(addr, 5, protection, 0);

	HANDLE hDumpFile = CreateFile(L"dump.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);

	DWORD bytesWritten = 0;
	WriteFile(hDumpFile, addr, 200, &bytesWritten, NULL);
	CloseHandle(hDumpFile);


	MessageBox(HWND_DESKTOP, L"I am in...", L"Yop", MB_OK);

	return true;
}
тут я просто инжеклю jmp на мою функцию представленую ниже

Код:
__declspec(naked) void UGameEngine__OnNpcHtmlMessage()
{
	MessageBox(HWND_DESKTOP, L"Called 'UGameEngine__OnNpcHtmlMessage'", L"Yop", MB_OK);
}
Это все делается под геймгуардом и с темидой, не знаю влияет ли это как то. Просто бот л2тавер показывает что это возможно. Подсобите че не так делаю? Спасибо.
Botter100 вне форума   Ответить с цитированием
Старый 11.01.2016, 12:57   #2
Новичок
 
Аватар для Barsik
 
Регистрация: 18.12.2008
Сообщений: 7
Сказал Спасибо: 0
Имеет 1 спасибку в 1 сообщении
Barsik пока неопределено
По умолчанию

Цитата:
Сообщение от Botter100 Посмотреть сообщение
__declspec(naked) void UGameEngine__OnNpcHtmlMessage()
Твоя функция подмены должна быть по параметрам и возвращаемому значению идентична оригинальной функции. Вот так этот метод класса выглядит:
int __thiscall UGameEngine::OnNpcHtmlMessage(UGameEngine *this, struct User *, wchar_t *, int)
Barsik вне форума   Ответить с цитированием
Старый 11.01.2016, 13:02   #3
Новичок
 
Регистрация: 11.01.2016
Сообщений: 2
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
Botter100 пока неопределено
По умолчанию

Цитата:
Сообщение от Barsik Посмотреть сообщение
Твоя функция подмены должна быть по параметрам и возвращаемому значению идентична оригинальной функции. Вот так этот метод класса выглядит:
int __thiscall UGameEngine::OnNpcHtmlMessage(UGameEngine *this, struct User *, wchar_t *, int)
Это понятно, если я хочу жить после всего этого. Но щас для меня цель отобразить мессадж бокс и гори оно синим пламенем. Ведь должно же по логике проканать. Мне не надо сохранять стэк и прочее ведь? По сути че происходит - вызывается функция из енжин длл OnNpcHtmlMessage а там вместо ее кода уже мой тупо jmp а по этому жмп тупо call MessageBox.

я не переписываю адрес функции в таблице, я хукаюсь внутрь самой функции и мне в принципе пофигу на параметры.
Botter100 вне форума   Ответить с цитированием
Старый 11.01.2016, 14:08   #4
Новичок
 
Аватар для Barsik
 
Регистрация: 18.12.2008
Сообщений: 7
Сказал Спасибо: 0
Имеет 1 спасибку в 1 сообщении
Barsik пока неопределено
По умолчанию

memcpy(addr + 1, &ff, 4); неверно, так как нужно пересчитать относительное смещение т.е.
вместо &ff UGameEngine__OnNpcHtmlMessage - addr - 5;

с GG не пробовал хукать, возможно он палит, попробуй хукнуть не на первом байте а дальше, глянь что в отладчике переписывается ли джамп

Последний раз редактировалось Barsik, 11.01.2016 в 15:18.
Barsik вне форума   Ответить с цитированием
Старый 13.01.2016, 09:37   #5
Новичок
 
Аватар для Barsik
 
Регистрация: 18.12.2008
Сообщений: 7
Сказал Спасибо: 0
Имеет 1 спасибку в 1 сообщении
Barsik пока неопределено
По умолчанию

Цитата:
Сообщение от Barsik Посмотреть сообщение
memcpy(addr + 1, &ff, 4); неверно, так как нужно пересчитать относительное смещение т.е.
вместо &ff UGameEngine__OnNpcHtmlMessage - addr - 5;
вот расчет относительного смещения
========================
в отладчике после jmp виден адрес готового перехода который на самом деле вычесляется
Оффтоп
вот кусок кода правда не мой но как пример подойдет :Оффтоп

Последний раз редактировалось Barsik, 13.01.2016 в 10:10.
Barsik вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 06:20.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!