Ты зачем почистил ВСЮ тему??? Таких "героев" как он, знать надо. Чтоб игнорировать в дальнейшем. Не заботишься ты о других людях. Наркоман небось.
Последнее редактирование модератором:
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
0х1С (28), хотя не факт, что на других системах оно будет совпадать:include 'win32ax.inc'
.data
capt db 'Тест',0
msg db 'Привет мир!',0
;//-------
.code
start: invoke MessageBox,0,msg,capt,0
invoke ExitProcess,0
.end start
0х80000000, значит нужно будет писать драйвер, что нас совсем не вдохновляет. Соответственно способ с правкой атрибутов для доступа к файлу SAM нам не подходит и нужно искать обходные пути.struct SYSTEM_HANDLE_INFORMATION
uCount dd 0 ;// кол-во структур 'SYSTEM_HANDLE' в буфере
aSH SYSTEM_HANDLE ;// массив структур..
ends
struct SYSTEM_HANDLE ;//<--- Size=16 (описывает один дескриптор)
uIdProcess dd 0 ;// PID процесса, которому принадлежит данный Handle
ObjectType db 0 ;// тип объекта (числовое значение)
Flags db 0 ;// флаги свойств дескриптора
Handle dw 0 ;// значение дескриптора
pAddress dd 0 ;// адрес объекта в пространстве ядра
GrantedAccess dd 0 ;// флаги доступа к объекту!!!
ends
format PE console
include 'win32ax.inc'
include 'ddk\ntdll.inc' ;//<-- смотри инклуд в скрепке
entry start
;//-------
.data
capt db 13,10,' OBJECT INFORMATION'
db 13,10,' =========================================='
db 13,10,' Current process PID.....: %04d'
db 13,10,' Total open object.......: %d',10
db 13,10,' PID Type Handle Obj_Addr Access'
db 13,10,' ==========================================',0
info db 13,10,' %04d 0x%02X 0x%04X 0x%08X 0x%08X',0
total db 13,10,' ========================='
db 13,10,' Total object found: %d',0
pid dd 0
found dd 0
count dd 0
frmt db '%s',0
align 16
buffSize dd 0
buffAddr dd 0
keyb db 0
;//-------
.code
start:
;//==== Заполняем буфер открытыми дескрипторами ==
;// первый выстрел холостой, чтобы получить требуемый размер буфа
invoke NtQuerySystemInformation,\
SystemHandleInformation,buffAddr,1024*2,buffSize
invoke VirtualAlloc,0,[buffSize],0x3000,4 ;// выделяем память под буф!
mov [buffAddr],eax ;// запомнить его адрес..
;// второй выстрел дробью, и в буфере получили все дескрипторы
invoke NtQuerySystemInformation,\
SystemHandleInformation,[buffAddr],[buffSize],0
;//==== Выводим шапку и общую информацию =========
mov eax,[buffAddr] ;// указатель на начало
mov eax,[eax] ;// берём первый дворд от туда
mov [count],eax ;// получили всего структур в буфере!
push eax ;//
invoke GetCurrentProcessId
mov [pid],eax ;// PID нашего процесса
pop ebx ;//
cinvoke printf,capt,eax,ebx ;// вывести инфу на консоль!!!
;//==== Полезная нагрузка Payload ================
mov esi,[buffAddr] ;// указатель на начало буфера
add esi,4 ;// пропускаем счётчик структур 'uCount'
mov ecx,[count] ;// возьмём этот счётчик в ECX для LOOP
@find: push esi ecx ;// запомнить!
and ebx,0 ;// три способа очистки регистров
xor ecx,ecx ;// ..^^^
sub edx,edx ;// ..^^^
;//---- парсим очередную структуру 'SYSTEM_HANDLE'
mov eax,[esi] ;// PID родителя
mov bl,[esi+4] ;// ObjectType
mov cx,[esi+6] ;// Handle
mov edx,[esi+8] ;// ObjTableAddr
mov edi,[esi+12] ;// Access
;//----
inc [found] ;// найдено +1
cinvoke printf,info,eax,ebx,ecx,edx,edi
pop ecx esi ;// восстановить счётчик и указатель
add esi,16 ;// переходим к следующей 'SYSTEM_HANDLE'
loop @find ;// промотать ECX-раз..
cinvoke printf,total,[found] ;// всего обработано структур
@exit: cinvoke scanf,frmt,keyb ;// ждём клаву..
cinvoke exit,0 ;// ..и на выход!
;//-------
section '.idata' import data readable
library msvcrt,'msvcrt.dll',kernel32,'kernel32.dll',ntdll,'ntdll.dll'
import msvcrt, printf,'printf',scanf,'scanf',exit,'exit'
import ntdll, NtQuerySystemInformation,'NtQuerySystemInformation'
include 'api\kernel32.inc'
@find: push esi ecx ;// запомнить!
and ebx,0 ;// три способа очистки регистров
xor ecx,ecx ;// ..^^^
sub edx,edx ;// ..^^^
;// парсим очередную структуру 'SYSTEM_HANDLE'
mov eax,[esi] ;// PID родителя
mov bl,[esi+4] ;// ObjectType
mov cx,[esi+6] ;// Handle
mov edx,[esi+8] ;// ObjTableAddr
mov edi,[esi+12] ;// Access
cmp eax,[pid] ;// -----> сравнить PID с нашим
jne @fuck ;// -----> если не равно..
inc [found] ;// иначе: найдено +1
cinvoke printf,info,eax,ebx,ecx,edx,edi
@fuck: pop ecx esi ;// восстановить счётчик и указатель
add esi,16 ;// переходим к следующей 'SYSTEM_HANDLE'
loop @find ;// промотать ECX-раз..
handle CreateFile (
lpFileName ;// указатель на имя файла, или устройства,
dwDesiredAccess ;// тип доступа к объекту – наш клиент!!!
dwShareMode ;// расшаривание объекта (см.ниже),
lpSecurityAttributes ;// опционально (наследование),
dwCreationDisposition ;// открыть или создать объект?
dwFlagsAndAttributes ;// опционально (атрибуты),
hTemplateFile ); ;// опционально (шаблон).
;//---------------------------
;// Если dwShareMode = 0, объект НЕ доступен никому, кроме родителя.
;// Чтобы создать разделяемый объект, используйте комбинацию следующих флагов:
;//---------------------------
FILE_SHARE_DELETE - доступ закрыт для всех, кроме открывшего.
FILE_SHARE_READ - доступ на чтение.
FILE_SHARE_WRITE - доступ на запись.
dwDesiredAccess Подразумевает
------------------------------------------
GENERIC_EXECUTE FILE_EXECUTE
FILE_READ_ATTRIBUTES
STANDARD_RIGHTS_EXECUTE
SYNCHRONIZE
GENERIC_READ FILE_READ_ATTRIBUTES
FILE_READ_DATA
FILE_READ_EA
STANDARD_RIGHTS_READ
SYNCHRONIZE
GENERIC_WRITE FILE_APPEND_DATA
FILE_WRITE_ATTRIBUTES
FILE_WRITE_DATA
FILE_WRITE_EA
STANDARD_RIGHTS_WRITE
SYNCHRONIZE
0х00000003, т.е. почти все сброшены. Причём таким-же флагом наделены все файлы в папке system32\config, а значит вся эта братия одного поля ягоды. Я не искал константы атрибутов доступа Access, но видимо флаг(3) определяет полное эмбарго на ввод-вывод, разрешая читать только файловые атрибуты через FILE_READ_ATTRIBUTES:lkd> dt _file_object
nt!_FILE_OBJECT
+0x000 Type : Int2B
+0x002 Size : Int2B
+0x004 DeviceObject : Ptr32 _DEVICE_OBJECT
+0x008 Vpb : Ptr32 _VPB
+0x00c FsContext : Ptr32 Void
+0x010 FsContext2 : Ptr32 Void
+0x014 SectionObjPointer : Ptr32 _SECTION_OBJECT_POINTERS
+0x018 PrivateCacheMap : Ptr32 Void
+0x01c FinalStatus : Int4B
+0x020 RelatedFileObject : Ptr32 _FILE_OBJECT
+0x024 LockOperation : UChar
+0x025 DeletePending : UChar
+0x026 ReadAccess : UChar
+0x027 WriteAccess : UChar
+0x028 DeleteAccess : UChar
+0x029 SharedRead : UChar
+0x02a SharedWrite : UChar
+0x02b SharedDelete : UChar
+0x02c Flags : Uint4B
+0x030 FileName : _UNICODE_STRING
+0x038 CurrentByteOffset : _LARGE_INTEGER
+0x040 Waiters : Uint4B
+0x044 Busy : Uint4B
+0x048 LastLock : Ptr32 Void
+0x04c Lock : _KEVENT
+0x05c Event : _KEVENT
+0x06c CompletionContext : Ptr32 _IO_COMPLETION_CONTEXT
0х024 лежит массив байт UChar, где зарыты атрибуты доступа к данному объекту. Например в байте по смещению 0х026 "ReadAccess" хранится 8-битная маска, в которой перечислены возможные операции из столбца "Подразумевает" (см.прототип функции CreateFile() выше). В свою очередь со-смещения 0х029 начинаются атрибуты шары и т.д. Кроме того, этим полям вторит и поле "LockOperation" – запрещённые операции.lkd> dt _large_integer
nt!_LARGE_INTEGER
+0x000 LowPart : Uint4B ;// младший dword позиции,
+0x004 HighPart : Int4B ;// старший dword.
+0x000 u : __unnamed
+0x000 QuadPart : Int8B ;// если система х64
;//------------------
;// Функция SetFilePointer() перемещает файловый указатель открытого файла.
;//------------------
SetFilePointer
hFile dd 0 ;// дескриптор файла или устройства
lDistanceToMove dd 0 ;// мл.слово указателя
lpDistanceToMoveHigh dd 0 ;// ст.слово
dwMoveMethod dd 0 ;// отправная точка:
;// ..начало, текущая позиция, или конец файла
lkd> dt _file_object
nt!_FILE_OBJECT
+0x000 Type : Int2B
+0x002 Size : Int2B
+0x004 DeviceObject : Ptr32 _DEVICE_OBJECT --+
+0x008 Vpb : Ptr32 _VPB |
+0x00c FsContext : Ptr32 Void V
...... |
;//---------------- |
lkd> dt _device_object ;//<--------<<-------------+
nt!_DEVICE_OBJECT
+0x000 Type : Int2B
+0x002 Size : Uint2B
+0x004 ReferenceCount : Int4B
+0x008 DriverObject : Ptr32 _DRIVER_OBJECT -+
+0x00c NextDevice : Ptr32 _DEVICE_OBJECT |
+0x010 AttachedDevice : Ptr32 _DEVICE_OBJECT |
+0x014 CurrentIrp : Ptr32 _IRP |
+0x018 Timer : Ptr32 _IO_TIMER |
...... |
;//---------------- |
lkd> dt _DRIVER_OBJECT ;//<--------<<-------------+
nt!_DRIVER_OBJECT
+0x000 Type : Int2B
+0x002 Size : Int2B
+0x004 DeviceObject : Ptr32 _DEVICE_OBJECT
+0x008 Flags : Uint4B
+0x00c DriverStart : Ptr32 Void
+0x010 DriverSize : Uint4B
+0x014 DriverSection : Ptr32 Void
+0x018 DriverExtension : Ptr32 _DRIVER_EXTENSION
+0x01c DriverName : _UNICODE_STRING ;//<--------//
+0x024 HardwareDatabase : Ptr32 _UNICODE_STRING
+0x028 FastIoDispatch : Ptr32 _FAST_IO_DISPATCH
+0x02c DriverInit : Ptr32 long
+0x030 DriverStartIo : Ptr32 void
+0x034 DriverUnload : Ptr32 void
+0x038 MajorFunction : [28] Ptr32 long ;//<--------//
FSCTL_GET_RETRIEVAL_POINTERS = 0x00090073 (коды файловой системы начинаются с приставки FS). Завернув его в пакет-запроса IRP (Interrupt_Request_Packet, см.структуру device_object) функция DeviceIoControl() передаёт его драйверу FS.BOOL DeviceIoControl (
HANDLE hDevice ;// имя или дескриптор устройство
DWORD dwIoControlCode ;// код операции для выполнения
LPVOID lpInBuffer ;// STARTING_VCN_INPUT_BUFFER (входные данные)
DWORD nInBufferSize ;// ..размер входного буфера = 8
LPVOID lpOutBuffer ;// RETRIEVAL_POINTERS_BUFFER (выходные данные)
DWORD nOutBufferSize ;// ..размер выходного буфера = ???
LPDWORD lpBytesReturned ;// переменная для получения кол-ва выходных байт
LPOVERLAPPED lpOverlapped ;// структура для асинхронной операции
);
struct STARTING_VCN_INPUT_BUFFER ;// Size = 8
StartingVcn dq 0 ;// Virtual Cluster Number
ends
struct RETRIEVAL_POINTERS_BUFFER ;// Size = 32
ExtentCount dd 0 ;// кол-во элементов 'Extents' в массиве
StartingVcn dq 0 ;// стартовый номер первой цепочки кластеров
struct ;// <---- массив элементов 'Extents'
NextVcn dq 0 ;// кол-во кластеров в цепочке
Lcn dq 0 ;// номер первого кластера в данной цепочке
ends
Extents dd 0 ;//
ends
format PE console
include 'win32ax.inc'
include 'ddk\ntdll.inc'
entry start
;//-------
.data
FSCTL_GET_RETRIEVAL_POINTERS = 0x00090073
struct STARTING_VCN_INPUT_BUFFER
StartingVcn dq 0 ; VCN = Virtual Cluster Number
ends
struct RETRIEVAL_POINTERS_BUFFER
ExtentCount dd 0 ;
StartingVcn dq 0 ;
struct
NextVcn dd 0,0 ;
Lcn dd 0,0 ;
ends
Extents dd 0 ;
ends
;buffPointer RETRIEVAL_POINTERS_BUFFER
capt db 13,10,' RAW-READ file: %s'
db 13,10,' ============================================='
db 13,10,' * Disk geometry'
db 13,10,' Sector size.....: %d'
db 13,10,' Cluster size.....: %d',10,0
fileInfo db 13,10,' * File info'
db 13,10,' Size.............: %d byte'
db 13,10,' Total fragments..: %d',10
db 13,10,' * Read address',0
fragment db 13,10,' Fragment #: %d'
db 13,10,' Start cluster....: %d'
db 13,10,' Data length......: %d clusters',10,0
fName db 'C:\WINDOWS\system32\config\SAM',0
Hndl dd 0
frmt db '%s',0
SecCls dd 0 ;// Число секторов на кластер.
BytesSec dd 0 ;// байт в секторе
FreeCls dd 0 ;// свободно кластеров
TotalClus dd 0 ;// всего кластеров
clsSize dd 0 ;// размер кластера
inpBuff dq 0 ;// передаваемые данные IRP
number dd 1 ;// счётчик фрагментов
outSize dd 0 ;// кол-во выходных байт
align 16
rpb RETRIEVAL_POINTERS_BUFFER ;// приёмный буфер
;//-------
.code
start:
;//==== Запрашиваем размеры кластера и сектора =====
invoke GetDiskFreeSpace,0,SecCls,BytesSec,FreeCls,TotalClus
mov eax,[SecCls] ;// секторов в кластере
mov ebx,[BytesSec] ;// байт в секторе
mul ebx ;// EAX = размер кластера!!!
mov [clsSize],eax ;// запомнить.
cinvoke printf,capt,fName,ebx,eax
;//==== Открываем SAM-файл на чтение атрибутов =====
invoke CreateFile,fName,FILE_READ_ATTRIBUTES,\
FILE_SHARE_READ,0,OPEN_EXISTING,0,0
mov [Hndl],eax ;// запомнить его дескриптор
;//==== Запрашиваем размер файла ===================
invoke GetFileSize,eax,0
push eax ;//
;//====
invoke DeviceIoControl,[Hndl],FSCTL_GET_RETRIEVAL_POINTERS,\
inpBuff,8,rpb,32,outSize,0
;//====
pop eax ;//
mov ebx,[rpb.ExtentCount] ;// число структур в буфере
cinvoke printf,fileInfo,eax,ebx
mov ecx,[rpb.ExtentCount] ;// ^^^^^
@findOffset: ;// цикл поиска карты кластеров..
push ecx ;//
mov eax,[rpb.Lcn+4] ;// номер первой цепочки кластеров файла
mov ebx,[rpb.NextVcn+4] ;// кол-во элементов Extents в структуре
cinvoke printf,fragment,[number],eax,ebx
pop ecx ;//
loop @findOffset ;// промотать по ECX..
@exit: cinvoke scanf,frmt,frmt ;//
cinvoke exit,0 ;// Game-Over!!!
;//-------
section '.idata' import data readable
library msvcrt,'msvcrt.dll',kernel32,'kernel32.dll'
import msvcrt, printf,'printf',scanf,'scanf',exit,'exit'
include 'api\kernel32.inc'
Статья читается полностью. Тезисы со ссылками на разделы появятся позже.
Ты зачем почистил ВСЮ тему??? Таких "героев" как он, знать надо. Чтоб игнорировать в дальнейшем. Не заботишься ты о других людях. Наркоман небось.
Комментарии
5