| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Перехват Native API |
| Автор: DoZENT 6.1.2007, 13:42 | ||||
Общая задача: написать что-то вроде FileMon'а, который перехватывает все обращения к любым файлам. Перехватываю api функции сплайсингом. Сначала пробовал с FindFirst, FindNext, но ничего путного не вышло, все-таки они не всегда используются при обращении к файлам. Стал пробовать перехватывать ZwQueryDirectoryFile, но возникла такая куча проблем... У меня есть функции
которая представляет собой "настоящую" функцию. Есть
которая является "подменной" функцией. Какая-то из них не работает, т.е. вызов api перехватывается, но его подмена не происходит, и процесс, который вызвал ZwQueryDirectoryFile вылетает. В чем дело? P.S. есть предположения, что надо записывать какую-то инфу в параметры FileInformation и IoStatusBlock, но какую |
| Автор: bartram 6.1.2007, 18:15 |
| DoZENT, Во первых, как ты устанавливаешь перехват? Какие функции для этого используешь и.т.д Во вторых, если ты хочешь перехватывать именно ВСЕ обращения то тебе придется писать драйвер В третьих, покажи код DLL которую ты внедряешь в процеесс |
| Автор: W4FhLF 6.1.2007, 18:16 | ||
| Если процесс вылетает значит ошибка в функциях перехвата, т.е. происходит недопустимая операция и исключение. Смотри адрес по которому вылетает, грузи программу в отладчик и изучай, что творится по этому адресу и к какой функции она принадлежит. Ты внимательно прочёл статью MsRem по перехвату? На первый взгляд только вот это глаз режет:
Вызывай NewZwQueryDirectoryFile. И покажи как перехват ставишь. |
| Автор: DoZENT 6.1.2007, 19:06 | ||||||
Наверное ты не понял механизма перехвата. В функции TrueZwQueryDirectoryFile я сначала устанавливаю оригинальный адрес входа в функцию ZwQueryDirectoryFile, потом вызываю ZwQueryDirectoryFile, потом устанавливаю "мой" адрес точки входа, чтобы при вызове этой ф-и вызывалась NewZwQueryDirectoryFile Перехват делаю так:
Нужно перехватывать обращения, которых хватит для того, чтобы при надобности скрыть файл. Я думаю ZwQueryDirectoryFile будет достаточно |
| Автор: W4FhLF 6.1.2007, 19:21 | ||
Этот механизм я уже выучил наизусть |
| Автор: DoZENT 7.1.2007, 11:42 | ||||
Все-таки хотелось бы найти путь попроще. есть предположения, что надо записывать какую-то инфу в параметры FileInformation и IoStatusBlock, но какую
Я заметил ;) Длл сначала не выгружалась из памяти, MsRem забыл, что для создания хука он создает отдельный поток, поэтому обрабатывать надо не только DLL_PROCESS_DETACH, но и DLL_THREAD_DETACH. |
| Автор: W4FhLF 7.1.2007, 15:33 | ||||
Нет тут пути попроще, нужно отлаживать.
Зачем туда что-то класть твоей функции перехватчику? Если без перехвата программа не падает, а с перехватом падает, то эти параметры тут совсем не причём.
К слову, о каких модулях речь? Если advApiHook, то там сплайсинг реализован иначе, чем в примерах к статьям. Кстати, гораздо более удачно. И ещё о каких статьях ты говоришь? По перехвату по-моему лучшими статьями на васме являются как раз статьи MsRem, ну можно ещё у Рихера неплохую информацию найти. Статьи 90211 уже достаточно устерели, да и в них нет того, чего бы не было в статьях Рема. |
| Автор: DoZENT 7.1.2007, 15:39 | ||||||||
А это что?
Если его не обрабатывать, то dll не выгружается из памяти. Так было у меня. Даже Delphi при следующей компиляции писала, что не может перезаписать dll, т.к. она используется. Добавлено @ 15:50
Вообще-то я этот модуль не юзал, но надо будет попробовать |
| Автор: bartram 7.1.2007, 16:09 | ||
Я про него и говорю О 3х статьях MsRem'a которые на wasm.ru Его не надо обрабатывать, надо обрабатывать DLL_PROCESS_DETACH Вот пример простого перехвата с использованием AdvApiHook
|
| Автор: DoZENT 7.1.2007, 16:20 | ||||
Блин. Еще раз. Если обрабатывать ТОЛЬКО его, то dll из памяти У МЕНЯ не выгружается. Я обрабатываю и его и DLL_THREAD_DETACH
Дык я то же самое делаю, но без этой библиотеки. Попробую ночью ее поюзать, отпишусь. |
| Автор: bartram 7.1.2007, 21:19 | ||
А каким способом ты dll выгружаешь? |
| Автор: DoZENT 7.1.2007, 21:29 | ||
FreeLibrary ест-но |
| Автор: DoZENT 7.1.2007, 23:21 | ||
Перехватывать я умею и без библиотек. Что делать в "новой" функции |
| Автор: bartram 8.1.2007, 15:53 | ||
вот:
смекаешь? |
| Автор: DoZENT 8.1.2007, 19:15 | ||
С ExitProcess и его одним параметром какнить сам разобрался бы. Кто-нибудь может привести ПРИМЕР перехвата ZwQueryDirectoryFile |
| Автор: bartram 9.1.2007, 14:12 |
| DoZENT, я тебе пример дал, сделай по примеру. Структура описанная тем более у тебя есть. Если что то не получается спрашивай, по коду будет проще понять что у тебя не получается и что ты хочешь сделать |
| Автор: DoZENT 9.1.2007, 16:33 | ||
ОК, вот весь код:
Кое-что подправил, теперь процесс, вызывающий функцию не завершается, но не может найти ни одного файла (например total commander выдает только список дисков, но зайти в них не может). |
| Автор: drkot 9.1.2007, 16:41 |
| Сори за возможный оффтоп. DoZENT, а у тебя OutPost случаем не стоит? (из последних версий 4) А то у меня проблемы с перехватом возникли после очередного обновления. При включенном файрволе при попытке перехвата целевое приложение вылетало с ошибкой. После отключения бока исчезали. |
| Автор: W4FhLF 9.1.2007, 16:52 |
| Блин, да сколько можно говорить, чтобы ты попробовал отладить процесс? Чё гадать и как дурак тыкать пальцем в небо? Посмотри как и что происходит, локализуй ошибку и исправь её. |
| Автор: DoZENT 9.1.2007, 17:25 | ||||
Нет, KIS Forever
Каким образом отлаживать? Если ты имеешь в виду установку прерывания, то на ZwQueryDirectoryFile брейкпойнт на ставится, т.к. это недокументированная ф-я. |
| Автор: W4FhLF 9.1.2007, 20:17 | ||
ZwQueryDirectoryFile является переходником к ядерной функции и экспортируется из ntdll.dll, именно это тебе позволяет перехватывать её таким методом, и именно это позволит отладить этот процесс. Берёшь любой отладчик, я обычно использую OllyDBG, загружаешь в неё приложение в которое будет проинжектирована твоя dll и в "Опции > Опции отладки > Events" ставишь галку на "Break on new module (DLL)", далее инжектируешь dll в процесс и прерываешься на процедуре DLLEntryPoint, трейсишь установку хуков, смотришь всё ли в порядке, далее ставишь бряк на ZwQueryDirectoryFile(bp ZwQueryDirectoryFile) и пускаешь программу дальше. Когда программа вызовет эту функцию ты прервёшься на её начале, где будет стоять прыжок(push @ZwQueryDirectoryFile / retn) на процедуру NewZwQueryDirectoryFile. Заходишь в эту процедуру, трейсишь и смотришь правильно ли всё происходит, тем самым ты сможешь проконтролировать весь процесс установки перехвата и его срабатывания. |
| Автор: DoZENT 9.1.2007, 20:54 | ||
Я использую сплайсинг, поэтому dll не будет проинжектированна в процесс. Или я что-то неправильно понимаю? |
| Автор: dumb 10.1.2007, 06:41 | ||
как думаешь, зачем у тебя SetWindowsHookEx используется? - как раз для подгрузки dll во все процессы. а подгрузившись, ты уже устанавливаешь хук на ZwQueryDirectoryFile(изменения, вносимые WriteProcessMemory локальны для каждого процесса). |
| Автор: DoZENT 10.1.2007, 18:04 | ||||
Почитал MSDN, понял, спасибо
? |
| Автор: DoZENT 10.1.2007, 18:56 |
| Протрассировал процесс, не нашел ничего подозрительного. Хуки расставляются правильно, происходит вызов ZwQueryDirectoryFile, функцией возвращается какое-то числовое значение, и происходит вызов GetLastError... Ладно, буду копаться дальше |
| Автор: W4FhLF 10.1.2007, 19:55 | ||
Это инжектирование DLL в один отдельно взятый процесс. Ну а что делает код и так должно быть понятно. |
| Автор: dumb 11.1.2007, 04:26 | ||
какое значение? что возвращает GetLastError? всегда одни и те же значения? |
| Автор: MetalFan 11.1.2007, 09:50 | ||||
ммм... не нравится этот момент. а что, если другое приложение так-же поставила глоб.хук на GetMessage? в MSDN вот что сказано по этому поводу:
может это и не то... но все-таки |
| Автор: dumb 11.1.2007, 10:09 |
угу, не то. хоть и сделано левой пяткой задней ноги, но на работу ZwQueryDirectoryFile это влияния не оказывает. |
| Автор: DoZENT 11.1.2007, 11:36 | ||
Перехват функции осуществляется Ладно, пойдем другим путем. Кто-нибудь может привести ПОЛНЫЙ пример работы с библиотекой advApiHook? А то с wasm.ru ни сама библиотека, ни примеры ее использования не скачиваются |
| Автор: W4FhLF 11.1.2007, 15:11 | ||
Аттач. |
| Автор: Girder 11.1.2007, 17:33 |
| Кстати... в факе есть пример использования драйверочков от FileMon |
| Автор: DoZENT 11.1.2007, 18:55 | ||||
Спасибо, с библиотекой я уже разобрался. Такой вопрос. Перехватываю ZwQueryDirectoryFile, обрабатываю результаты:
Процесс вылетает, если есть строчка
В чем ошибка обработки |
| Автор: W4FhLF 11.1.2007, 20:03 |
| Ты б справчку по функции Copy и WideCharToString прочёл или посмотрел как она реализована. А потом бы глянул как переводится UNICODE в ASCII. Неверно ты их используешь. |
| Автор: DoZENT 11.1.2007, 21:59 | ||
Тоже не проходит, причем не выполняется ни одна из этих строк (если хоть одна присутствует, то процесс вылелает) |
| Автор: MetalFan 25.1.2007, 17:32 |
| DoZENT, буду сегодня разбираться! результат, если будет, все еще интересен? |
| Автор: drkot 25.1.2007, 17:50 |
| Результат всегда интересен. |
| Автор: MetalFan 26.1.2007, 00:44 | ||
| мда. у MS-REM'а видимо спецом ошибочки затесались.... много читал MSDN и понял, что FileName: PWideChar; нифига не так, а вот так: FileName: WideChar; ибо в MSDN анлгийским по белому написано:
и еще один косяк в описании структуры... |
| Автор: Romikgy 26.1.2007, 09:50 | ||
MetalFan, имхо ты здесь не прав
не может быть название файла соостоящее из одного символа! |
| Автор: MetalFan 26.1.2007, 10:42 | ||||
| Romikgy, ;) конечно не может) а кто сказал, что оно из одного символа. ладно, вот что у меня вышло, может кто явные недочеты укажет: структура
сама "перехваченная" функция
и вообще, часть статьи REM'а содрано слово слово из.. см.аттач з.ы. уже сам нашел небольшой недочет в коде. точнее отсутсвие кода по одному замечанию из статьи... |
| Автор: Romikgy 26.1.2007, 11:48 |
сомневаюсь я в этом |
| Автор: MetalFan 26.1.2007, 12:55 |
| Romikgy, сомневайся. а в MSDN написано именно так. |
| Автор: Romikgy 26.1.2007, 13:07 |
ссылку можно? |
| Автор: MetalFan 26.1.2007, 13:17 |
| Romikgy-неверующий! а самому посмотреть? вот ссылка http://msdn2.microsoft.com/en-us/library/ms791526.aspx, кушайте на здоровье) и вообще, почему сомневаешься? |
| Автор: Romikgy 26.1.2007, 13:24 | ||||
это
не есть это это есть вот это
прально сомневался Добавлено @ 13:25 угу очень |
| Автор: MetalFan 26.1.2007, 13:27 |
| Romikgy, а какая разница?! что так 2 байта, что так? ну может чуть удобнее в использовании. но никак не PWideChar, да? |
| Автор: Romikgy 26.1.2007, 13:28 |
| хотя поидее и твой вариант должен работать просто я таких объявлений как у тя ни разу не видел Добавлено @ 13:29 просто в твоем варианте имхо не красиво и не понятно да не это |
| Автор: MetalFan 26.1.2007, 14:06 |
| Romikgy, да, согласен) array[0..0] будет красивше) только Range Checking не забыть выключить. ну и все-равно контролировать FileNameLength придется, ибо наврядли в конце имени нули будут(сталкнулся с таким). |