О процедуре HookCode из библиотеки ms-rem-а

Тема в разделе "WASM.BEGINNERS", создана пользователем UnknownArtist, 4 окт 2006.

  1. UnknownArtist

    UnknownArtist New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2006
    Сообщения:
    3
    Перехватываемая функция имеет следующее начало:
    push esi
    push edi
    call ffffe456

    При использовании HookProc вызов "правильной" функции из перехваченной приводит к вылетанию программы, т.к. в первых пяти байтах, сохраненных черти-где, имеется переход по относительному смещению - относительно СТАРОГО положения команды CALL, потому это переход "в никуда". Я так понимаю, нужно HookCode дополнить кодом для проверки этих 5 байт на наличие относительных переходов/вызовов и их корректировки? Или я чего-то не понимаю?
     
  2. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    угу... частный случай, который требует индивидуальной обработки...
     
  3. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    гхрм... а чем вас не устроили стандартные хуки винды?
     
  4. UnknownArtist

    UnknownArtist New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2006
    Сообщения:
    3
    Гм... А чем MS-Rem'a не устроили стандартные хуки винды, что он такую кучу кода накатал и статью про это написал? Тут вопрос стоит не концептуально, а чисто прагматически: вот, нашелся в этой функции проезд... если кто будет использовать, чтоб имел в виду.
     
  5. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    А вот поэтому надо делать хукинг с помощью восстановления затертых байт(хотя мне этот способ не нравицца) - 100% что все будет пахать!
     
  6. UnknownArtist

    UnknownArtist New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2006
    Сообщения:
    3
    Да собственно и HookProc тоже пашет если дописать туда что-то типа

    if (! lstrcmp(lpProcName,"Жуткая_функция") )
    { offs=*((DWORD*)((DWORD)*OldProc+3));
    *((DWORD*)((DWORD)*OldProc+3))=offs-(DWORD)(*OldProc)+(DWORD)fnAdr;
    }
    Дизассемблер лень было дописывать, и код наверное корявый, и вообще я не хакер а токо учусь.