|
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
|
|||||||||||||||||||||||||||||||
Выполнить перехват API вызова методом сплайсинга функции28.08.2016, 20:47. Показов 3354. Ответов 8
Метки нет (Все метки)
Общий!
![]() Как следует из названия темы, хочу выполнить перехват API вызова. Сделать это хочу методом сплайсинга функции. То есть перезаписать первые 5 байт функции на:
Как видно из опкодов, эти три инструкции занимают ровно 5 байт, а это именно то, что мне и нужно. Но есть проблема: Дело в том, что перехватываемая функция находится в .dll библиотеке kernel32.dll. И вызов происходит примерно следующим образом:
Подозреваю, что это как-то связано с тем, что вызываемая функция находится в DLL. По этой причине не получается передать управление оригинальной функции. То взять адрес оригинальной функции, прибавить к нему 5 байт, чтобы перепрыгнуть jmp, который мы наляпали поверх стекового фрейма. Кто сталкивался с этим? Какие есть решения? Я вижу только лобовое решение. Вычислить адрес начала функции, прибавив адрес, по которому расположена команда jmp с ее адресом + 5. И уже там перезаписывать, но не костыль ли это? А пока, по этой причине не удается вернуть управление в оригинальную функцию, и при попытке вызова блока памяти, в который я впихнул jmp, то есть на CloseHandle, но на самом деле я попадаю на другой jmp, который перезаписан ранее и ведет на функцию-перехватчик, поэтому и получается при вызове CloseHandle вызывается функция Hook, и рекурсивно вызывает сама себя. main.cpp
0
|
|||||||||||||||||||||||||||||||
| 28.08.2016, 20:47 | |
|
Ответы с готовыми решениями:
8
Перехват api-вызова. Ошибка при выполнении
|
|
Ушел с форума
|
|
| 28.08.2016, 21:05 | |
|
ASCII, а цель какая в данном случае?
Похукать функцию или самому последовательно пройтись по всем грабелькам, связанным с этой темой? Если первое, тогда я советую не мучиться, а сразу взять что-то готовое и проверенное, например MinHook (кстати, рекомендую). Если второе, тогда тебе нужен дизассемблер, который умеет определять длины инструкций и/или пропускать входные jmp...
1
|
|
|
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
|
||||||
| 28.08.2016, 21:13 [ТС] | ||||||
|
Убежденный, вторая цель. А что ты имеешь ввиду под дизассемблером, умеющим пропускать инструкции? Я просто в данном случае подумал написать свой минифреймворк для этого, хотя-бы для x32. То есть в любом случае придется самому делать проверку на опкоды?
Что-то вроде:
Мне кажется в качестве обучающей цели, написать свой фреймворк для этого, весьма неплохо было бы? Пусть даже без поддержки х64.
0
|
||||||
|
Ушел с форума
|
||
| 28.08.2016, 21:15 | ||
|
Начальные байты функции могут быть очень разные, в некоторых ситуациях там можно натолкнуться на чужие хуки (в том числе виндовые - apphelp.dll), так что придется учесть множество всяких "если". В x64 все еще сложнее: RIP-адресация, большое адресное пространство, больший размер инструкций, для которых не всегда есть место, и т.д.
0
|
||
|
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
|
|
| 28.08.2016, 21:20 [ТС] | |
|
Убежденный, а вообще, вот данная ситуация является вполне стандартным случаем вызова функции? Есть какая-нибудь систематика тут? Где будет стоять jmp на функцию, а где сразу call передает управление функции?
0
|
|
|
Ушел с форума
|
|
| 28.08.2016, 21:46 | |
|
Это вполне типично, что из kernel32 идет jmp в kernelbase, а оттуда еще куда-нибудь.
Но никаких жестких правил нету, начальные байты функции теоретически могут быть совершенно любыми [опкодами].
1
|
|
|
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
|
|
| 28.08.2016, 22:01 | |
|
Может быть я не совсем понял сабж, в чём проблема восстановить первые 5 байт, вызывать оригинальную функцию, затем установить свой джамп на хук обратно?
0
|
|
|
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
|
|
| 28.08.2016, 22:04 [ТС] | |
|
jr_, дело в том, что это требует повторной перезаписи тела функции. А хочется достичь указанного поведения. Установить хук, а при желании передать управление оригинальной функции, прибавить к адресу 5 байт и просто ее вызвать. И где тогда опять устанавливать хук, если его постоянно снимать?
0
|
|
|
64 / 68 / 18
Регистрация: 21.10.2015
Сообщений: 228
|
|||||||||||||||||||||||||||
| 29.08.2016, 02:01 | |||||||||||||||||||||||||||
|
омайгайд.
невероятная шляпа
штукенция
0
|
|||||||||||||||||||||||||||
| 29.08.2016, 02:01 | |
|
Помогаю со студенческими работами здесь
9
Перехват вызова методов
Перехват стандартного вызова запущенной из ява-приложения внешней программы Перехват API Перехват API Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|