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

Странный адрес возврата


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

Ставлю джамп по адресу на свою функцию с помощью велосипеда

Скрытый текст

void Hook::JMP(DWORD* dwaddress, DWORD* dwyouraddress, DWORD dwlen)
{
	DWORD dwOldProtect;
	DWORD dwRealAddie = (DWORD)dwyouraddress - (DWORD)dwaddress  - 5;
	VirtualProtect((void*)dwaddress, dwlen, PAGE_EXECUTE_READWRITE, &dwOldProtect);

	BYTE* pAddie = (BYTE*)dwaddress;
	*pAddie = 0xE9;
	pAddie++;
	dwaddress = (DWORD*)pAddie;
	*dwaddress = dwRealAddie;

	for(DWORD i = 0x4; i < dwlen; i++)
		*(pAddie + i) = 0x90;

	VirtualProtect((void*)dwaddress, dwlen, dwOldProtect, NULL);
}

 

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

Скрытый текст

image.png

 

То есть, по окончанию отработки хука, оригинальная функция вызывается откуда то из CallNextHookEx.

Вопрос, почему так, и можно ли от этого как то избавится?

Что я делаю, я ставлю бряк на функцию, вызываю ее из игры, и получаю один адрес возврата, а если ставлю бряк на оригинальную функцию, и вызываю ее из своей длл, то получаю этот адрес что ведет на CallNextHookEx, но по идее, он же должен указывать на мою функцию, из которой я вызываю оригинал ?

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

Мне пока рановато писать что-либо в теме "Высокоуровневое программирование", но мне кажется тут попахивает не нажатым стопом. Хипхо, кстати, на стримах часто грешит)

Скрытый текст

L7QRJlz.jpg

Нашел инструкцию - останови отладчик. До надписи Close.

Скрытый текст

CxooaZO.jpg


Баг 2:
Однажды я так же долго не мог найти сигнатуру свою. Т.к во время бряка 2-два первых байта из сигнатуры, съедаются, заменяются, резервируются. Я уж хз.

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

11 час назад, vagingameh сказал:

Мне пока рановато писать что-либо в теме "Высокоуровневое программирование", но мне кажется тут попахивает не нажатым стопом. Хипхо, кстати, на стримах часто грешит)

Мне все равно на мою структуру - работает и хорошо :) А вот защите не нравится этот адрес

Точнее, я могу найти свою структуру, она находится немного дальше, но этот адрес мне надо как то убрать 

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

2 часа назад, DaVilka сказал:

Вопрос, почему так, и можно ли от этого как то избавится?

Решение — переписать windows.

Достаточно зайти в документацию и прочитать о ней, просто у тебя сама игра скорее всего использует функцию.

 

Функция CallNextHookEx переправляет информацию о фильтре (hook)  в следующий фильтр (hook)  в текущей цепочке фильтров событий. Процедура фильтров (hook) может вызвать эту функцию или до или после обработки информации о фильтре (hook).

Фильтры (hook) устанавливаются в цепочки для конкретного типа hook-метода. Функция CallNextHookEx вызывает следующий фильтр (hook) в цепочке.

Вызов CallNextHookEx является дополнительным (необязательным), но он настоятельно рекомендуется; в противном случае, другие прикладные программы, которые установили фильтры (hook), не будут получать уведомления от этого фильтра и,  в результате, могут повести себя неправильно. Вам следует вызывать CallNextHookEx, исключая те случаи, когда Вам крайне необходимо предотвратить, чтобы уведомление было замечено другими прикладными программами.

 

В вкратце, если хук-процедура не вызывает CallNextHookEx, винда не вызывает хук-процедуры, установленные перед установкой данной хук-процедуры.

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

10 часов назад, kiwipapayamongoose сказал:

Решение — переписать windows.

Достаточно зайти в документацию и прочитать о ней, просто у тебя сама игра скорее всего использует функцию.

В вкратце, если хук-процедура не вызывает CallNextHookEx, винда не вызывает хук-процедуры, установленные перед установкой данной хук-процедуры.

не понял, я не вообще не юзаю CallNextHookEx, и стандартных виндовских хуков, я просто ставлю джамп на свою функцию, а из нее на оригинал Оо

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

Только что, DaVilka сказал:

не понял, я не вообще не юзаю CallNextHookEx, и стандартных виндовских хуков, я просто ставлю джамп на свою функцию, а из нее на оригинал Оо

Значит что-то системное, залазь в отладчик и пошагово разбирайся откуда берется этот CallNextHookEx.

У меня подобные мид-хуки без проблем возвращаются в оригинальную функцию по адресу возврата.

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

Только что, kiwipapayamongoose сказал:

Значит что-то системное, залазь в отладчик и пошагово разбирайся откуда берется этот CallNextHookEx.

У меня подобные мид-хуки без проблем возвращаются в оригинальную функцию по адресу возврата.

А может компилятор что то от себя добавлять?

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

2 минуты назад, kiwipapayamongoose сказал:

Если в debug компилируешь, то может.(но это не точно)

Еще вопрос, не по теме кншн но все же, если игра использует tcp соединение, может она как то слать пакеты на сервер мимо функции send от ws2_32.dll, не юзая драйверов? 

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

6 минут назад, DaVilka сказал:

Еще вопрос, не по теме кншн но все же, если игра использует tcp соединение, может она как то слать пакеты на сервер мимо функции send от ws2_32.dll, не юзая драйверов? 

да, в тех программах что я ковырял, чаще всего написаны отдельные модули которые выполняют тоже самое, что и функции, через которые идет работа с сокетами.

ну в общем, проблема не с кодом точно.

 

VirtualProtect(Address, length, PAGE_EXECUTE_READWRITE, &oldProt);
raddress = static_cast<DWORD>(jump_to - reinterpret_cast<DWORD>(Address)) - 5; 
*Address = 0xE9; *reinterpret_cast<DWORD*>(Address + 0x1) = raddress;
for(DWORD x = 0x5; x < length; ++x)	*(Address + x) = 0x90;
VirtualProtect(Address, length, oldProt, &backup);
Изменено пользователем kiwipapayamongoose
Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, kiwipapayamongoose сказал:

да, в тех программах что я ковырял, чаще всего написаны отдельные модули которые выполняют тоже самое, что и функции, через которые идет работа с сокетами.

ну в общем, проблема не с кодом точно.

Ок, спасибо за инфу, выяснил что отправляются пакеты через WSAsend(если я правильно понял)

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

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

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

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