2010-11-06 7 views
6

muszę dokonać plik nie pojawi się do innego programu. Na przykład, gdy inny program otrzymuje listę plików w folderze, chcę, aby jedna konkretna nie wyświetlała się. Wstrzykuję bibliotekę DLL, z której mój kod zostanie uruchomiony w procesie, z którego chcę ukryć plik DLL w systemie plików. Korzystam z Microsoft Visual C++ 2010 i Windows 7.Ukrywanie pliku z innymi programami

+0

brzmi to dość podejrzanie! Zaryzykowałbym przypuszczenie i powiedziałbym, że nie jest to możliwe. –

Odpowiedz

10

Tak, jak już wspomniałeś, musisz przechwycić API wyliczania plików/folderów i odfiltrować określony plik/folder z wyniku wyliczenia, aby "ukryć" ten plik/folder. Można to zrobić w trybie użytkownika lub w trybie jądra.

tryb użytkownika: Tryb użytkownika zahaczenie obejmuje zastrzyk DLL. Istnieje wiele miejsc, gdzie można podłączyć:

  • IAT zahaczające wykonywalnych: Sprawdzaj wpis FindXxx w tablicy adresów import procesu docelowego i zastąpić go z adresem funkcji trampolina obecnego w wtryskiwanego DLL.
  • EAT zahaczanie bibliotek DLL załadowanych przez pliki wykonywalne: Znajdź wpis API FindXxx w tabeli adresów eksportu załadowanej biblioteki DLL (w tym przypadku kernel32.dll) i zastąp go adresem funkcji trampoliny w wstrzykniętej bibliotece DLL.
  • Inline zahaczenie: Zastępowanie kilka pierwszych instrukcji kodu API w załadowanym pliku DLL z JMP do funkcji trampolinie.

Generalnie tryb użytkownika stają się „brzydki” (trudna do opanowania), jak trzeba wstrzykiwać DLL do wszystkich uruchomionych procesów, jeśli chcesz hak całego systemu (lub przynajmniej w Eksploratorze. exe lub docelową aplikację). Wiele aplikacji, takich jak oprogramowanie zabezpieczające, ma mechanizmy ochronne wykrywające i blokujące wtrysk DLL.

Czyszczenia sposobem realizacji trybu użytkownika zaczepowe hak API w NTDLLDLL.dll (stosując zarówno jeść hak bezpośrednia). Wszystkie pozostałe funkcje API (jak FindFirstFile/FindNextFile) kończy się wywołanie równoważne API NtXxx (jak NtQueryDirectoryFile) udzielone przez Ntdll.dll. Interfejs API NtXxx jest punktem, w którym kontrola przechodzi do trybu jądra, wykonując INT 2E/SYSENTER.

Tryb jądra: Obejmuje pisanie sterownika. Ponownie, w trybie jądra istnieje wiele miejsc, gdzie można zainstalować Hak:

  • hak SSDT: Instalowanie SSDT hak do wymaganej ZwXxx API (ZwQueryDirectoryFile w tym przypadku) poprzez nadpisanie odpowiedni indeks SSDT z adresem funkcja trampoliny w twoim sterowniku.
  • Kernel hak inline: Przepisz kilka pierwszych wskazówek NT jądra API eksportowanego przez jądro (NtQueryDirectoryFile w tym przypadku) z JMP aby wskazać funkcję trampolinie w sterowniku.
  • Sterownik filtru systemu plików: Jest to bardziej przejrzyste podejście i nie wymaga żadnych haczyków. Zainstaluj sterownik filtru systemu plików i przechwyć odczyt/zapis/wyliczenie IOCTL i odfiltruj wyniki, aby ukryć/zablokować określony plik/folder.

hak trybie jądra bywają czystsze, ponieważ zazwyczaj instalowane na jednym centralnym miejscu „”. Należy jednak zachować ostrożność, ponieważ mały błąd/niewłaściwe zarządzanie kodem sterownika może zakończyć się BSOD.

PS: Dostępnych jest wiele bibliotek/frameworków, które ułatwiają pisanie kodu. Niektóre popularne są:
http://www.madshi.net/madCodeHookDescription.htm
http://easyhook.codeplex.com/

PPS: Ukrywanie plików/folderów przy użyciu takich technik, bez zgody użytkownika może być wątpliwe działanie i może stać się problematyczne (Pamiętaj Sony DRM problem oprogramowania ochronnego;)). To właśnie robią rootkity! Istnieje wiele trybów pracy w trybie użytkownika i rootkitów w trybie jądra, które wykorzystują wyżej wymienione techniki do ukrywania plików/folderów. Dostępne są różne programy do zwalczania rootkitów do wykrywania i przywracania wszelkiego rodzaju zahaczania opisanego powyżej. Wiele programów antywirusowych podnieść flagę po wykryciu takiego rootkita jak zachowanie (jak API zahaczanie, ukrytych plików, SSDT haczyków itp)

niewiele zasobów:
http://www.codeproject.com/KB/threads/APIHooking.aspx
http://www.codeproject.com/KB/DLL/funapihook.aspx
http://www.codeproject.com/KB/system/api_spying_hack.aspx
http://www.codeproject.com/KB/system/hide-driver.aspx
http://www.uc-forum.com/forum/c-and-c/59147-writing-drivers-perform-kernel-level-ssdt-hooking.html
http://www.security.org.sg/code/apihookcheck.html

+0

Wow, dokładna odpowiedź. –

0

Najprostszym sposobem na to byłoby użycie Microsoft Detours do zastąpienia potrzebnych funkcji. Można go również użyć do wstrzyknięcia biblioteki DLL, ale już to obejmuje. Jeśli znana jest ci inna funkcja, wykorzystaj ją. Jeśli nie, musisz podłączyć klocki wszystkich funkcji używanych do listy plików lub otwierania ich. Wystarczy tylko utworzyć CreateFile/FindFirst/FindFirstFile/etc, ponieważ po prostu wywołują funkcję wewnętrzną. Na przykład, jeśli podłączysz CreateFile, który faktycznie mapuje do CreateFileA, proces nadal będzie mógł uzyskać dostęp do pliku przy użyciu CreateFileW. Więc chcesz podłączyć NtCreateFile i przyjaciół. Sądzę jednak, że wiesz, z jakim procesem się komunikujesz, więc dokładnie wiesz, z którymi funkcjami również się borykasz.

+0

Podłączyłem już FindFirstFile i FindFirstFileEx, ale nie są one wywoływane, gdy program wyświetla listę plików. Czy jest jakaś inna funkcja, której mógłby użyć? A kiedy mówisz "Myślę, że wiesz, z jakim procesem masz do czynienia, więc wiesz ..." faktycznie to jest problem, ponieważ mogę podłączyć funkcje, ale nie jestem pewien, który z nich zawiesić. –

+0

Podłączyliście oba FindFirstFileA i FindFirstFileW? Czy próbowałeś API Monitor http://www.apimonitor.com/? Jeśli nie wiesz, czego używa, a nie chcesz dezasemblować, aby kopać głębiej, zawsze możesz złapać je wszystkie za pomocą funkcji najniższego poziomu - NtQueryDirectoryFile i prawdopodobnie NtQueryDirectoryObject. – kichik

+0

Nie, nie podpiąłem FindFirstFileA i W. And NtQueryDirectory * to dobry pomysł, nie wiedziałem o tym, dziękuję. –