Пытаюсь разобраться с сабжем. В частности, если в APPINIT_DLLS прописана загрузка некоей DLL, которая, как говорит молва, подгружается к каждому файлу, импортирующему user32.dll Эксперимент показал, что даже при неправильной сигнатуре PE (Mancubus подкинул тему для раскопок) либа грузится. При этом выполняется код из главной процедуры. Кроме того, я вычитал следующее о работе системного загрузчика: 1) Следует ли из результатов моего опыта, что загрузчик проверяет заголовок, понимает, что он неверный, и , тем не менее, грузит мою DLL и выполняет ее код? 2) Существует ли способ подправить заголовок уже в памяти (на диске пробовал, позно ), так, что файл начнет таки выполняться? Или положительный ответ на первый вопрос не оставляет шансов?
Отвечаю сам себе. 1) Код приаттаченой DLL исполняется. Только не в контексте испорченого файла. 2) Вместо неправильного файла винда запускает ntvdm.exe, к которому и цепляется моя DLL Ну, хотя бы поупражнялся
2ant ntvdm грузится для old-exe (MZ/ZM/etc) файлов. Видимо у тебя попорчен pe-заголовок с сигнатурой. Хотя каким боком в таком случае подгружается dll мне не понятно. Или всетаки не ntvdm а обычная консоль? Скинул бы файлег посмотреть.
ant, если ты про тот самый файл, то он вроде exe а не dll, а если про что-то другое, то что за либа? 2) подправлять в памяти? это полсле загрузки loader'ом?
2 HiroProtagonist "Эксперимент показал, что даже при неправильной сигнатуре PE" Об этом и речь , заголовок я подпортил. По недомыслию расчитывал, что подгрузится моя DLL, подправит где-то (где - не знал, хотел выяснить) в памяти заголовок, потом выполнится код из "битого" файла. Скидывать, собсно, смысла нет. Я прамил MZ на mz, PE на pe... Можно запускать вообще любую лабуду, обозвав ее *.exe или *.com. DLL через AppInit_DLLs грузится в любом случае, и исполняется. При этом на самом деле возникает какбэ окно консоли, но рулит там тот самфй ntvdm.exe. Эта типа опыт, сын ошибок трудных. Я долго втуплял, почему дамп памяти процесса (ну, это я его называю дамп памяти... ) Код (Text): invoke GetModuleHandle, NULL mov z, eax invoke CreateFile, addr mtxt ,GENERIC_WRITE,0,0,OPEN_EXISTING,0,0 mov hFile,eax invoke SetFilePointer,hFile,0,NULL,FILE_BEGIN invoke WriteFile, hFile, z ,100000,offset BytesWrited,0 получается такой одинаковый (и странный )для всех "порченых" файлов, к которым я гружу свою либу ) Mankubus, уже не тот самый файл. Заинтересовал меня принцип действия. А по поводу Ваших сомнений... Знаниев у меня мало. Допустим, лоадер не грузит весь образ (как я понял из эксперимента) в память. Куда-то же он грузит заголовок? В какие-то ядерные свои структуры. И где-то там присутсвует байтик(или битик), говорящий о том, что файл не следует передавать процессору на исполнение. Другое дело, что это уже ring0. А я не властелин колец. Из нулевого кольца и без этих фокусов можно много чего сделать... Забил я на это, ибо перспективы выловить интересные эффекты более не вижу. Все же, спасибо за интересный повод для экспериментов.
2ant а тьфу. Я не правильно тебя понял, думал через импорт грузишь. Так вот ntvdm - виртуальная машина для досовских программ, а тк она какбэ процесс полноценный, то К НЕЙ будет грузиться dll из AppInit. Как показывает опыт в неё грузятся файлы с любым заголовком, хоть там FU в начале поставь. Именно её и сдампила твоя длл. Таким образом лоадер не грузил твой файл, он просто проверил на совпадение сигнатуры, не сошлись - загрузил виртуалку и передал в неё файл. Там (в лоадере) стоят достаточно жесткие проверки на заголовок и шаг влево-вправо растрел на месте.
-Что это хлюпает у меня в ботинке, Беримор? -Овсянка, Сэр! -Хм... А что она там делает, Бэримор? -Хлюпает, Сэр! "Жизнь замечательных людей: Капитан Очевидность". Дык, какие проверки? Механизм? Явки! Пароли! Что считается шагом, где фиксируется? В глаза смотреть! )