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

Поиск:

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


Опытный
**


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

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



Общая задача: написать что-то вроде FileMon'а, который перехватывает все обращения к любым файлам. Перехватываю api функции сплайсингом. Сначала пробовал с FindFirst, FindNext, но ничего путного не вышло, все-таки они не всегда используются при обращении к файлам. Стал пробовать перехватывать ZwQueryDirectoryFile, но возникла такая куча проблем... У меня есть функции

Код

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;
//var
//s : string;
begin

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


end;



которая является "подменной" функцией. Какая-то из них не работает, т.е. вызов api перехватывается, но его подмена не происходит, и процесс, который вызвал ZwQueryDirectoryFile вылетает. В чем дело? 

P.S. есть предположения, что надо записывать какую-то инфу в параметры FileInformation и IoStatusBlock, но какую  smile 


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


Эксперт
***


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

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



DoZENT, Во первых, как ты устанавливаешь перехват? Какие функции для этого используешь и.т.д
Во вторых,
Цитата(DoZENT @  6.1.2007,  13:42 Найти цитируемый пост)
Общая задача: написать что-то вроде FileMon'а

если ты хочешь перехватывать именно ВСЕ обращения то тебе придется писать драйвер smile
В третьих, покажи код DLL которую ты внедряешь в процеесс smile или как ты вообще хук делаешь?



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

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


found myself
****


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

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



Если процесс вылетает значит ошибка в функциях перехвата, т.е. происходит недопустимая операция и исключение. Смотри адрес по которому вылетает, грузи программу в отладчик и изучай, что творится по этому адресу и к какой функции она принадлежит.

Ты внимательно прочёл статью MsRem по перехвату?smile 

На первый взгляд только вот это глаз режет:

Код

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


Вызывай NewZwQueryDirectoryFile. И покажи как перехват ставишь.


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


Опытный
**


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

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



Цитата

Вызывай NewZwQueryDirectoryFile

Наверное ты не понял механизма перехвата. В функции TrueZwQueryDirectoryFile я сначала устанавливаю оригинальный адрес входа в функцию ZwQueryDirectoryFile, потом вызываю ZwQueryDirectoryFile, потом устанавливаю "мой" адрес точки входа, чтобы при вызове этой ф-и вызывалась NewZwQueryDirectoryFile


Перехват делаю так:
Код

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;



Цитата

если ты хочешь перехватывать именно ВСЕ обращения то тебе придется писать драйвер 

Нужно перехватывать обращения, которых хватит для того, чтобы при надобности скрыть файл. Я думаю ZwQueryDirectoryFile будет достаточно

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


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


found myself
****


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

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



Цитата

Наверное ты не понял механизма перехвата. В функции TrueZwQueryDirectoryFile я сначала устанавливаю оригинальный адрес входа в функцию ZwQueryDirectoryFile, потом вызываю ZwQueryDirectoryFile, потом устанавливаю "мой" адрес точки входа, чтобы при вызове этой ф-и вызывалась NewZwQueryDirectoryFile


Этот механизм я уже выучил наизустьsmile Немножечко невнимателен был, поэтому извиняй. Я тебе уже сказал, что делать, нужно отлаживать этот процесс, смотреть где вылеает, смотреть почему, какие исключения, какие ошибки. Я смотрю ты всё делаешь в точности как в статье MsRem, а у него там хватает пробелов, над которыми нужно работать самостоятельно. 




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


Опытный
**


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

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



Цитата

Я тебе уже сказал, что делать, нужно отлаживать этот процесс, смотреть где вылеает, смотреть почему, какие исключения, какие ошибки

Все-таки хотелось бы найти путь попроще. 


есть предположения, что надо записывать какую-то инфу в параметры FileInformation и IoStatusBlock, но какую  smile 

Цитата

у него там хватает пробелов, над которыми нужно работать самостоятельно. 

Я заметил ;) Длл сначала не выгружалась из памяти, MsRem забыл, что для создания хука он создает отдельный поток, поэтому обрабатывать надо не только DLL_PROCESS_DETACH, но и DLL_THREAD_DETACH.

Это сообщение отредактировал(а) DoZENT - 7.1.2007, 11:43


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


Эксперт
***


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

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



Цитата(DoZENT @  7.1.2007,  11:42 Найти цитируемый пост)
Я заметил ;) Длл сначала не выгружалась из памяти, MsRem забыл, что для создания хука он создает отдельный поток, поэтому обрабатывать надо не только DLL_PROCESS_DETACH, но и DLL_THREAD_DETACH.

DLL_THREAD_DETACH обрабатывать не надо.
Цитата(DoZENT @  7.1.2007,  11:42 Найти цитируемый пост)
MsRem забыл, что для создания хука он создает отдельный поток

Где написано что он создает отдельный поток для перехвата?
DoZENT, я использовал его модули для перехвата и работали они безупречно smile
Я перехватывал FindFirst, FindNext и все тоже работало безупречно. Почитай статьи на wasm.ru по перехвату, если что то не понятно, милости просим smile



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

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


found myself
****


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

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



