Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Подключение DLL к процессу |
Автор: AndAnd 22.7.2006, 07:42 | ||||
Здравствуйте все участники форума! У меня тут возникла проблема. Нашел в Инете статью о том как перехватывать API функцию MessageBoxA из user32.dll. Суть данного метода заключается в следующем (очень кратко): Пишем свою DLL, с функцией двойником и какую функцию необходимо перехватывать. Затем отдельно код на подключение DLL к процессу, где используется искомая API функция (я создал простой проект с MessageBox в Buildere). Далее запускаем проект с MessageBox (в диспетчере задач появляется процесс с каким-то PID), после чего подключаем DLL к процессу. Вызываем MessageBox (с любым текстом), DLL перехватывает этот текст и добавляет к нему (или совсем другой текст) некоторый набор символов, и выдает измененное сообщение, вродебы перехват осуществился. Но при попытке перехватить любую API функцию из Wininet.DLL, происходит ошибка приложения, использующее эту библиотеку. Ошибка скорее всего в коде DLL, но точно не заню. Может кто знает как исправить вот исходник DLL на Buildere
а вот исходник для присоединения DLL к процессу:
Спасибо за внимание. Жду ответов по-существу. |
Автор: GremlinProg 22.7.2006, 17:33 |
пока причины не понял, но явно бросается в глаза вызов "call" инструкции: 0x15ff - это что угодно, но не "call". У "call" всего 4 возможных варианта кода: E8im, FF/2, 9Aim, FF/3 и ни под один 0x15ff не подходит! После слеша указан код регистра RO, т.е. старший халф-байт второго слова расширенной(двухбайтовой) команды. Теперь по сути: ты пытаешься перепизать какой-нибудь экспортный вызов в уже загруженном модуле, но учти один момент: не все экспортируемые методы имеют одинаковую модель вызова: экспортировать можно и __fastcall и __cdecl, а ты используешь только один подход при подстановке своего кода. |
Автор: Romikgy 22.7.2006, 17:58 |
GremlinProg, имхо в обратном порядке это и будет 0xff, 0x15 ![]() |
Автор: GremlinProg 22.7.2006, 18:01 |
Romikgy, собственно, об чем я и говорю: (15!=3)&&(15!=2). )) Добавлено @ 18:02 вернее (0x01!=0x03)&&(0x01!=0x02), это стабший полубайт! |
Автор: Romikgy 22.7.2006, 18:04 |
проглядел ![]() я не силен в асме , не знаю его команд ![]() |
Автор: AndAnd 22.7.2006, 20:26 |
Вот какую ошибку мне выдает IE если к нему подключать эту библиотеку. как я вижу DLL подключена к IE, но почему-то здесь все по нулям. |
Автор: dumb 22.7.2006, 22:18 |
ff 15 xx xx xx xx - call dword ptr [xx xx xx xx] __fastcall на экспорт - таки не типичный случай ![]() по существу: #pragma pack(1) ![]() Добавлено @ 22:20 и не забудь подставлять полный путь к .dll, если она не в system32... |
Автор: AndAnd 23.7.2006, 06:20 | ||
dumb, извини, но я не понял, что ты этим хочешь сказать. GremlinProg, ты не нашел причину? я один с этим не справлюсь, мне нужна ваша помощь, я смотрю тут все соображают, кроме меня. ![]() |
Автор: dumb 23.7.2006, 19:04 | ||
"оберни" объявления структур INJECTORCODE и jmp_far:
|
Автор: GremlinProg 23.7.2006, 22:10 |
Извиняюсь, про двухбитный MOD забыл, все привильно ff 15 xx xx xx xx - call dword ptr [xx xx xx xx], как ты и сказал. Добавлено @ 22:13 покажи объявление INJECTORCODE Добавлено @ 22:21 call dword ptr [loadlibrary_adr] - это вызов из импортного THUNC'а LoadLibrary, а GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA") даст тебе прямой линк на метод, получается команда выполнит джамп неизвестно куда, т.е. на адрес по адресу первого дворда кода LoadLibraryA. Нужно заменить тогда ff 15 xx xx xx xx на E8 xx xx xx xx - это на байт короче. Добавлено @ 22:22 но бросает вызов сразу по смещению, без dword ptr [] |
Автор: AndAnd 24.7.2006, 02:49 | ||||
вот
|
Автор: dumb 24.7.2006, 03:23 |
код рабочий, слит с http://www.rsdn.ru/article/baseserv/IntercetionAPI.xml. просто было не учтено выравнивание в структуре. AndAnd, неужели не работает до сих пор?! ![]() |
Автор: AndAnd 24.7.2006, 04:03 | ||
dumb, именно с этой статьи я и брал код. Просто мне надо перехватить не MessageBoxA, а функцию InternetConnectA из wininet.dll. Но при простой замене функции MessageBox на InternetConnectA ничего не получается, приложение выдает ошибку.
Может я что-н. не так делаю, но не работает. ![]() |
Автор: dumb 24.7.2006, 12:01 | ||||
dll:
кусок от "присоединителя" (в нем, собственно, и так все нормально - на всякий случай):
|
Автор: AndAnd 24.7.2006, 18:53 |
dumb , спасибо тебе большое, очень выручил! Спасибо и всем участникам данной темы: GremlinProg , Romikgy . |