Заинтересовал перехват функций приема-отправки пакетов бибилиотеки ws2_32.dll Как известно (мне) дллки ОС грузит себе в память (например Системная1.dll) и при обращении како-го либо приложения к этой длл она (ОС, конкретно винда). Подсовывает уже загруженную в память эту длл, увеличивая счетчик использования длл на 1. Вот... Это, вроде как и происходит в WinNt.(Поправте, пожалуйста, если это не так) И в этом случае под "пехватом" нужно понимать какие-то "сложные" (ну, скажем долгие) лазания по памяти переназначения кучу всяких параметров, чтобы перехватить эти функции... (Не будем углубляться на форуме достаточно инфы по этому поводу. Я, если честно далековат от её понимания). Но вот интересная вещь. Если "подсунуть" приложению библиотеку ws2_32.dll прямо к ней в папочку, то она будет пытаться грузить себе в память именно её (а так как это длл отличная от той которая лежит в системной, то ОС ее загрузит по требованию этого приложения). Я это наблюдал своими глазами. (Именно с этой библиотекой и именно с конкретным приложением). Вопрос. Всегда ли происходит загрузка этой библиотеки именно таким образом? (Да и вообще каким, надо бы выяснить. Ведь приложения сообщает не просто ИМЯ дллки...) Если же алгоритм загруки таков: Приложение сначал "смотрит" наличие нужной длл в своей папке (конкретно речь идет об ws2_32). Если ее нет идет в системную папку и просит обработчик загрузить оттуда. Так ли это? Или это зависит от самого алгоритма работа программы и это-только частный случай. Или это происходит у любого приложения для этой библиотеки? Если последнее верно, то. Пишем свою длл (в чем угодно Vus Studio, Builder и т.д.), которая именно таким образом и называется. Делаем на экспорт функции библиотеки ws2_32.dll с прототипами, которые указаны в MSDN и пишем "внутри" все что душе угодно. Почему бы не сделать это так???
Загрузчик знает список модулей, зарегистрированных в системе и существующих в виде секций. Clerk продемонстрировал интересную технику внедрения модуля в процесс: http://www.wasm.ru/forum/viewtopic.php?id=26673
Не совсем понял по поводу Код (Text): из директории \KnownDlls Чья директория \KnownDlls? Я так понимаю того процесса, который собирается быть запущен, так? Т.е. если загрузчик (виндовый) лезет в \KnownDlls процесса который необходимо запусть (а вернее ехе файлика) ищет там ws2_32 и если не находит, грузит с диска, так? Тогда вопрос где на диске загрузчик ищет эту длл? (Алгоритм.... Если конечно до этого ответ на мой вопрос утвердительны) (И к стати, получается, если в запускаемом приложении описана эта длл [ws2_32] в директории \KnownDlls, то по-любому загручик загрузит ту, которая и является верной, системной, настоящей....) [Скажу по более нубски. Если в программе явным образом указано линковаться с такой-то такой-то библиотекой, а потом вызвать из нее функции, то так и происходит. Сначала грузится системная билиотека, функции которой позже вызываются. И 2й вариант. В программе не указано явным образом линковаться к ws2_32. а потом позже в коде стоит вызов опред функции из этой библиотеки (ну или обращение к ним из других библиотек). Вот тут-то лоадер и начинает ломать голову... Прошу прощения ха это но я правда очень плохо себе все это представляю. Не отказался бы от сцылок на то, что дало бы мне необходимые представления об этом процессе]
Большое Спасибо, моя голова проясняется!!! Еще одно темное пятно. \KnownDlls кому конкретно принадлежит? (Если системе, то должен быть процесс, в котором он храниться. Либо имеется ввиду область памяти под директорией, которая никому не принадлежит, хотя такое, кажется невозможно...). Но при запуске приложения, как я понял из (Речь о \KnownDlls). Т.е. эта директория все же создается для каждого процесса отдельно? Немного запутался. По этой цитате получается, вроде как для каждого процесса эта директория формируется. (Или она для каждого процесса формируется, но она системная, так??? Т.е. какая-то область памяти задающая связи с длл для конкретного процесса)
А если загрузчик её не находит в этой папке, то что тогда происходит? (К стати, не совсем понял слова по поводу найденной секции куда он проецирует? Что под этим подразумевается? Что это значит?)
\KnownDlls - Объект директория. разберись сначала с основами, а потом уже задавай вопросы и внедряйся в подробности, из книг могу посоветовать только: Джеффри Рихтер. Windows для профессионалов: создание эффективных...
Прошу прощения, я пьян. Директория это не каталог Создаёт эти секции процесс smss.exe Смысл в том, что в LoadLibrary параметр может быть либо имя модуля либо имя секции. ws2_32.dll не известна системе, это не системный модуль, следовательно его можно подгрузить из утекущего каталого с процессом, к примеру механизм поиска модуля, из LdrLoadDll().
О!!! Огромное спасибо, получил-таки ответ на так волновавший вопрос!!!! Наверное, его в такм сосотоянии и можно было понять