Интересная веСЧь..

Тема в разделе "WASM.WIN32", создана пользователем Asterix, 23 дек 2004.

  1. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Win98..

    Гружу DLL из EXE..

    В DLL определяю адрес функции CreateFileA через GetProcAddress,

    начинаю просматривать импорт EXE в поисках CreateFileA нахожу,

    но в таблице импорта EXE'шника адрес функции CreateFileA почему-то

    отличается от ранее найденного(через GetProcAddress из DLL).

    Это какие-то особенности win98 или глюки??
     
  2. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    > Это какие-то особенности win98??



    Если под отладчиком третьего кольца, то да.
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Да, точно, с Olly полная лажа, в SoftIce всё нормально.
     
  4. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Asterix

    из-за того что в Win9x код kernel32 размещен в shared memory, система не позволяет его дебажить(user mode отладчиком) т.к. установка брейкпоинта повлияла бы на работу других процессов.

    вставляется специальная debug-прокладка для АПИшных вызовов.
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    green

    Ну код самой kernel32.dll никто и не дебажил..
     
  6. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    > Ну код самой kernel32.dll никто и не дебажил..



    Ты дебажил хост - вот система при запуске его под отладчиком на все АПИ функции в таблице импорта сделала переходники в виде jmp, чтобы в них можно было ССh втыкать для бряков. А GetProcAddress естественно возвращает нормальный адрес в kernel32.dll

    Типа учите мат. часть =)
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    > А GetProcAddress естественно возвращает нормальный адрес в kernel32.dll



    Нормальные адреса в kernel32(в Win98) начинаются с BFF.., ничего подобного GetProcAddress под OllyDbg не возвращает, только под SoftIce всё нормально.

    А бряки на API OllyDbg под Win98 ставить не даёт, так что.. :derisive:
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Этот вопрос уже не раз поднимался, в частности в Is debugger present по таблице импорта и твоем же IsDebuggerPresent в 9x



    А суть такая: под отладчиком ring3 в таблице импорта вместо реального адреса функции kernel32.CreateFileA стоит адрес такой вот фишки:

    push kernel32.CreateFileA

    jmp kernel32.BFF957CA ;переход ес-но относительный rel32



    Причем, если мы несколько раз объявим импорт CreateFileA, то на каждое обявление будет своя фишка, а GetProcAddress выдаст указатель на свою фишку, которая не будет совпадать со всеми остальными (все эти фишки сидят по адресам 8хх).



    Чтобы "выцепить" настоящий адрес CreateFileA под отладчиком нужно взять его из PUSH-а, т.е. если GetProcAddress выдала нам адрес в EAX и он меньше BFF.., значит мы под отладчиком и настоящий адрес будет mov EAX,[EAX+1]