Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват Native API, Перехват ZwQueryDirectoryFile 
:(
    Опции темы
DoZENT
Дата 8.1.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 2.6.2006

Репутация: 1
Всего: 1



Цитата

смекаешь?

С ExitProcess и его одним параметром какнить сам разобрался бы. Кто-нибудь может привести ПРИМЕР перехвата ZwQueryDirectoryFile smile  smile  smile 

Это сообщение отредактировал(а) DoZENT - 8.1.2007, 19:16


--------------------
Какая боль, какая боль, Internet Explorer 5.0...
PM MAIL   Вверх
bartram
Дата 9.1.2007, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1606
Регистрация: 22.2.2004
Где: Russia, Samara

Репутация: 3
Всего: 29



DoZENT, я тебе пример дал, сделай по примеру. Структура описанная тем более у тебя есть. Если что то не получается спрашивай, по коду будет проще понять что у тебя не получается и что ты хочешь сделать smile


--------------------
В каждом из нас спит гений, но с каждым днем все крепче ;-)
bartram.ru
Twitter
user posted image 

PM MAIL ICQ   Вверх
DoZENT
Дата 9.1.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 2.6.2006

Репутация: 1
Всего: 1



ОК, вот весь код:
Код

library engine;


uses
  Windows;

type
 OldCode = packed record
  One: dword;
  two: word;
 end;

 NTStatus = Cardinal;


far_jmp = packed record
  PuhsOp: byte;
  PushArg: pointer;
  RetOp: byte;
 end;


const
FileDirectoryInformation=1;
FileFullDirectoryInformation=2;
FileBothDirectoryInformation=3;
FileNamesInformation=12;


//Структура записи в FileInformation для FileDirectoryInformation:
type _FILE_DIRECTORY_INFORMATION = packed record 
NextEntryOffset:ULONG;
Unknown:ULONG;
CreationTime,
LastAccessTime,
LastWriteTime,
ChangeTime,
EndOfFile,
AllocationSize:int64; 
FileAttributes:ULONG;
FileNameLength:ULONG; 
FileName:PWideChar;
end;

//для FileFullDirectoryInformation:
type _FILE_FULL_DIRECTORY_INFORMATION = packed record
NextEntryOffset:ULONG;
Unknown:ULONG; 
CreationTime,
LastAccessTime, 
LastWriteTime,
ChangeTime,
EndOfFile,
AllocationSize:int64;
FileAttributes:ULONG; 
FileNameLength:ULONG;
EaInformationLength:ULONG ;
FileName:PWideChar; 
end;

//для FileBothDirectoryInformation:
type _FILE_BOTH_DIRECTORY_INFORMATION = packed record
NextEntryOffset:ULONG;
Unknown:ULONG;
CreationTime,
LastAccessTime,
LastWriteTime, 
ChangeTime,
EndOfFile,
AllocationSize:int64;
FileAttributes:ULONG;
FileNameLength:ULONG;
EaInformationLength:ULONG ;
AlternateNameLength:ULONG;
AlternateName:array[0..11] of WideChar;
FileName:PWideChar; 
end;

//и для FileNamesInformation:
type _FILE_NAMES_INFORMATION = packed record
NextEntryOffset:ULONG;
Unknown:ULONG;
FileNameLength:ULONG;
FileName:PWideChar;
end;

type
PUnicodeString = ^TUnicodeString;
  TUnicodeString = packed record
    Length: Word;
    MaximumLength: Word;
    Buffer: PWideChar;
end;


//нас интересует структура ClientId:
type
PClientID = ^TClientID;
TClientID = packed record
UniqueProcess:cardinal;
UniqueThread:cardinal;
end;

var
 JmpMbw: far_jmp;
 OldMbw : OldCode;
 MbwAdr : pointer;


Function ZwQueryDirectoryFile(FileHandle: dword;
Event: dword;
ApcRoutine: pointer;
ApcContext: pointer;
IoStatusBlock: pointer;
FileInformation: pointer;
FileInformationLength: dword;
FileInformationClass: dword;
ReturnSingleEntry: bool;
FileName: PUnicodeString;
RestartScan: bool): NTStatus;
stdcall; external 'ntdll.dll';