Цитата(DoZENT @  7.1.2007,  11:42 Найти цитируемый пост)
Все-таки хотелось бы найти путь попроще.    


Нет тут пути попроще, нужно отлаживать. 

Цитата(DoZENT @  7.1.2007,  11:42 Найти цитируемый пост)
есть предположения, что надо записывать какую-то инфу в параметры FileInformation и IoStatusBlock, но какую   


Зачем туда что-то класть твоей функции перехватчику? Если без перехвата программа не падает, а с перехватом падает, то эти параметры тут совсем не причём.

Цитата(bartram @  7.1.2007,  13:38 Найти цитируемый пост)
DoZENT, я использовал его модули для перехвата и работали они безупречно Я перехватывал FindFirst, FindNext и все тоже работало безупречно. Почитай статьи на wasm.ru по перехвату, если что то не понятно, милости просим 


К слову, о каких модулях речь? Если advApiHook, то там сплайсинг реализован иначе, чем в примерах к статьям. Кстати, гораздо более удачно. 
И ещё о каких статьях ты говоришь? По перехвату по-моему лучшими статьями на васме являются как раз статьи MsRem, ну можно ещё у Рихера неплохую информацию найти. Статьи 90211 уже достаточно устерели, да и в них нет того, чего бы не было в статьях Рема.



Это сообщение отредактировал(а) W4FhLF - 7.1.2007, 15:33


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


Опытный
**


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

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



Цитата

Где написано что он создает отдельный поток для перехвата?

А это что?
Код

CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId)


Цитата

DLL_THREAD_DETACH обрабатывать не надо.

Если его не обрабатывать, то dll не выгружается из памяти. Так было у меня. Даже Delphi при следующей компиляции писала, что не может перезаписать dll, т.к. она используется.

Добавлено @ 15:50 
Цитата

К слову, о каких модулях речь? Если advApiHook, то там сплайсинг реализован иначе, чем в примерах к статьям

Вообще-то я этот модуль не юзал, но надо будет попробовать


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


Эксперт
***


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

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



Цитата(W4FhLF @  7.1.2007,  15:33 Найти цитируемый пост)
Если advApiHook, то там сплайсинг реализован иначе

Я про него и говорю
Цитата(W4FhLF @  7.1.2007,  15:33 Найти цитируемый пост)
И ещё о каких статьях ты говоришь?

О 3х статьях MsRem'a которые на wasm.ru
Цитата(DoZENT @  7.1.2007,  15:39 Найти цитируемый пост)
DLL_THREAD_DETACH

Его не надо обрабатывать, надо обрабатывать DLL_PROCESS_DETACH
Вот пример простого перехвата с использованием AdvApiHook
Код

 procedure LibraryProc (Reason : integer);
begin
  case Reason of
    DLL_PROCESS_ATTACH :
      begin
       HookProc('kernel32.dll', 'ExitProcess', @NewExitProcess, @TrueExitProcess);
      end;

    DLL_PROCESS_DETACH :
//Отсоединение от процесса
// снимаем хук
    begin
     UnhookCode(@TrueExitProcess);
    end;
  end;
end;

begin
  DllProc := LibraryProc;
  DllProc (DLL_PROCESS_ATTACH);
end.





Это сообщение отредактировал(а) bartram - 7.1.2007, 16:10


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

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


Опытный
**


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

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



Цитата

Его не надо обрабатывать, надо обрабатывать DLL_PROCESS_DETACH

Блин. Еще раз. Если обрабатывать ТОЛЬКО его, то dll из памяти У МЕНЯ не выгружается. Я обрабатываю и его и DLL_THREAD_DETACH

Цитата

Вот пример простого перехвата с использованием AdvApiHook

Дык я то же самое делаю, но без этой библиотеки. Попробую ночью ее поюзать, отпишусь.


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


Эксперт
***


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

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



Цитата(DoZENT @  7.1.2007,  16:20 Найти цитируемый пост)
Блин. Еще раз. Если обрабатывать ТОЛЬКО его, то dll из памяти У МЕНЯ не выгружается.

А каким способом ты dll выгружаешь? 


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

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


Опытный
**


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

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



Цитата

А каким способом ты dll выгружаешь? 

FreeLibrary ест-но

Это сообщение отредактировал(а) DoZENT - 7.1.2007, 21:30


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


Опытный
**


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

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



Цитата

Вот пример простого перехвата с использованием AdvApiHook

Перехватывать я умею и без библиотек. Что делать в "новой" функции smile 


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


Эксперт
***


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

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



Цитата(DoZENT @  7.1.2007,  23:21 Найти цитируемый пост)
Что делать в "новой" функции 

вот:
Код

  var
  TrueExitProcess:function (uExitCode: UINT): Boolean; stdcall;

  //
  function NewExitProcess(uExitCode: UINT):Boolean; stdcall;
  begin
if (MessageBox(0, 'Вы действительно хотите завершить этот процесс?', '', MB_ICONWARNING or MB_YESNO or MB_DEFBUTTON1) = idYes) then
  TrueExitProcess(0);

end;

смекаешь?  smile 



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

PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0604 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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