При попытки поковырятся в одной программе обнаружил, что она выполняет ряд действий до того как управление передается на точку входа, в частности создание лог-файлов. Для просмотра использовал Ida( знаю, что не лучший выбор, но я к ней привык Как это происходит, и как поточнее понять где происходит эта работа? Не пинайте если вопрос... все же я по професии химик, а это хобби
Если правильно понял вопрос, то можно посмотреть в исходниках, поставляемых с VC папка, ...\crt\src, смотреть файл crt0.c
Serg50 Любой компилятор с языков высокого уровня вставляет перед точкой входа программу "настройки среды". В программе на ассемблере вы такого не увидете. Задавайте вопрос поконкретнее, а то сейчас пойдет флуд... в сторону.
Ну-ну. Начинается флуд. Стартап убирают в экзотических случаях : или когда пишут "обрезки" или вообще модули без операционки. Нормальная программа не будет без него работать. Про большинство я бы не расписывался, т.к. в коммерческих компиляторах обычно защита сидит именно в стартапе. А кто еще может сказать - этой программе осталось жить 20 дней
valterg Это не "перед точкой входа", а "на точке входа". Т.е. после попадания управления на PE Entry Point.
Спасибо за внимание. Хотя собака оказалась зарыта не там , все равно это любопытно и я могу сформулировать вопрос уже более корректно: Как и каким дебаггером удобнее отследить, что выполняет DLL загружаемая системой перед программой в DllMain? В Ida можно тормознуть программу на первой же комманде, но тогда потребуется продираться через весь код загрузчика. А это не очнь эффективно, особенно если этих DLL много(в разбираемом мною случае их около 30. В Olly, который я поставил на прошлой неделе я вообще не нашел такой возможности. Или я плохо искал?
Serg50 Поставить брейк на процедуру, которая вызывается для нотификации длл. Это LdrpCallInitRoutine()/LdrpRunInitializeRoutines(). Можно снять лог, установив LdrpShowInitRoutines/ShowSnaps в 1.
Да, кстати, код выполняться может до ЕР необязательно в либе - хорошая статья на тему такой малвары есть у Криса и им же придуманный способ выполнения кода до ЕР.
pr0mix Мы ожидале эксплоит для лодера, который передаст управление на загружаемый модуль, есчо до вызова его(процедура инициализации, тлс и сех(не x86)).. увидили манипуляции в тлс - колбеках и Криса подруги фоту.
n0name под новый год помницо крякми выкладывал, в котором был фокус с ТЛС. олли умеет брякатся на ДллМейн каждой длл.
Не уверен. Если о опции "Break on new module(DLL)" то с ней олли замерла только в модуле ntdll в неясном мне месте И к этому моменту уже загружена куча модулей, и не только системных. И если иметь терпение то можно дойти до точки( и поставить там break), где вызывается DllMain. Но у меня сложилось впечатление, что это DLL уже загружаемые программой через LoadLibrary.
Serg50 Проецирование секции это одно из событий, доставляемых отладчику. Именно при этом олли останавливается, адрес соответственно в шлюзе(KiFastSystemCallRet), бактрейс выполните: Код (Text): ZwMapViewOfSection LdrpMapDll LdrpLoadDll LdrLoadDll
По теме матчасть. В лодер заложена возможность отладки, логгирования событий и ошибок. За это отвечают в основном переменные: o LdrpShowRecursiveDllLoads/LdrpBreakOnRecursiveDllLoads есть ShowSnaps, это не нужно вобщем. o LdrpBreakOnExceptions Если возникает исключение в загрузчике, сех выполняет логгирование в LdrpGenericExceptionFilter() причины ошибки и генерит брейк в DbgBreakPoint(). o LdrpShowInitRoutines Посылает отладчику сообщение о вызове InitRoutine модулей. Недостаток - не доставляется причина DLL_THREAD_ATTACH. o ShowSnaps & ShowErrors. Логирует практически все телодвижения загрузчика, доставляя при этом сообщения отладчику. Очень полезные переменные.
Разобью вопрос на два : 1) как брякнуться на полной программе - на этот вопрос и отвечают в топике и я тут пас. ясно, что нужно брякнуться где-то в недрах системного загрузчика и поставить бряк по памяти на секцию DllMain уже после ее загрузки, но до выполнения. Либо как-то "дошагать" до этого - но по-моему Олли для этого не годится. 2) как протрассировать DllMain отдельно ? Я для интереса загрузил отдельную DLL в Олли и - она остановилась на DllMain, если я конечно не перепутал что-то.