function TrueZwQueryDirectoryFile (
FileHandle              :dword;
Event                   :dword;
ApcRoutine              :pointer;
ApcContext              :pointer;
var IoStatusBlock       :pointer;
var FileInformation     :pointer;
FileInformationLength   :ULONG;
FileInformationClass    :DWORD;
ReturnSingleEntry       :boolean;
FileName                :PUnicodeString;
RestartScan             :boolean) : NTStatus;stdcall;
var
written : Cardinal;
begin


  WriteProcessMemory (INVALID_HANDLE_VALUE, MbwAdr,
                     @OldMbw, SizeOf(OldCode), Written);

  Result := ZwQueryDirectoryFile (FileHandle, Event, ApcRoutine,ApcContext,
                                  IoStatusBlock, FileInformation,FileInformationLength,
                                  FileInformationClass,ReturnSingleEntry,FileName,RestartScan);



  WriteProcessMemory(INVALID_HANDLE_VALUE, MbwAdr,
                     @JmpMbw, SizeOf(far_jmp), Written);

end;



function NewZwQueryDirectoryFile (
FileHandle              :dword;
Event                   :dword;
ApcRoutine              :pointer;
ApcContext              :pointer;
var IoStatusBlock       :pointer;
var FileInformation     :pointer;
FileInformationLength   :ULONG;
FileInformationClass    :DWORD;
ReturnSingleEntry       :bool;
FileName                :PUnicodeString;
RestartScan             :boolean) : NTStatus;stdcall;

begin

  Result := TrueZwQueryDirectoryFile (FileHandle, Event, ApcRoutine,ApcContext,
                                  IoStatusBlock, FileInformation,FileInformationLength,
                                  FileInformationClass,ReturnSingleEntry,FileName,RestartScan);



end;







Procedure SetHook();
var
 hNTdll: dword;
 Bytes: dword;
begin
  hNTDll := GetModuleHandle('ntdll.dll');
  MbwAdr  := GetProcAddress(hNTdll, 'ZwQueryDirectoryFile');
  ReadProcessMemory(INVALID_HANDLE_VALUE, MbwAdr, @OldMbw, SizeOf(OldCode), Bytes);
  JmpMbw.PuhsOp  := $68;
  JmpMbw.PushArg := @NewZwQueryDirectoryFile;
  JmpMbw.RetOp   := $C3;
  WriteProcessMemory(INVALID_HANDLE_VALUE, MbwAdr, @JmpMbw, SizeOf(far_jmp), Bytes);
end;

Procedure Unhook();
var
 Bytes: dword;
begin
  WriteProcessMemory(INVALID_HANDLE_VALUE, MbwAdr, @OldMbw, SizeOf(OldCode), Bytes);
end;


// залепа
Function MessageProc(code : integer; wParam : word;
                    lParam : longint) : longint; stdcall;
begin
 CallNextHookEx(0, Code, wParam, lparam);
 Result := 0;
end;

Procedure SetGlobalHookProc();
begin
 SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
 Sleep(INFINITE);
end;
//

Procedure SetGlobalHook();
var
 hMutex: dword;
 TrId: dword;
begin
 hMutex := CreateMutex(nil, false, 'AdvareHook');
 if GetLastError = 0 then
 CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else
 CloseHandle(hMutex);
end;


