| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > перехват FindNextFile для Windows NT(Windows 7) |
| Автор: Fishtel 29.5.2010, 19:28 | ||||||||
| Здравствуйте, помогите решить задачу. Пишу программку для скрытия файлов(папок) для Windows 7 Внедрение dll через удаленный поток, метод перехвата : используя таблицу импорта Сложности : 1 Проводник не перехватывает FindNextFileW(Windows Explorer) 2 Не получается скрыть файлы используя myFindNextFileW (как пример в WinRAR) хотя видно что библиотека загружена и вызывается двойник myFindNextFileW Уже работает код внедрения библиотеки:
MAIN библиотеки:
функция подмены адресов:
сам двойник :
Спасибо. Надеюсь на помощь. |
| Автор: xvr 30.5.2010, 10:43 |
| На первый взгляд - функция двойник myFindNextFileW написана неверно - она не всегда возвращает результат и не всегда заполняет сруктуру lpFindFileData И вообще она крайне подозрительна - параметр lpFindFileData у FindNextFileW - это out параметр (т.е. ваша функция должна его заполнять), а вы из него зачем то читатете |
| Автор: 12usver12 30.5.2010, 11:11 | ||
попробуй таким способом
а вообще читай внимательно мсдн,описание функций и возвращаемые значения |
| Автор: Fishtel 30.5.2010, 11:58 | ||
| 12usver12 и xvr, спасибо. 12usver12 работает код:
xvr прочитав, ваше сообщение только понял)))) мне почему раньше казалось, что lpFindFileData уже приходит заполненная, а я ведь перехватываю вызов и она еще не успела заполниться, точно.... =) протестировал в Total, WinRAR, все ок а вот проводник вылетает при замене адресов (((( |
| Автор: bra1ny 30.5.2010, 13:06 |
| перехватите NtQueryDirectoryFile. |
| Автор: 12usver12 30.5.2010, 13:10 | ||||||
вообще жестокий способ, может быть из-за него вылеты а что мой первоначальный код не работает ? в случае с explorer можно попробовать чота типа такого
|
| Автор: xvr 30.5.2010, 13:36 | ||||||||||||
Угу
Здесь нужно в цикле вызывать realAdrFindNextFileW пока она не вернет FALSE или пока возвращенное имя не будет отличаться от "имя.файла" Как то так
PS. А FindFirstFileW нормально перехвачен? |
| Автор: 12usver12 30.5.2010, 14:26 | ||
впринципе да - но просто в случае с эксплорером, стоит попробовать возможно он ориентируется по коду ошибки ERROR_NO_MORE_FILES впринципе можно быстро решить проблему в обработчике lstrcpyW(lpFindFileData->cFileName, L"111.txt"); но это будет некрасиво и неуниверсально, но все-таки решение |
| Автор: Fishtel 30.5.2010, 14:44 | ||||||
| с Explorer проблема в том, что он вылетает в функции myChangeAdress на строчках :
я пока так и тестирую ))) в дальнейшем в if() будет функция которая читает список запрещенных файлов и если найдет нужный возвратит false
да, там пока ток вызов оригинальной функции, но я этот перехватчик планирую использовать только, чтобы получить полный путь к файлу... |
| Автор: 12usver12 30.5.2010, 14:48 | ||||||
| to Fishtel не забывай в конце return retVal; а то опять будет что-то вылетать... тут еще зависит от конкретной программы...возможно перечисление файлов выполняется таким образом в простых прогах
или что-то наподобие такого
поэтому универсальный способ скорее стоит искать через NtQueryDirectoryFile... хотя вот этот должен сработать универсально
|
| Автор: Fishtel 30.5.2010, 19:09 | ||||
вот такой код вызываю, ничего не меняется ((( |
| Автор: xvr 30.5.2010, 19:16 | ||||
| 1) Проверьте, что возвращает VirtualProtect 2) WriteProcessMemory здесь излишен - вы пишите из своего собственного процесса. Вместо
|
| Автор: Fishtel 30.5.2010, 19:39 | ||||||
возвращает не 0 в обоих случаях... и тут же вылетает ... |
| Автор: xvr 31.5.2010, 00:42 |
| А указатель по ppfn случайно не пересекает границу страницы? |
| Автор: Fishtel 31.5.2010, 00:56 | ||
а вот это я не знаю как проверить ((( я не могу отладчиком зайти в библиотеку(((( __asm {int 3} не тормозит.... |
| Автор: 12usver12 31.5.2010, 09:04 | ||
сделай для начала olly - just in time debugger, проверяй значение указателя ppfn для записи в секцию импорта , вынеси запись в критическую секцию |
| Автор: xvr 31.5.2010, 09:47 |
| Переключиться на Ассемблер, потом шагать - зайдет везде (кроме ядра |
| Автор: Fishtel 31.5.2010, 11:50 | ||||
запарился 3 часа пробовал разобраться с olly и никаких результатов я с ним раньше не работал, может подскажете, что мне нужно сделать чтобы посмотреть ppfn ? или тут быстро не получится ? |
| Автор: 12usver12 31.5.2010, 13:28 |
| значит не судьба, оставь программирование иди на менеджера |
| Автор: Fishtel 5.6.2010, 22:35 | ||
может и так)) но доделать нужно... с вылетом Explorer разобрался заменил VirtualProtect(ppfn,sizeof(ppfn),PAGE_READWRITE, &op); на VirtualProtectEx(GetCurrentProcess(),ppfn,sizeof(ppfn),PAGE_EXECUTE_READWRITE, &op); но вот теперь другая проблема, explorer не перехватывает FindNextFileW/ FindFirstFileW попробовал CloseHandle ее перехватывает думал он получает адресса через GetProcAddress, но и ее не удалось перехватить (((( подскажите как быть? может Explorer другими какими-то функциями отображает список файлов? |
| Автор: Fishtel 6.6.2010, 13:50 | ||
так ее ж нет в таблице импорта приложения (посмотрел с пом PE Explorer) и в msdn написано что она не используется, мне нужно под Windows 7сделать перехват... думаете стоит? |
| Автор: xvr 6.6.2010, 14:07 | ||
Изучение сорцов FindFirstExW/FindNextExW (из W2K) показало, что они используют вызовы
|
| Автор: bra1ny 6.6.2010, 14:29 |
| давно уже предложил перехватить сискол. |
| Автор: Fishtel 6.6.2010, 14:56 | ||
попробовал, к ней ни одна программа не обратилась (( |
| Автор: bra1ny 6.6.2010, 15:14 |
| код покажите. |
| Автор: Fishtel 6.6.2010, 15:27 | ||||
я пока просто пробую посмотреть вызоыется или нет
FindNextFileW в total и WinRAR работает как надо, в проводнике не отлавливается а NtQueryDirectoryFile даже в total и WinRAR не вызывается... может в 7 набор функций какой-то другой? может не получается, потому что я через таблицу импорта пробую? но я и сплайсинг пробовал, в проводнике не вызывается FindNextFile ((((( |
| Автор: xvr 6.6.2010, 16:34 |
| Их надо в другом модуле пэтчить - в kernel32, а не в текущем exe'нике А лучше пэтчить не таблицу импорта, а сразу сами функции (по месту) |
| Автор: Fishtel 6.6.2010, 18:19 | ||||
не понял, что не так? я создал dll в ней функция замены адресов и мои двойники, эту dll я через удаленный поток внедряю в нужную программу, получается что я уже в ее адресном пространстве.... последний фрагмент кода это часть dll как в KERNEL32 ? вы имеете ввиду системную dll которая в ..\system32 ? в функции myChangeAdress я сначала получаю адрес начала файла.... потом нахожу по имени нужную библиотеку(KERNEL32.dll ток уже в памяти процесса), а в ней по смещению как в KERNEL32.dll(системной) нахожу нужную фунцию и вместо адреса вызова оригинальной записываю адрес вызова двойника.....
т.е. использовать сплайсинг ? не понимаю что не так я делаю если одни програмы работают, а проводник нет (((((( |
| Автор: xvr 6.6.2010, 18:25 | ||
| Ты вызываешь ImageDirectoryEntryToData на текущий модуль (т.е. exe'ник). А NtQueryDirectoryFile вызывается из реализации FindFirst/NextW, которая располагается явно не в exe файле, а в kernel32. Собственно там и надо пэтчить Да
Надо смотреть код в месте перехвата в Проводнике. Без знания ассемблера и отладчиков это сделать невозможно |
| Автор: Fishtel 6.6.2010, 18:54 |
| еще немного не по теме говоря FindFirst/FindNext вы имеете ввиду FindFirstFile/FindNextFile ??? или они все используют NtQueryDirectoryFile |
| Автор: xvr 6.6.2010, 19:57 | ||
|
| Автор: Fishtel 7.6.2010, 11:38 | ||
упс, сделал сплайсинг, для FindNextFileW таже ерунда, а вот начал смотреть NTQueryDirectoryFile уже в проводнике видно, что иногда к ней обращаются, ток как с помощью нее скрыть ? |
| Автор: xvr 7.6.2010, 13:42 | ||
Отпарсить данные, возвращенные в FileInformation параметре (убрать из них упоминания о нужных файлах) |
| Автор: Fishtel 7.6.2010, 20:27 | ||
объявил стурктуру
но Info->FileName не хранит имя файла а какую то ерунду... |
| Автор: xvr 7.6.2010, 22:39 | ||
Угу. Для размышления - из MSDN
|
| Автор: Fishtel 8.6.2010, 14:45 |
| а вообще реально ли мне на уровне пользователя вроде ring 3, перехватить и обработать ZwQueryDirectoryFile ? она ведь используется драйвером... |
| Автор: xvr 8.6.2010, 16:48 | ||
Не только, вот именно ее Ring3 часть перехватить можно |