Добрый день! Сразу вопрос - как получить полное имя файла? Перехватываю ZwSetInformationFile Обработчик просто выводит имя файла Код (Text): NewSetInformationFile proc hfile:HANDLE,\ iosb:IO_STATUS_BLOCK,\ psi:FILE_NAME_INFORMATION,\ FileInformationLength,\ FileInformationClass pushad invoke RtlUnicodeStringToAnsiString, addr dwFileName,addr psi.FileName,TRUE invoke DbgPrint, $CTA0("\nFileName: %s\n"),addr dwFileName.Buffer popad ret NewSetInformationFile endp В справочнике: Код (Text): typedef struct _FILE_NAME_INFORMATION { ULONG FileNameLength; WCHAR FileName[1]; } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; Members FileNameLength Specifies the length, in bytes, of the file name string. FileName Specifies the first character of the file name string. This is followed in memory by the remainder of the string. то есть должно выводиться полное имя находящ. по адресу FileName но на выходе только это Итак как же получить полностью имя файла ? Исходник:
NTSTATUS RtlUnicodeStringToAnsiString( PANSI_STRING DestinationString, PUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString ); второй параметр передаешь WCHAR FileName[1], юзай RtlInitUnicodeString а потом уже RtlUnicodeStringToAnsiString если нужно вообще..
blast так ? значит Код (Text): NewSetInformationFile proc hfile:HANDLE,\ iosb:IO_STATUS_BLOCK,\ psi:FILE_NAME_INFORMATION,\ FileInformationLength,\ FileInformationClass local as:ANSI_STRING local us:UNICODE_STRING pushad invoke RtlInitUnicodeString, addr us, addr psi.FileName invoke RtlUnicodeStringToAnsiString, addr as, addr us, TRUE invoke DbgPrint, $CTA0("\nFileName: %s\n"),addr as.Buffer popad ret NewSetInformationFile endp
_sheva740 1) в ZwSetInformationFile в качестве второго и третьего параметров передаются указатели; 2) в третьем параметре не обязательно указатель на FILE_NAME_INFORMATION; 3) если вызов RtlUnicodeStringToAnsiString, addr as, addr us, TRUE завершился успешно, то необходимо вызвать invoke RtlFreeAnsiString, addr as; 4) чтобы увидеть вменяемые результаты необходимо обеспечить вызов оригинальной ZwSetInformationFile.
q_q спасибо вот поправил, правильно ? Код (Text): NewSetInformationFile proc hfile:HANDLE,\ iosb:IO_STATUS_BLOCK,\ psi:FILE_NAME_INFORMATION,\ FileInformationLength,\ FileInformationClass local as:ANSI_STRING local us:UNICODE_STRING pushad invoke RtlInitUnicodeString, addr us, addr psi.FileName ;invoke RtlInitUnicodeString, addr us,psi.FileName invoke RtlUnicodeStringToAnsiString, addr as, addr us, TRUE .if eax == STATUS_SUCCESS invoke DbgPrint, $CTA0("\nFileName: %s\n"),as.Buffer invoke RtlFreeAnsiString, addr as .endif popad push FileInformationClass push FileInformationLength lea eax,psi push eax lea eax,iosb push eax push hfile call dwOldSetInformationFile ret NewSetInformationFile endp
_sheva740 правильно? 1) не учел; 2) не учел; 3) учел 4) т.к. п.1 не учел, то вызов оригинальной ZwSetInformationFile неверный. CrystalIC > Фильтруй инфокласс Ты про FileNameInformation(9)? Разве он часто ходит? Afaik надо смотреть в сторону ZwQueryInformationFile/ObReferenceObjectByHandle etc., только очень аккуратно.
q_q Вот смотрю я на код в 5-м посте и никак не найду где определяетсо что инфокласс именно FileNameInformation... Не вижу..
CrystalIC спасибо вот поправил Код (Text): NewSetInformationFile proc hfile:HANDLE,\ iosb:IO_STATUS_BLOCK,\ psi:FILE_NAME_INFORMATION,\ FileInformationLength,\ FileInformationClass local as:ANSI_STRING local us:UNICODE_STRING ;========================================SEH assume fs:nothing push offset ExceptionHandler push fs:[0] mov fs:[0], esp assume fs:error mov seh.SafeEip, offset SafePlace1 mov seh.PrevEbp, ebp mov seh.PrevEsp, esp ;========================================SEH pushad ;invoke RtlInitUnicodeString, addr us, addr psi.FileName invoke RtlInitUnicodeString, addr us,psi.FileName invoke RtlUnicodeStringToAnsiString, addr as, addr us, TRUE .if eax == STATUS_SUCCESS invoke DbgPrint, $CTA0("\nFileName: %s\n"),as.Buffer invoke RtlFreeAnsiString, addr as .endif popad ;========================================SEH SafePlace1: ; Remove seh-frame assume fs:nothing pop fs:[0] add esp, sizeof DWORD assume fs:error assume fs:nothing push offset ExceptionHandler push fs:[0] mov fs:[0], esp assume fs:error ;========================================SEH push FileInformationClass push FileInformationLength lea eax,psi push eax lea eax,iosb push eax push hfile call dwOldSetInformationFile ret NewSetInformationFile endp Но пока не пашет, может я как то не так вызываю оригинальную ZwSetInformationFile? >Фильтруй инфокласс. покажите, пожалуйста, кусочек кода.
CrystalIC Я не о коде от ТС'а, ну поставит он .if FileInformationClass = 9, а потом придет на форум, "опять не работает". Я о том, как часто по сравнению с другими инфоклассами в ZwSetInformationFile приходит девятый?
q_q Он не приходит никогда, данный инфокласс используетсо в NtQueryInformationFile, в NtSetInformationFile он не может применятсо. Может автор имел ввиду FileRenameInformation ?
CrystalIC > Может автор имел ввиду ... Я гадать не буду. _sheva740 > вот поправил Ничего ты не поправил. > покажите, пожалуйста, кусочек кода. Каркас Код (Text): NewSetInformationFile proc hfile:HANDLE,\ iosb : ptr IO_STATUS_BLOCK,\ psi : LPVOID,\ FileInformationLength,\ FileInformationClass .if FileInformationClass == тут_номер_требуемого_инфокласса .endif push FileInformationClass push FileInformationLength push psi push iosb push hfile call dwOldSetInformationFile ret NewSetInformationFile endp
q_q Кривой каркас у тебя. Должно быть так: Код (Text): ENTER_SEH macro ExceptionHandler Local Delta1, Delta2 assume fs:nothing push ebp Call Delta1 Delta1: add dword ptr [esp],(ExceptionExit_ - Delta1) Call Delta2 Delta2: add dword ptr [esp],(ExceptionHandler - Delta2) push dword ptr fs:[TEB.Tib.ExceptionList] mov dword ptr fs:[TEB.Tib.ExceptionList],esp endm LEAVE_SEH macro Frame clc ExceptionExit_: pop dword ptr fs:[TEB.Tib.ExceptionList] lea esp,[esp + 4*3 + Frame] endm ExceptionHandler proc C mov esp,dword ptr [esp + 8] ;(esp) -> ExceptionList mov eax,STATUS_UNSUCCESSFUL mov ebp,dword ptr [esp + 4*3] stc jmp dword ptr [esp + 4*2] ExceptionHandler endp ZwSetInformationFileHandler proc FileHandle:HANDLE, IoStatusBlock:PIO_STATUS_BLOCK, FileInformation:PVOID, FileInformationLength:ULONG, FileInformationClass:ULONG cmp FileInformationClass,FileRenameInformation jne call_ ENTER_SEH ExceptionHandler [...] LEAVE_SEH NULL jc call_ [...] call_: leave call delta_ delta_: pop eax jmp dword ptr [eax + (offset OriginalHandler - offset delta_)] ZwSetInformationFileHandler endp OriginalHandler PVOID ? Это если юзермод, также лучше заменить оригинальный хэндлер на вызов сервиса через 2e шлюз, но это в том случае если нет цепочки перехватчиков. В случае кернелмода сех аналогично, только имена структур другие(KPCR.NtTib.ExceptionList), смещение ноль также.
CrystalIC > Должно быть так ... лучше заменить оригинальный хэндлер на вызов сервиса через 2e шлюз ... Ты в архиве код видел? > Кривой каркас у тебя. "Смешно. Пойду учиться." (С) Four-F
q_q CrystalIC >1) не учел; >2) не учел; >3) учел >4) т.к. п.1 не учел, то вызов оригинальной ZwSetInformationFile неверный. вот вроде как 4) - теперь работает, то есть вызов оригинальной ZwSetInformationFile происходит. Но я ооочень прошу ... просвети дурака, сам запомню детям передам .... как выполнить 1) и 2) ??? плиз. Код (Text): NewSetInformationFile proc hfile:HANDLE,\ iosb:IO_STATUS_BLOCK,\ psi:FILE_NAME_INFORMATION,\ FileInformationLength,\ FileInformationClass local as:ANSI_STRING local us:UNICODE_STRING push FileNameInformation push sizeof psi lea eax,psi push eax lea eax,iosb push eax push hfile call dwOldSetInformationFile ;========================================SEH ;seh up ... pushad invoke RtlInitUnicodeString, addr us, addr psi.FileName invoke RtlUnicodeStringToAnsiString, addr as, addr us, TRUE .if eax == STATUS_SUCCESS invoke DbgPrint, $CTA0("\nFileName: %s\n"),as.Buffer invoke RtlFreeAnsiString, addr as .endif popad ;========================================SEH ;seh down ... ret NewSetInformationFile endp
Он сказал, что это значит - хз, спроси у него. Не известно какой инфокласс ты используешь, а от него зависит передаваемая в буфере инфа.
вот такой вариант работает (в смысле не вываливается в BSOD) но имена файлов показывает пока криво. При попытке переименовать файл отображает что-то типа имени файла. Код (Text): NewSetInformationFile proc hfile:HANDLE,\ iosb : ptr IO_STATUS_BLOCK,\ psi : DWORD,\ FileInformationLength,\ FileInformationClass local as:ANSI_STRING local us:UNICODE_STRING push FileInformationClass push sizeof psi push psi push iosb push hfile call dwOldSetInformationFile ;========================================SEH ;seh up ... pushad .if FileInformationClass == FileRenameInformation assume esi: PTR FILE_NAME_INFORMATION lea eax,[esi].FileName invoke RtlInitUnicodeString, addr us, eax invoke RtlUnicodeStringToAnsiString, addr as, addr us, TRUE .if eax == STATUS_SUCCESS invoke DbgPrint, $CTA0("\nFileName: %s\n"),as.Buffer invoke RtlFreeAnsiString, addr as .endif .endif assume esi:nothing popad ;========================================SEH ;seh down ... ret NewSetInformationFile endp Значит в зависимости от типа файловой операции в параметре FileInformationClass та или иная константа. Вот только где бы почитать про эти FileInformationClass - что каждый из них значит и как заполняет FILE_NAME_INFORMATION ?
_sheva740 Код (Text): ... ;; push sizeof psi ;; что это за самодеятельность? push FileInformationLength ;; ++ ... ;; assume esi: PTR FILE_NAME_INFORMATION ;; lea eax,[esi].FileName ;; не знаю, заполнил ли ты ESI, я воспользуюсь ECX ;; + обрати внимание на имя mov ecx,psi ;; ++ assume ecx: ptr FILE_LINK_INFORMATION ;; ++ lea ecx,[ecx].FileName ;; ++ invoke RtlInitUnicodeString, addr us, ecx ...