procedure DLLEntryPoint(dwReason: DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH: begin
                          SetGlobalHook();
                          SetHook();
                        end;
    DLL_PROCESS_DETACH: UnHook();
    DLL_THREAD_DETACH : UnHook ();
  end;
end;


begin
 DllProc := @DLLEntryPoint;
 DLLEntryPoint(DLL_PROCESS_ATTACH);
end.




Кое-что подправил, теперь процесс, вызывающий функцию не завершается, но не может найти ни одного файла (например total commander выдает только список дисков, но зайти в них не может).


--------------------
Какая боль, какая боль, Internet Explorer 5.0...
PM MAIL   Вверх
drkot
Дата 9.1.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



Сори за возможный оффтоп.

DoZENT, а у тебя OutPost случаем не стоит? (из последних версий 4)
А то у меня проблемы с перехватом возникли после очередного обновления. При включенном файрволе при попытке перехвата целевое приложение вылетало с ошибкой. После отключения бока исчезали.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
W4FhLF
Дата 9.1.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Блин, да сколько можно говорить, чтобы ты попробовал отладить процесс? Чё гадать и как дурак тыкать пальцем в небо? Посмотри как и что происходит, локализуй ошибку и исправь её.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
DoZENT
Дата 9.1.2007, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 2.6.2006

Репутация: 1
Всего: 1



Цитата

DoZENT, а у тебя OutPost случаем не стоит?

Нет, KIS Forever  smile

 
Цитата

Блин, да сколько можно говорить, чтобы ты попробовал отладить процесс? Чё гадать и как дурак тыкать пальцем в небо? Посмотри как и что происходит, локализуй ошибку и исправь её.

Каким образом отлаживать? Если ты имеешь в виду установку прерывания, то на ZwQueryDirectoryFile брейкпойнт на ставится, т.к. это недокументированная ф-я.

Это сообщение отредактировал(а) DoZENT - 9.1.2007, 17:32


--------------------
Какая боль, какая боль, Internet Explorer 5.0...
PM MAIL   Вверх
W4FhLF
Дата 9.1.2007, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Цитата(DoZENT @  9.1.2007,  17:25 Найти цитируемый пост)
Каким образом отлаживать? Если ты имеешь в виду установку прерывания, то на ZwQueryDirectoryFile брейкпойнт на ставится, т.к. это недокументированная ф-я.


ZwQueryDirectoryFile является переходником к ядерной функции и экспортируется из ntdll.dll, именно это тебе позволяет перехватывать её таким методом, и именно это позволит отладить этот процесс.
Берёшь любой отладчик, я обычно использую OllyDBG, загружаешь в неё приложение в которое будет проинжектирована твоя dll и в "Опции > Опции отладки > Events" ставишь галку на "Break on new module (DLL)", далее инжектируешь dll в процесс и прерываешься на процедуре DLLEntryPoint, трейсишь установку хуков, смотришь всё ли в порядке, далее ставишь бряк на ZwQueryDirectoryFile(bp ZwQueryDirectoryFile) и пускаешь программу дальше. Когда программа вызовет эту функцию ты прервёшься на её начале, где будет стоять прыжок(push @ZwQueryDirectoryFile / retn) на процедуру NewZwQueryDirectoryFile. Заходишь в эту процедуру, трейсишь и смотришь правильно ли всё происходит, тем самым ты сможешь проконтролировать весь процесс установки перехвата и его срабатывания. 

Это сообщение отредактировал(а) W4FhLF - 9.1.2007, 20:18


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
DoZENT
Дата 9.1.2007, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 2.6.2006

Репутация: 1
Всего: 1



Цитата

агружаешь в неё приложение в которое будет проинжектирована твоя dll

Я использую сплайсинг, поэтому dll не будет проинжектированна в процесс. Или я что-то неправильно понимаю?


Это сообщение отредактировал(а) DoZENT - 9.1.2007, 20:56


--------------------
Какая боль, какая боль, Internet Explorer 5.0...
PM MAIL   Вверх
dumb
Дата 10.1.2007, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Цитата(DoZENT @  9.1.2007,  20:54 Найти цитируемый пост)
Я использую сплайсинг, поэтому dll не будет проинжектированна в процесс.

как думаешь, зачем у тебя SetWindowsHookEx используется? - как раз для подгрузки dll во все процессы. а подгрузившись, ты уже устанавливаешь хук на ZwQueryDirectoryFile(изменения, вносимые WriteProcessMemory локальны для каждого процесса).
PM MAIL   Вверх
DoZENT
Дата 10.1.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 2.6.2006

Репутация: 1
Всего: 1



Цитата

как думаешь, зачем у тебя SetWindowsHookEx используется? - как раз для подгрузки dll во все процессы. а подгрузившись, ты уже устанавливаешь хук на ZwQueryDirectoryFile(изменения, вносимые WriteProcessMemory локальны для каждого процесса).


Почитал MSDN, понял, спасибо  smile Такое вопрос, если внедрение делается одной функцией, тогда зачем тем же автором создавалось такое:

Код

{ Внедрение Dll в процесс }
Function InjectDll(Process: dword; ModulePath: PChar): boolean;
var
  Memory:pointer;
  Code: dword;
  BytesWritten: dword;
  ThreadId: dword;
  hThread: dword;
  hKernel32: dword;
  Inject: packed record
           PushCommand:byte;
           PushArgument:DWORD;
           CallCommand:WORD;
           CallAddr:DWORD;
           PushExitThread:byte;
           ExitThreadArg:dword;
           CallExitThread:word;
           CallExitThreadAddr:DWord;
           AddrLoadLibrary:pointer;
           AddrExitThread:pointer;
           LibraryName:array[0..MAX_PATH] of char;
          end;
begin
  Result := false;
  Memory := VirtualAllocEx(Process, nil, sizeof(Inject),
                           MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  if Memory = nil then Exit;

  Code := dword(Memory);
  //инициализация внедряемого кода:
  Inject.PushCommand    := $68;
  inject.PushArgument   := code + $1E;
  inject.CallCommand    := $15FF;
  inject.CallAddr       := code + $16;
  inject.PushExitThread := $68;
  inject.ExitThreadArg  := 0;
  inject.CallExitThread := $15FF;
  inject.CallExitThreadAddr := code + $1A;
  hKernel32 := GetModuleHandle('kernel32.dll');
  inject.AddrLoadLibrary := GetProcAddress(hKernel32, 'LoadLibraryA');
  inject.AddrExitThread  := GetProcAddress(hKernel32, 'ExitThread');
  lstrcpy(@inject.LibraryName, ModulePath);
  //записать машинный код по зарезервированному адресу
  WriteProcessMemory(Process, Memory, @inject, sizeof(inject), BytesWritten);
  //выполнить машинный код
  hThread := CreateRemoteThread(Process, nil, 0, Memory, nil, 0, ThreadId);
  if hThread = 0 then Exit;
  CloseHandle(hThread);
  Result := True;
end;


?


--------------------
Какая боль, какая боль, Internet Explorer 5.0...
PM MAIL   Вверх
DoZENT
Дата 10.1.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 2.6.2006

Репутация: 1
Всего: 1



Протрассировал процесс, не нашел ничего подозрительного. Хуки расставляются правильно, происходит вызов ZwQueryDirectoryFile, функцией возвращается какое-то числовое значение, и происходит вызов GetLastError... Ладно, буду копаться дальше  smile 


--------------------
Какая боль, какая боль, Internet Explorer 5.0...
PM MAIL   Вверх
W4FhLF
Дата 10.1.2007, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Цитата(DoZENT @  10.1.2007,  18:04 Найти цитируемый пост)
если внедрение делается одной функцией, тогда зачем тем же автором создавалось такое:


Это инжектирование DLL в один отдельно взятый процесс. Ну а что делает код и так должно быть понятно.




--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
dumb
Дата 11.1.2007, 04:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Цитата(DoZENT @  10.1.2007,  18:56 Найти цитируемый пост)
функцией возвращается какое-то числовое значение, и происходит вызов GetLastError

какое значение? что возвращает GetLastError? всегда одни и те же значения?
PM MAIL   Вверх
MetalFan
Дата 11.1.2007, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(DoZENT @  9.1.2007,  16:33 Найти цитируемый пост)
Function MessageProc(code : integer; wParam : word;
                    lParam : longint) : longint; stdcall;
begin
 CallNextHookEx(0, Code, wParam, lparam);
 Result := 0;
end;

ммм... не нравится этот момент. а что, если другое приложение так-же поставила глоб.хук на GetMessage?
в MSDN вот что сказано по этому поводу:
Цитата

GetMsgProc Function
....
Return Value
If code is less than zero, the hook procedure must return the value returned by CallNextHookEx. 

If code is greater than or equal to zero, it is highly recommended that you call CallNextHookEx and return the value it returns; otherwise, other applications that have installed WH_GETMESSAGE hooks will not receive hook notifications and may behave incorrectly as a result. If the hook procedure does not call CallNextHookEx, the return value should be zero. 


может это и не то... но все-таки


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
dumb
Дата 11.1.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Цитата(MetalFan @  11.1.2007,  09:50 Найти цитируемый пост)
может это и не то... но все-таки

угу, не то. хоть и сделано левой пяткой задней ноги, но на работу ZwQueryDirectoryFile это влияния не оказывает.
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0753 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.