Форум программистов, компьютерный форум CyberForum.ru

Перехват функции - GetProcAddress - C++

Восстановить пароль Регистрация
 
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
04.02.2014, 21:10     Перехват функции - GetProcAddress #1
Здравствуйте. Покажите пожалуйста пример, как перехватит в dll "A" , функцию из dll "Б"

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

То есть у меня экспортная функция:

C
1
extern "C"__declspec(dllexport) int SomeFunc( int a, int b) { return 25  }
Это модуль "А"

В модуле "Б" нужно получить эту функцию:

C
1
int SomeFunc_Hook_From_Module_A( int a, int b) { return printf( "Yeah, my hook!\n" )  }
На сколько я знаю, это получается не хук, а "перехват"

Если в модуле "Б", в перехватной функции SomeFunc_Hook_From_Module_A не сделаю вызов оригинальной функции, то вызова её не будет в модуле "А"

Добавлено через 16 часов 33 минуты
up.

Добавлено через 3 часа 21 минуту
up..

Добавлено через 6 часов 52 минуты
ну же ?

Добавлено через 22 часа 46 минут
uppp
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2014, 21:10     Перехват функции - GetProcAddress
Посмотрите здесь:

Перехват URL C++
C++ Загрузка переменной из DLL (GetProcAddress не берет значение переменной из *.dll)
C++ Не срабатывает перехват исключений
Перехват сообщения C++
перехват исключений C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 981
Регистрация: 02.05.2013
Сообщений: 10,297
Завершенные тесты: 1
04.02.2014, 21:44     Перехват функции - GetProcAddress #2
Цитата Сообщение от pEntity Посмотреть сообщение
Покажите пожалуйста пример, как перехватит в dll "A" , функцию из dll "Б"
Найти адрес функции, временно поменять атрибуты страницы, в которой
она находится, добавив права на запись, затем вставить туда инструкцию
jmp с переходом на свою реализацию. Атрибуты страницы вернуть на место.
Перед манипуляциями желательно приостановить другие потоки.

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

На сколько я знаю, это получается не хук, а "перехват"
Если в модуле "Б", в перехватной функции SomeFunc_Hook_From_Module_A не сделаю вызов оригинальной функции, то вызова её не будет в модуле "А"
Я ничего не понял. Серьезно.
Можете описать проблему более четко ?

Цитата Сообщение от pEntity Посмотреть сообщение
Добавлено через 16 часов 33 минуты
up.
Добавлено через 3 часа 21 минуту
up..
Добавлено через 6 часов 52 минуты
ну же ?
Добавлено через 22 часа 46 минут
uppp
Ничего, кроме раздражения, у нормальных людей эти "апы" не вызывают.
Проблемы нужно пытаться решать самому, а не ждать помощи невесть откуда.
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
04.02.2014, 21:49  [ТС]     Перехват функции - GetProcAddress #3
Нужно связать две dll.

В первом:

C++
1
2
3
4
5
6
int TEST_Function( )
{
int TEST_FunctionPre_Hook( );
printf( "MyFunction...\n" );
int TEST_FunctionPost_Hook( );
}
Во-втором нужно отловить функцию int TEST_FunctionPre_Hook( ); из первого модуля:

C++
1
2
3
4
int TEST_FunctionPre_Hook( )
{
return 1;
}
Если она вернет 1, то в первом не выполниться printf( "MyFunction...\n" );


Проблемы нужно пытаться решать самому, а не ждать помощи невесть откуда.
Пробовал, не вышло. Смог только получить указатель pShowSum = (dll_func)GetProcAddress(hDLL, "SomeFunc");

Больше статей не нашел.
646kapeh064
 Аватар для 646kapeh064
59 / 58 / 15
Регистрация: 09.12.2013
Сообщений: 208
04.02.2014, 21:54     Перехват функции - GetProcAddress #4
Цитата Сообщение от pEntity Посмотреть сообщение
Пробовал, не вышло. Смог только получить указатель pShowSum = (dll_func)GetProcAddress(hDLL, "SomeFunc");
Кинь код. А то не совсем понятно как у тебя там оно все работает.
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
04.02.2014, 21:59  [ТС]     Перехват функции - GetProcAddress #5
У меня ничего не вышло. Я не знаю как это сделать.
646kapeh064
 Аватар для 646kapeh064
59 / 58 / 15
Регистрация: 09.12.2013
Сообщений: 208
04.02.2014, 22:12     Перехват функции - GetProcAddress #6
pEntity, как тебе уже и писали выше.
1. С помощью GetProcAddress получаешь адрес функции
2. Пишешь в её начало ассемблерную инструкцию JMP на адрес своей функции, предварительно сохранив прежний код начала заменяемой функции
3. Если надо, то в своей функции: восстанавливаешь начало заменяемой функции, вызываешь её, затем вставляешь обратно JMP на свою функцию.

Так-что сложнее будет все-таки для тебя найти адрес этой искомой функции.
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
04.02.2014, 22:37  [ТС]     Перехват функции - GetProcAddress #7
646kapeh064, вы бы не могли привести какой-либо пример?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2014, 22:39     Перехват функции - GetProcAddress
Еще ссылки по теме:

Перехват аудио потока C++
Перехват потоков ввода/вывода C++
Перехват функций C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
646kapeh064
 Аватар для 646kapeh064
59 / 58 / 15
Регистрация: 09.12.2013
Сообщений: 208
04.02.2014, 22:39     Перехват функции - GetProcAddress #8
pEntity, нет. У меня нету кода под руками, а писать долго. Я думал ты написал уже большую часть. А оказалось что нет.
Поищи в поисковиках. "C++ сплайсинг примеры" и т.п.
Yandex
Объявления
04.02.2014, 22:39     Перехват функции - GetProcAddress
Ответ Создать тему
Опции темы

Текущее время: 16:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru