Online: 0x03E (62)
haker.info  — Etyczny hacking_
Spreading knowledge like a virus.

Podpi臋cia do funkcji API za pomoc膮 Detours

   Dawid Farbaniec    790 s艂贸w

0x01. S艂owem wst臋pu

odpi臋cia (ang. hooks) do funkcji mog膮 mie膰 r贸偶ne zastosowania. Jednym z nich jest np. mo偶liwo艣膰 monitorowania wywo艂ywanych funkcji przez wybrany program. Pozwala to cz臋艣ciowo na analiz臋 zachowania aplikacji, czyli "co program robi". Og贸ln膮 sztuk臋 przechwytywania wywo艂a艅 funkcji okre艣la si臋 po angielsku fraz膮 API hooking. Istniej膮 te偶 negatywne zastosowania tego typu mechanizmu. Mo偶na go spotka膰 te偶 w 馃 z艂o艣liwym oprogramowaniu (ang. malware). Podpi臋cie pozwala przechwyci膰 wywo艂anie funkcji i np. zafa艂szowanie jej wyniku. Wyobra藕my sobie funkcj臋, kt贸ra wy艣wietla list臋 proces贸w, zak艂adane jest podpi臋cie, nast臋puje przechwycenie, a argumenty (lista proces贸w) s膮 modyfikowane poprzez usuni臋cie wybranych pozycji. W ten w艂a艣nie spos贸b 鈽o笍VXer mo偶e ukry膰 sw贸j z艂o艣liwy proces. W tym wpisie jednak zostanie przedstawione etyczne zastosowanie API hooking'u 馃. Dla u艂atwienia dzia艂a艅 pocz膮tkuj膮cym i og贸lnej wygody u偶yta b臋dzie biblioteka Microsoft Detours.

API hooking (podpi臋cia)

0x02. Schemat dzia艂ania podpi臋膰 do funkcji

Przy przechwytywaniu wywo艂ania funkcji za pomoc膮 Microsoft Detours, przep艂yw jest kierowany przez funkcje po艣rednicz膮ce takie jak funkcja przekierowuj膮ca oraz tzw. trampolina (rysunek 2.1).

Przechwytywanie wywo艂ania funkcji
Rysunek 2.1. Przechwytywanie wywo艂ania funkcji — schemat og贸lny

0x03. Prosty, dzia艂aj膮cy przyk艂ad 馃И

Prezentowany przyk艂ad wymaga utworzenia dw贸ch projekt贸w:

  • Program wstrzykuj膮cy (injector.exe) — uruchamia proces do monitorowania i wstrzykuje w niego bibliotek臋 .dll.
  • Wstrzykiwana biblioteka (library.dll) — przechwytuje wywo艂ania zdefiniowanych funkcji API.

Gotowe rozwi膮zanie (Solution) dla 艣rodowiska Visual Studio:
馃捑 interceptor-ms-detours.zip - 1,77 MB (bajt贸w: 1聽862聽206)
(Archiwum nie zawiera 偶adnych plik贸w wykonywalnych tylko kod w postaci tekstowej — no virus 鉁)

Mechanizm dzia艂ania programu injector.exe z listingu 3.1 polega w skr贸cie na utworzeniu nowego procesu wybranej aplikacji i wstrzykni臋cia do niej biblioteki dynamicznej (.dll), kt贸rej zadaniem jest przechwytywanie wywo艂a艅 okre艣lonych funkcji API.

Natomiast listing 3.2 prezentuje kod biblioteki dynamicznej, kt贸ra jest wstrzykiwana do procesu. Zawiera ona m.in. prototypy przechwytywanych funkcji oraz definicje, w kt贸rych mo偶emy okre艣li膰 dodatkowe dzia艂ania np. zapisanie argument贸w funkcji do pliku raportu czy nawet ich modyfikacja.

Dok艂adny opis poszczeg贸lnych funkcji biblioteki Detours mo偶na znale藕膰 w dokumentacji:
https://github.com/microsoft/detours/wiki

