Я прохучил экспорт либы примерно следующим образом: recv: jmp offset original_recv send: jmp offset original_send WSAStartup: push [esp+8] push [esp+8] call offset original_WSAStartup ret 8 Удалил оригинальную либу, вместо неё положил прохученную (WSP отключил). Все смещения, хуки установлены правильно, контрольная сумма пересчитана. В ольке библиотека нормально загружается. запускаю программу, юзающую сокеты. прохученная WSAStartup срабатывает удачно. все остальные апишки говорят: WSANOTINITIALISED (0000276D). Перезагружаю компьютер - система виснет при загрузке после надписи "Приветствие". В чём тут дело? я ведь по сути ничего не изменил. просто в таблице экспорта изменил адреса входа процедур. вместо функций поставил jmp со смещением на оригинальный код. Выкладываю прохученную либу: http://file.raid.ru/get.php?f=1b82ea1cc982e173c999ac2c7e86f015
Вобщем выяснил, что при малейшем изменении экспорта библиотеки происходит такой глюк при загрузке. Пусть даже сдвигаю адрес recv в экспорте на пару байт назад (там стоят nop'ы) - всё-равно отказывается грузиться. Причём изменения кода функции на её работе никак не отбражается. можно свободно заменять xor ebx,ebx на sub ebx,ebx - работоспособность от этого не меняется. но стоит лишь затронуть таблицу адресов и система виснет при загрузке. Как это объяснить?
Блин, так во-первых: я перебиваю чек-сумму в ПЕ заголовке. во-вторых: если я заменяю в какой-нибудь функции, скажем, mov edi,edi на 2 nop'а (при этом даже не восстанавливаю чек сумму в ПЕ заголовке) то ничего не происходит - всё по-прежднему работает на ура (при том, что экспорт и код находятся в одной секции - стало быть меняется чек сумма всей секции). %)))) Единственный вариант - если DllMain сама считает сумму отдельных кусков кода. Помойму маловероятно - иначе бы всё не стало так глючить. система должна же выдать хоть какое-то сообщение: мол, файлы системные испорчены... или стало бы, но не в момент старта системы а сразу после модификации либы.