### Win9X: Пишем в закрытые для записи файлы

Итак, ВОТ ОНО!!! После нескольких часов ковыряния маздая и упорного разглядывания хексов родились две ассемблерные команды, чему я весьма рад, ибо давно было пора. Но, как говорится, лучше послезавтра чем завтра, и поэтому вам представляется взъеб маздайных шар (в ring0):

        ; EBX=ring0 file handle, file may be opened in read-only mode
        mov     eax, [ebx+0Ch]            ; get some fucking pointer
        mov     byte ptr [eax+0Ch], 42h   ; set openmode to denynone, read-write

Хотите еще? Ну тогда вот вам полный экземпл записи в KERNEL32.DLL, аки же в любой другой файл независимо от того, открыт ли он, системный или еще какая хуйня:

        ...
        mov     eax, R0_OPENCREATFILE
        mov     bx, 2044h       ; no i24, denynone, r/o
        mov     cx, 32          ; archive (unused here)
        mov     dx, 01h         ; fail | open
        lea     esi, filename
        VxDcall IFSMGR, Ring0_FileIO
        xchg    ebx, eax

        mov     eax, [ebx+0Ch]  ; fuck share:
        mov     byte ptr [eax+0Ch], 42h ; denynone, read-write

        mov     eax, R0_WRITEFILE
        mov     ecx, size buf
        xor     edx, edx      ; filepos
        lea     esi, buf
        VxDcall IFSMGR, Ring0_FileIO

        mov     eax, R0_CLOSEFILE
        VxDcall IFSMGR, Ring0_FileIO
        ...

С ring3 дело обстоит сложнее: чтобы наебать шары нужен хендл нулевого кольца, а сгенерить его из ring3-хендла не так-то просто. Есть, правда, функция: IFSMGR_Win32_Get_Ring0_Handle, но она глюкавая и хуево как-то вызывается.

Метод, который применялся чтобы до всего этого допереть:
1. замечаем, что хендл файла в нулевом кольце суть поинтер куда-то-там
2. дальше видим, что по этому адресу (хендлу) куча офсетов
3. открываем два файла - один readonly и один readwrite
4. дампим и сравниваем память куда показывают офсеты из обоих хендлов
5. повторяем до полного охуения либо пока не станет все понятно ;-)

Кроме всего прочего было замечено: после 'mov eax, [ebx+0Ch]' в eax будет поинтер на структуру, первый дворд которой суть поинтер на следующую такую же структуру. Из этого можно поиметь например сканер хендлов.

В качестве бонуса прилагается пример инвертирования первого байта в KERNEL32.DLL, а так же инклюдники для перехода и работы с файлами в ring