[C++] Правильный перехват функций (x86)
HTML-код
- Опубликовано: 2 окт 2024
- В данном видео уроке мы напишем простую библеотеку для перехваты вызовов функций на C++. Рассмотрим два метода перехватов функций:
1) Классический стандартный
2) Трамплинный (усовершенствованный классический)
Скачать дизассемблер: www.beaengine.o...
Track: DJ TooZoFF - August Vibes
В этом коде есть небольшая ошибка. Когда мы вызываем ChangeProtection() нам нужно передать размер totalLen, а не totalLen + delta.
Круто, но можно ли перехватывать функции не меняя исходный код?
По чем учил с++?(Какие книги читал?Какие уроки смотрел?)
Я так понимаю, что это можно использовать для перехвата функций других приложений?
Хотел ещё добавить, что если используете Debug-сборку и функции имеют косвенный переход через ILT, то необходимо добавить след. код в начало функции HookFunctionWithTrampoline():
if (origFuncPtr[0] == 0xE9)
{
// correct origFuncPtr because it's JMP
origFuncPtr = *((unsigned int*)(origFuncPtr + 1)) + origFuncPtr + 5;
}
Он вычисляет "правильный" адрес функции и позволяет не перезаписать следующий элемент в ILT.
Последний вариант никак не удается, то ли трамплин не возвращается, то ли еще что-то часа 4, наверное, за последним примером сидел, кошмар просто))
Быть может сохранился исходник, ибо у меня уже глаза замылились
Спасибо за видео, радует что можно найти хорошее обучающее видео на русском языке :) а можете подсказать что за музыка фоном играет? :-)
Хорошее видео. А можете сбросить ссылку на исходник?
Кодер сделай туториал по хукам функций виртуальных таблиц плиз ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
>BeaEngine.lib(BeaEngine.obj) : error LNK2019: ссылка на неразрешенный внешний символ _sprintf в функции _CopyFormattedNumber@20
Попробуй собрать BeaEngine.lib из исходников. Поиграй с параметрами BEA_USE_STDCALL/ исключить crt.lib (/NODEFAULTLIB)
Сегодня тоже самое делал )).
@ Dmitry K., вот только тут одна проблема - если в приложение которое хукаеться, имеется 2 MessageBox'a, то как разделить применение хука. Ибо если не разделять он будет заменять и первый и второй.
+se7dxs можешь дописать код, который будет определять откуда шел вызов, или по параметрам, которые передаются в MessageBox, либо подменяй сами вызовы MessageBox)
+Dmitry K. (Coder) Спасибо что ответил, я так понял код нужно дописывать в HookHelper, но я совсем не представляю что он из себя там должен представлять =), возможно ли где-то посмотреть примерную реализацию ? И еще 1 вопросик - как быть с классами которые представляют собой экспортируемую переменную, как обратиться по их виртуальнм классам что внутри, а точнее как указать что я хочу их перезаписать ? Т.е пример __declspec(dllimport) extern FManager* gManager; А FManager представляет собой класс с виртуальными функциями т.е
class __declspec(dllimport) FManager
{
public: virtual FArchive* CreateFileReader( const TCHAR* Filename, DWORD ReadFlags=0, FOutputDevice* Error=GNull )=0; } FArchive Это кастомный класс. Как обратиться к CreateFileReader, точнее как его перехватывать?
se7dxs загугли "интерфейсы в библиотеках на C++"
Не как не могу найти ничего дельного, может подкините чтонибудь дельное ?
+Dmitry K. (Coder) Дмитрий - возможно ли узнать ваши контакты, я мог бы скинуть вам $ за ваше время.
Спасибо за все твои уроки!Сейчас не много людей выпускают такие узкоспециализированные видео, а про некоторые темы даже статьей в интернете по-русски нет
статьи на русском? Забудь про программирование тогда, если не знаешь англ. Жесть
Даешь новые видио!!! Супер!!!
Про первый способ даже и не слышал, вторым пользовался всегда. Вы не можете подсказать какой-нибудь ассемблер тип AsmJit только чтобы можно инструкции уже в работающем приложении из текстовой строки компилировать и выполнять, т.е. так же, как это сделано в Cheat Engine?
Если мне не изменяет память, то там такого класса не существует (на всякий случай ознакомься с их API). Тебе нужно будет писать транслятор, который будет переводить текст в инструкции понятные самому asmjit. К пример тебе нужно будет строку mov eax,[edx+20] транслировать в asmjit.mov(eax, dword_ptr(edx, 0x20)); .
***** Ну это понятно, я думал, что может существующие есть уже библиотеки, чтобы не изобретать велосипед.
DarkoreXOR думаю стоит загуглить, может есть что-нибудь и готовое.
ссылка на дизассемблер не работает
github.com/BeaEngine/beaengine
Почему ты так помешался на unsigned char?! Нифига не пойму.