|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 9, 2004 21:01:07 Нужно написать программу, которая перехватывала бы обращения к файлам, и в некоторых случаях запрещала бы к ним доступ. Для этого написал VxD'шник, который юзает IFSMgr_InstallFileSystemApiHook. Всё работает, только не знаю как прочитать имя файла. Вот цитата из руководства:
hook_procedure:
push ebp
mov ebp,esp
sub esp,20h
; С этого места, мы можем найти параметры
; используя стек
; ebp+00h -> сохраненное значение EBP.
; ebp+04h -> адрес возврата.
; ebp+08h -> адрес FSD функции, которая вызывается для
; этого API.
; ebp+0Ch -> номер функции, которую пытаются выполнить
; ebp+10h -> номер диска, на котором все происходит (1
=A:,
; -1 если UNC)
; ebp+14h -> тип диска
; ebp+18h -> кодовая страница, в которой юзер набрал
свою
; строку- BCS_ANSI = ANSI, BCS_OEM = OEM
; ebp+1Ch -> указатель на структуру вызова IFS менеджера
; (IOREQ)
Потом в eax они записывают адрес строки в UNICODE, в которой содержиться путь к фалу: mov eax,[ebp+1Ch] mov eax,[eax+0Ch] ; EAX = Указатель на строку Но по этому адресу не фига нету, одни вопросы (если смотреть в SoftIce). И адрес странный - 0ffffbbbh. Подскажите, как узнать путь к файлу из обработчика IFS. |
|
|
Дата: Окт 9, 2004 22:51:09 · Поправил: _Chingachguk_ Возможно, стоит предпринять следующие шаги: адрес может быть верным, но страница с именем файла выгружена - при первом обращении к ней диспечер получит page fault и догрузит ее (достаточно в приложении перед CreateFile прочесть байт из имени файла), можно вызвать в тестовой проге CreateFile, запомнить адрес и искать его в этих структурах или (если kernel копирует его в tmp буфер) следить за ним через bpm. Есть еще вариант использовать сервис VMM: 0090h hook device service EAX = service ID (high word = VxD ID, low = service number) ESI -> new handler Для перехвата функции IFS открытия файла: IFSMgr_Ring0_FileIO This service provides a register-based VxD callable interface to the common file system functions ... [ESI] Flat pointer to the pathname of the file to be opened/created. Carry flag clear, operation was successful |
|
|
Дата: Окт 10, 2004 14:27:27 Нет, страница не может быть выгружена, т.к. это обработчик всех событий файловой системы, он должен работать очень быстро. К тому же я попробывал сделать, как ты пишешь - несколько раз срабатывает исключение 0eh (page fault), а потом комп просто виснет. Скорей всего неправильно указан адрес, или я чего то не понимаю. Может есть ещё какие-нибудь способы перехвата обращений к файлам??? |
|
|
Дата: Окт 10, 2004 15:57:32 К тому же я попробывал сделать, как ты пишешь Ты имеешь в виду перехват сервиса IFSMgr_Ring0_FileIO с помощью вызова hook device service ? |
|
|
Дата: Окт 10, 2004 19:26:40 нет, я имею в виду: адрес может быть верным, но страница с именем файла выгружена - при первом обращении к ней диспечер получит page fault и догрузит ее (достаточно в приложении перед CreateFile прочесть байт из имени файла), можно вызвать в тестовой проге CreateFile, запомнить адрес и искать его в этих структурах или (если kernel копирует его в tmp буфер) следить за ним через bpm. |
|
|
Дата: Окт 10, 2004 23:04:51 Хмм. Если хочешь, я могу попробовать твой код у себя. |
|
|
Дата: Окт 11, 2004 01:00:35 Давай. Только это пока не VxD, а exe, переходит в Ring0 через LDT. VxD я потом напишу, если разберусь с этим. Компилируется обычным TASM.exe и Link32.exe. Там в начале бесконечный цикл, чтоб поймать прогу SoftIce'ом. Сильно не пугайся, код не оптимизирован, т.к. писал просто, чтоб проверить как это всё работает. Начинай смотреть сразу с обработчика (процедура New).
.586p
text segment
assume cs:text,ds:text
begin:
mov ecx,3 ;бесконечный цикл
loop begin
; дальше идёт процедура перехода в RING0 через LDT
mov edi,eax
push 4
push 0bff70000h
mov eax,edi
add eax,(offset winnt-offset begin)
push eax
mov edx,esp
mov eax,10ah
int 2eh
cmp dword ptr [eax],0
je ntyes
jmp ntno
ntyes:
ntno:
;--------------Ring3=>Ring0-----------
sgdt psevd
mov eax,dword ptr [edi+offset psevd-offset begin+2]
xor esi,esi
sldt si
add eax,esi
mov bh,byte ptr [eax+7]
mov bl,byte ptr [eax+4]
shl ebx,10h
mov bx,word ptr [eax+2]
lea esi,[edi+offset slus-offset begin]
mov eax,offset ring0
mov word ptr [esi],ax
shr eax,10h
mov word ptr [esi+6],ax
mov eax,dword ptr [esi]
mov dword ptr [ebx],eax
mov eax,dword ptr [esi+4]
mov dword ptr [ebx+4],eax
;--------------------Call ring0--------------------
;На этом call в SoftIce нужно нажать F8
db 09ah
dd 0
dw 07h
;--------------------Ring0------------------------
Ring0:
; здесь начинается самое интересное
push 100h ; Это параметры, не помню что они значат
push 1f4h
int 20h ; Вызов VxD сервиса для выделения памяти
db 4fh,00h,01h,00,83h,0C4h,08h
;eax= адрес выделенной памяти
;Дальше идёт копирование обработчика
mov ecx,offset newend-offset new ;ecx=размер обработчика
xor edx,edx
loop123:
mov bl,byte ptr [edi+offset new+edx-offset begin] ;откуда
mov byte ptr [eax+edx],bl ;куда
inc edx
loop loop123
;в обработчик записывается адрес буфера для преобразованной строки
mov edi,eax
add edi, offset filename-offset new
mov dword ptr [eax+offset file_addr-offset new], edi
;---------------Ifs-------------------------------------
;Вызов VxDCall IFSMgr_InstallFileSystemApiHook для установки обработчика
mov ebx,eax
push eax
int 20h
db 67h,00,40h,00
add esp,4
mov esi,eax
mov eax,[esi]
mov dword ptr [offset call1-offset new+ebx],eax
; Здесь следует в SoftIce установить bpx eax, чтоб вылазил на обработчике
retf
; Набрать в SoftIce Exit
;---------------------------Обработчик событий IFS
New:
push ebp
mov ebp,esp
pusha
;===================================================================== ==========================
;идёт подготовка параметров для вызова VxDCall UniToBCSPath (перевод UNICODE в ASCII)
xor eax,eax
push eax ; EAX = 0 -> Конвертируем в ASCII
mov eax,100h
push eax ; EAX = Размер конвертируемой строки
;----------вот здесь трабла
mov eax,[ebp+1ch]
mov eax,[eax+0Ch] ; EAX = Указатель на строку, здесь не фига нету
;----------------------------
push eax
db 0bfh ;mov edi, адрес буфера filename, куда будет писаться ASCII строка
file_addr: dd 0
push edi
int 20h ;VxDCall переводит UNICODE в ASCII, происходит page fault
db 41h, 00, 40h, 00
add esp,10h
;===================================================================== ==========================
popa
pop ebp
;Вызов системного обработчика
db 0eah
call1: dd 0
dw 28h
filename:
db 100h dup(0)
newend:
;==========-Data-================
psevd df 0
slus: dw 0,28h
db 0
db 0ech
dw 0
winnt: dd 0
ends
end begin
|
|
|
Дата: Окт 11, 2004 17:29:27 Значит, так. Твой код не писал, написал свой в обычном VxD. Действительно, на входе после команд: mov eax,[ebp+1Ch] mov eax,[eax+0Ch] в eax указатель то на unicode-name file (правда, там идет какой-то начальный символ, но ты разберешься, я думаю сам), то явно не то - 0FFFFFBBBh. Дело видимо вот в чем: ; ebp+0Ch -> номер функции, которую пытаются выполнить Для нормальных указателей тут сидит 2Ch, в то же время как для левоты - 12h. Не знаю, что значат эти номера функции, но ИМХА, дело в этом. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.122 |