Dawno, dawno temu, jeszcze w czasach, gdy dominującym systemem był Windows 2000, prowadziłem szkolenie Hardening Windows 2000. W jego ramach pokazywałem kilka "sztuczek", między innymi wykorzystanie Alternate Data Streams w NTFS.
*.exe to tylko konwencja
Jedną ze "sztuczek", która zrobiła wówczas szczególne wrażenie, było wykorzystanie ADS do ukrycia kodu. Na przykład zapisanie pliku wykonywalnego jako ADS katalogu i uruchomienie tego kodu. Wtedy robiło to większe wrażenie, niż dziś, bo w GUI (Task Manager) nie była pokazywana informacja o ADS. Jak to mogło działać?
Trzeba uświadomić sobie, że plik wykonywalny wcale nie musi mieć rozszerzenia exe. Rozszerzenia *.exe, *.com czy *.dll to tak naprawdę przede wszystkim konwencja. Bez problemu można "uruchomić" choćby plik *.txt: Name Pid Pri Thd Hnd Priv CPU Time Elapsed Time plik.txt 2648 8 1 17 1408 0:00:00.030 0:03:39.357 Jest to po prostu kwestia odpowiedniego wywołania funkcji CreateProcess. Przy okazji, warto przeczytać: Why does a corrupted binary sometimes result in "Program too big to fit in memory"?.
Oznacza to, że rozpoznawanie typu pliku wyłącznie po jego rozszerzeniu jest sposobem zdecydowanie niewystarczającym, zwłaszcza jeśli chodzi o pliki wykonywalne. Zamiast tego można wykorzystać narzędzia typu: TRiD oraz gt2 (patrz lista narzędzi na wiki). Dla przykładu rezultat narzędzia TRiD:trid plik.txt
TrID/32 - File Identifier v2.02 - (C) 2003-06 By M.Pontello Definitions found: 3640 Analyzing... Collecting data from file: plik.txt 60.8% (.EXE) Win32 Executable MS Visual C++ (generic) (31206/45/13) 16.6% (.EXE) Win32 Executable Generic (8527/13/3) 14.7% (.DLL) Win32 Dynamic Link Library (generic) (7583/30/2) 3.9% (.EXE) Generic Win/DOS Executable (2002/3) 3.8% (.EXE) DOS Executable Generic (2000/1)
Jeszcze więcej informacji dostarcza narzędzie gt2:
gt2 plik.txt gt2 0.35 (c) 1999-2006 by PHaX (philip[at]helger.com) - plik.txt (389120 bytes) - binary Is a Win32 executable Size of header 00000040h / 64 File size in header 00000490h / 1168 Entrypoint 00000040h / 64 Overlay size 0005EB70h / 387952 No relocation entries PE EXE at offset 000000D8h / 216 Entrypoint 00004446h / 17478 Entrypoint RVA 00005046h Entrypoint section .text Calculated PE EXE size 0005F000h / 389120 Image base 4AD00000h / 1255145472 File seems to be rebased Required CPU type 80386 Required OS 5.01 - Win 98 or 2k Subsystem Windows CUI Linker version 7.10 Stack reserve 00100000h / 1048576 Stack commit 00100000h / 1048576 Heap reserve 00100000h / 1048576 Heap commit 00001000h / 4096 Flags: Relocation info stripped from file File is executable Line numbers stripped from file Local symbols stripped from file Machine based on 32-bit-word architecture Processed/created with: Seems to be linked with Microsoft linker 7.1 / .NET 2003
Jako ciekawostkę napiszę że z tego co mi wiadomo, to w firmach prowadzących monitoring malware'u w ogóle nie zwraca się uwagi ani na nazwę, ani na rozszerzenie - pierwsze co się robi po otrzymaniu pliku to zmienia jego nazwę na sumę kontrolną (np MD5 lub SHA1), i traktuje programami do wykrywania typu pliku (zazwyczaj domowejHHHHfirmowej roboty) ;>