Dodanie kolejnych funkcji, kt贸re maj膮 by膰 monitorowane polega na umieszczeniu prototyp贸w analogicznie do:

VOID(WINAPI* pSleep)(DWORD) = Sleep; VOID WINAPI MySleep(DWORD dwMilliseconds);

Dopisaniu funkcji po艣rednicz膮cej:

VOID WINAPI MySleep(DWORD dwMilliseconds) { FILE* pLogFile; setlocale(LC_CTYPE, ""); _wfopen_s(&pLogFile, L"log.txt", L"a+"); fwprintf(pLogFile, L"Monitorowany program zasn膮艂 (funkcja Sleep) na %i milisekund.", dwMilliseconds); fclose(pLogFile); return pSleep(dwMilliseconds); }

I na koniec dodanie wywo艂a艅 funkcji DetourAttach() oraz DetourDetach() dla nowych funkcji, kt贸re maj膮 by膰 monitorowane.

Listing 3.1. Program wstrzykuj膮cy bibliotek臋 DLL (injector.exe)

/* injector.exe (main.cpp file) https://haker.info/ 2020 */ #include <Windows.h> #include "detours.h" #pragma comment(lib, "..\\x64\\Release\\detours.lib") INT WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow) { STARTUPINFOA si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; ZeroMemory(&pi, sizeof(pi)); BOOL injected = FALSE; injected = DetourCreateProcessWithDllExA( "prog1.exe", NULL, NULL, NULL, TRUE, CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, NULL, &si, &pi, "library.dll", NULL); if (injected == TRUE) { MessageBox(0, L"Biblioteka DLL zosta艂a wstrzykni臋ta w proces.", L"Informacja", MB_OK + MB_ICONINFORMATION); } else { MessageBox(0, L"Nie uda艂o si臋 wstrzykn膮膰 biblioteki DLL.", L"B艂膮d", MB_OK + MB_ICONERROR); } ResumeThread(pi.hThread); WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(&si); CloseHandle(&pi); return EXIT_SUCCESS; }

Listing 3.2. Wstrzykiwana biblioteka DLL (library.exe)

/* library.dll (main.cpp file) https://haker.info/ 2020 */ #include <Windows.h> #include <stdio.h> #include <locale.h> #include "detours.h" #pragma comment(lib, "..\\x64\\Release\\detours.lib") VOID(WINAPI* pSleep)(DWORD) = Sleep; VOID WINAPI MySleep(DWORD dwMilliseconds); VOID WINAPI MySleep(DWORD dwMilliseconds) { FILE* pLogFile; setlocale(LC_CTYPE, ""); _wfopen_s(&pLogFile, L"log.txt", L"a+"); fwprintf(pLogFile, L"Monitorowany program zasn膮艂 (funkcja Sleep) na %i milisekund.", dwMilliseconds); fclose(pLogFile); return pSleep(dwMilliseconds); } extern "C" __declspec(dllexport) void nothing(void) { return; } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { if (DetourIsHelperProcess()) return TRUE; if (fdwReason == DLL_PROCESS_ATTACH) { DetourRestoreAfterWith(); DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach(&(PVOID&)pSleep, MySleep); DetourTransactionCommit(); } else if (fdwReason == DLL_PROCESS_DETACH) { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourDetach(&(PVOID&)pSleep, MySleep); DetourTransactionCommit(); } return TRUE; }

Dodatek 0x01. Do艂膮czenie biblioteki Microsoft Detours do projektu w Visual C++

Poni偶ej przedstawiono jak krok po kroku utworzy膰 projekt w Visual Studio (C++) korzystaj膮cy z biblioteki Microsoft Detours.

Krok 1. Pobierz 藕r贸d艂a biblioteki Microsoft Detours



Krok 2. Uruchom Visual Studio i wybierz "Kontynuuj bez kodu".



Krok 3. Utw贸rz puste rozwi膮zanie (blank solution).



Krok 4. Utw贸rz pusty projekt biblioteki statycznej (.lib).



Krok 5. Skopiuj 藕r贸d艂a biblioteki Detours do folderu projektu.



