Проблемма с хуком ws2_32.dll

Тема в разделе "WASM.WIN32", создана пользователем Quark, 18 дек 2007.

  1. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Я прохучил экспорт либы примерно следующим образом:

    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
     
  2. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Вобщем выяснил, что при малейшем изменении экспорта библиотеки происходит такой глюк при загрузке. Пусть даже сдвигаю адрес recv в экспорте на пару байт назад (там стоят nop'ы) - всё-равно отказывается грузиться. Причём изменения кода функции на её работе никак не отбражается. можно свободно заменять xor ebx,ebx на sub ebx,ebx - работоспособность от этого не меняется. но стоит лишь затронуть таблицу адресов и система виснет при загрузке.

    Как это объяснить?
     
  3. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Ws2_32 считает свою срс, это вроде как давно всем известно.
     
  4. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Блин, так
    во-первых: я перебиваю чек-сумму в ПЕ заголовке.
    во-вторых: если я заменяю в какой-нибудь функции, скажем, mov edi,edi на 2 nop'а (при этом даже не восстанавливаю чек сумму в ПЕ заголовке) то ничего не происходит - всё по-прежднему работает на ура (при том, что экспорт и код находятся в одной секции - стало быть меняется чек сумма всей секции). %))))


    Единственный вариант - если DllMain сама считает сумму отдельных кусков кода. Помойму маловероятно - иначе бы всё не стало так глючить. система должна же выдать хоть какое-то сообщение: мол, файлы системные испорчены... или стало бы, но не в момент старта системы а сразу после модификации либы.