Процесс загрузки PE файла

Тема в разделе "WASM.BEGINNERS", создана пользователем ant, 17 сен 2009.

  1. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    Пытаюсь разобраться с сабжем. В частности, если в APPINIT_DLLS прописана загрузка некоей DLL, которая, как говорит молва, подгружается к каждому файлу, импортирующему user32.dll
    Эксперимент показал, что даже при неправильной сигнатуре PE (Mancubus подкинул тему для раскопок) либа грузится. При этом выполняется код из главной процедуры.
    Кроме того, я вычитал следующее о работе системного загрузчика:
    1) Следует ли из результатов моего опыта, что загрузчик проверяет заголовок, понимает, что он неверный, и , тем не менее, грузит мою DLL и выполняет ее код?
    2) Существует ли способ подправить заголовок уже в памяти (на диске пробовал, позно :) ),
    так, что файл начнет таки выполняться? Или положительный ответ на первый вопрос не оставляет шансов?
     
  2. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    Отвечаю сам себе.
    1) Код приаттаченой DLL исполняется. Только не в контексте испорченого файла.
    2) Вместо неправильного файла винда запускает ntvdm.exe, к которому и цепляется моя DLL
    Ну, хотя бы поупражнялся :)
     
  3. HiroProtagonist

    HiroProtagonist New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2009
    Сообщения:
    9
    2ant
    ntvdm грузится для old-exe (MZ/ZM/etc) файлов. Видимо у тебя попорчен pe-заголовок с сигнатурой. Хотя каким боком в таком случае подгружается dll мне не понятно. Или всетаки не ntvdm а обычная консоль? Скинул бы файлег посмотреть.
     
  4. Mankubus

    Mankubus New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2009
    Сообщения:
    76
    ant, если ты про тот самый файл, то он вроде exe а не dll, а если про что-то другое, то что за либа?
    2) подправлять в памяти? это полсле загрузки loader'ом?
     
  5. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    2 HiroProtagonist "Эксперимент показал, что даже при неправильной сигнатуре PE"
    Об этом и речь :) , заголовок я подпортил. По недомыслию расчитывал, что подгрузится моя DLL, подправит где-то (где - не знал, хотел выяснить) в памяти заголовок, потом выполнится код из "битого" файла. Скидывать, собсно, смысла нет. Я прамил MZ на mz, PE на pe... Можно запускать вообще любую лабуду, обозвав ее *.exe или *.com. DLL через AppInit_DLLs грузится в любом случае, и исполняется. При этом на самом деле возникает какбэ окно консоли, но рулит там тот самфй ntvdm.exe. Эта типа опыт, сын ошибок трудных. Я долго втуплял, почему дамп памяти процесса (ну, это я его называю дамп памяти... :) )
    Код (Text):
    1.   invoke GetModuleHandle, NULL
    2.   mov z, eax  
    3.    invoke CreateFile, addr mtxt ,GENERIC_WRITE,0,0,OPEN_EXISTING,0,0
    4.    mov hFile,eax
    5.     invoke SetFilePointer,hFile,0,NULL,FILE_BEGIN
    6.    invoke WriteFile, hFile, z ,100000,offset BytesWrited,0
    получается такой одинаковый (и странный )для всех "порченых" файлов, к которым я гружу свою либу :))

    Mankubus, уже не тот самый файл. Заинтересовал меня принцип действия.
    А по поводу Ваших сомнений... Знаниев у меня мало. Допустим, лоадер не грузит весь образ (как я понял из эксперимента) в память. Куда-то же он грузит заголовок? В какие-то ядерные свои структуры. И где-то там присутсвует байтик(или битик), говорящий о том, что файл не следует передавать процессору на исполнение. Другое дело, что это уже ring0. А я не властелин колец. Из нулевого кольца и без этих фокусов можно много чего сделать... Забил я на это, ибо перспективы выловить интересные эффекты более не вижу.
    Все же, спасибо за интересный повод для экспериментов.
     
  6. HiroProtagonist

    HiroProtagonist New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2009
    Сообщения:
    9
    2ant
    а тьфу. Я не правильно тебя понял, думал через импорт грузишь. Так вот ntvdm - виртуальная машина для досовских программ, а тк она какбэ процесс полноценный, то К НЕЙ будет грузиться dll из AppInit. Как показывает опыт в неё грузятся файлы с любым заголовком, хоть там FU в начале поставь. Именно её и сдампила твоя длл. Таким образом лоадер не грузил твой файл, он просто проверил на совпадение сигнатуры, не сошлись - загрузил виртуалку и передал в неё файл. Там (в лоадере) стоят достаточно жесткие проверки на заголовок и шаг влево-вправо растрел на месте.
     
  7. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    -Что это хлюпает у меня в ботинке, Беримор?
    -Овсянка, Сэр!
    -Хм... А что она там делает, Бэримор?
    -Хлюпает, Сэр!
    "Жизнь замечательных людей: Капитан Очевидность".
    Дык, какие проверки? Механизм? Явки! Пароли! Что считается шагом, где фиксируется? В глаза смотреть! :))