Работа до Entry Point

Discussion in 'WASM.RESEARCH' started by Serg50, Feb 17, 2010.

  1. Serg50

    Serg50 New Member

    Blog Posts:
    0
    При попытки поковырятся в одной программе обнаружил, что она выполняет ряд действий до того как управление передается на точку входа, в частности создание лог-файлов. Для просмотра использовал Ida( знаю, что не лучший выбор, но я к ней привык:) Как это происходит, и как поточнее понять где происходит эта работа?

    Не пинайте если вопрос... все же я по професии химик, а это хобби :)
     
  2. redcat

    redcat New Member

    Blog Posts:
    0
    Если правильно понял вопрос, то можно посмотреть в исходниках, поставляемых с VC папка, ...\crt\src, смотреть файл crt0.c
     
  3. Freeman

    Freeman New Member

    Blog Posts:
    0
    DllMain импортируемых длл, TLS...
     
  4. valterg

    valterg Active Member

    Blog Posts:
    0
    Serg50 Любой компилятор с языков высокого уровня вставляет перед точкой входа программу "настройки среды". В программе на ассемблере вы такого не увидете.
    Задавайте вопрос поконкретнее, а то сейчас пойдет флуд... в сторону.
     
  5. InsidE

    InsidE Member

    Blog Posts:
    0
    у большинства компилеров возможно убрать стартап код.
     
  6. valterg

    valterg Active Member

    Blog Posts:
    0
    Ну-ну. Начинается флуд. Стартап убирают в экзотических случаях : или когда пишут "обрезки" или вообще модули без операционки. Нормальная программа не будет без него работать.
    Про большинство я бы не расписывался, т.к. в коммерческих компиляторах обычно защита сидит именно в стартапе. А кто еще может сказать - этой программе осталось жить 20 дней :)
     
  7. l_inc

    l_inc New Member

    Blog Posts:
    0
    valterg
    Это не "перед точкой входа", а "на точке входа". Т.е. после попадания управления на PE Entry Point.
     
  8. Serg50

    Serg50 New Member

    Blog Posts:
    0
    Спасибо за внимание. Хотя собака оказалась зарыта не там :), все равно это любопытно и я могу сформулировать вопрос уже более корректно:

    Как и каким дебаггером удобнее отследить, что выполняет DLL загружаемая системой перед программой в DllMain?

    В Ida можно тормознуть программу на первой же комманде, но тогда потребуется продираться через весь код загрузчика. А это не очнь эффективно, особенно если этих DLL много(в разбираемом мною случае их около 30:). В Olly, который я поставил на прошлой неделе я вообще не нашел такой возможности. Или я плохо искал?
     
  9. Ox8BFF55

    Ox8BFF55 New Member

    Blog Posts:
    0
    Плохо искал.... В настройках есть пункт где брякатся...
     
  10. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Serg50
    Поставить брейк на процедуру, которая вызывается для нотификации длл. Это LdrpCallInitRoutine()/LdrpRunInitializeRoutines(). Можно снять лог, установив LdrpShowInitRoutines/ShowSnaps в 1.
     
  11. d2k9

    d2k9 Алексей

    Blog Posts:
    0
    Да, кстати, код выполняться может до ЕР необязательно в либе - хорошая статья на тему такой малвары есть у Криса и им же придуманный способ выполнения кода до ЕР.
     
  12. pr0mix

    pr0mix New Member

    Blog Posts:
    0
    данная ст0тья http://www.insidepro.com/kk/236/236r.shtml
     
  13. pr0mix

    pr0mix New Member

    Blog Posts:
    0
    причем не может, а выполняется
     
  14. Clerk

    Clerk Забанен

    Blog Posts:
    0
    pr0mix
    Мы ожидале эксплоит для лодера, который передаст управление на загружаемый модуль, есчо до вызова его(процедура инициализации, тлс и сех(не x86)).. увидили манипуляции в тлс - колбеках и Криса подруги фоту.
     
  15. Freeman

    Freeman New Member

    Blog Posts:
    0
    n0name под новый год помницо крякми выкладывал, в котором был фокус с ТЛС.
    олли умеет брякатся на ДллМейн каждой длл.
     
  16. Serg50

    Serg50 New Member

    Blog Posts:
    0
    Не уверен. Если о опции "Break on new module(DLL)" то с ней олли замерла только в модуле ntdll в неясном мне месте :) И к этому моменту уже загружена куча модулей, и не только системных. И если иметь терпение то можно дойти до точки( и поставить там break), где вызывается DllMain. Но у меня сложилось впечатление, что это DLL уже загружаемые программой через LoadLibrary.
     
  17. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Serg50
    Проецирование секции это одно из событий, доставляемых отладчику. Именно при этом олли останавливается, адрес соответственно в шлюзе(KiFastSystemCallRet), бактрейс выполните:
    Code (Text):
    1. ZwMapViewOfSection
    2. LdrpMapDll
    3. LdrpLoadDll
    4. LdrLoadDll
     
  18. Clerk

    Clerk Забанен

    Blog Posts:
    0
    По теме матчасть. В лодер заложена возможность отладки, логгирования событий и ошибок. За это отвечают в основном переменные:
    o LdrpShowRecursiveDllLoads/LdrpBreakOnRecursiveDllLoads есть ShowSnaps, это не нужно вобщем.
    o LdrpBreakOnExceptions
    Если возникает исключение в загрузчике, сех выполняет логгирование в LdrpGenericExceptionFilter() причины ошибки и генерит брейк в DbgBreakPoint().
    o LdrpShowInitRoutines
    Посылает отладчику сообщение о вызове InitRoutine модулей. Недостаток - не доставляется причина DLL_THREAD_ATTACH.
    o ShowSnaps & ShowErrors.
    Логирует практически все телодвижения загрузчика, доставляя при этом сообщения отладчику. Очень полезные переменные.
     
  19. valterg

    valterg Active Member

    Blog Posts:
    0
    Разобью вопрос на два :

    1) как брякнуться на полной программе - на этот вопрос и отвечают в топике и я тут пас.
    ясно, что нужно брякнуться где-то в недрах системного загрузчика и поставить бряк по памяти на секцию DllMain уже после ее загрузки, но до выполнения. Либо как-то "дошагать" до этого - но по-моему Олли для этого не годится.

    2) как протрассировать DllMain отдельно ?
    Я для интереса загрузил отдельную DLL в Олли и - она остановилась на DllMain, если я конечно не перепутал что-то.
     
  20. Clerk

    Clerk Забанен

    Blog Posts:
    0
    valterg
    Олли чудесно с этим справляется. Не вижу проблемы.