Krok 6. Importuj pliki 藕r贸d艂owe do projektu w Visual Studio.



Krok 7. Importuj pliki nag艂贸wkowe (.h) do projektu w Visual Studio.



Krok 8. Nale偶y wykluczy膰 (exclude) z projektu plik uiimports.cpp, ale nie usuwa膰.



Krok 9. Utw贸rz nowy projekt w tym samym rozwi膮zaniu, b臋dzie to aplikacja wstrzykuj膮ca.



Krok 10. Dodaj plik 藕r贸d艂owy main.cpp do programu wstrzykuj膮cego (injector).



Krok 11. Dodaj nag艂贸wek detours.h do projektu programu wstrzykuj膮cego.



Krok 12. Kolejny (trzeci) projekt w rozwi膮zaniu to biblioteka dynamiczna (*.dll), kt贸ra b臋dzie wstrzykiwana do monitorowanych proces贸w.



Krok 13. Dodaj nag艂贸wek detours.h do projektu biblioteki DLL.



Krok 14. Dodaj plik 藕r贸d艂owy main.cpp do biblioteki dynamicznej (wstrzykiwanej).



Krok 15. Ostatni krok do stworzenia szkieletu rozwi膮zania to ustalenie zale偶no艣ci.



0x04. Zako艅czenie

Wpis zawiera fragmenty projektu wykonanego przeze mnie na studiach z przedmiotu Bezpiecze艅stwo system贸w informacyjnych w przedsi臋biorstwie. Je艣li s膮 jakie艣 pytania, to prosz臋 pisa膰 w komentarzach. Pozdrawiam.

Dawid Farbaniec

Wykaz literatury (bibliografia)

  • Microsoft Corporation, 2020 鈥 Microsoft C/C++ Documentation 鈥 https://docs.microsoft.com/en-us/cpp/?view=vs-2019 (dost臋p: 28-07-2020)
  • Microsoft Corporation, 2018 鈥 https://github.com/microsoft/Detours (dost臋p: 28-07-2020)

Tagi:  visual-cpp  security 

Komentarze czytaj膮cych

Iceman napisa艂:
Nie mam gdzie zostawi膰 commenta do ca艂o艣ci, wi臋c wsadz臋 tu. Mega SITE stare dobre czasy ksi膮偶ki "Jak pisa膰 wirusy" z 97 roku.  W艂a艣nie od艣wie偶am troch臋 info w temacie ASM, C++ i mi si臋 to trafi艂o.  B臋d臋 zagl膮da艂, a nawet kilka rzeczy zasugeruj臋.
 ponad miesi膮c temu (02 lipca 2020 godz. 09:19)
Dawid (haker.info) napisa艂:
Dzi臋ki za komentarz. B臋d臋 stara艂 si臋 rozwija膰 witryn臋 w miar臋 wolnego czasu.
 ponad miesi膮c temu (02 lipca 2020 godz. 17:04)



Wszystkie tre艣ci umieszczone na tej witrynie s膮 chronione prawem autorskim. Surowo zabronione jest kopiowanie i rozpowszechnianie zawarto艣ci tej witryny bez zgody autora. Wszelkie opublikowane tutaj tre艣ci (w tym kody 藕r贸d艂owe i inne) s艂u偶膮 wy艂膮cznie celom informacyjnym oraz edukacyjnym. W艂a艣ciciele tej witryny nie ponosz膮 odpowiedzialno艣ci za ewentualne niezgodne z prawem wykorzystanie zasob贸w dost臋pnych w witrynie. U偶ytkownik tej witryny o艣wiadcza, 偶e z zamieszczonych tutaj danych korzysta na w艂asn膮 odpowiedzialno艣膰. Wszelkie znaki towarowe i nazwy zastrze偶one zosta艂y u偶yte jedynie w celach informacyjnych i nale偶膮 wy艂膮cznie do ich prawnych w艂a艣cicieli. Korzystaj膮c z zasob贸w witryny haker.info o艣wiadczasz, 偶e akceptujesz powy偶sze warunki oraz polityk臋 prywatno艣ci.