CIH病毒原理的應用——實體記憶體的讀寫 (轉)

worldblog發表於2007-12-23
CIH病毒原理的應用——實體記憶體的讀寫 (轉)[@more@]

大家都很討厭 ,可毛老人家教導我們:“要一分為二地看問題”,CIH
病毒很可怕,但是它使用的某些特殊技術還是可以借鑑的,這樣可以做到變害
為利 95/98應用無法直接讀寫物理,如果使用VxD,可以
VMM功能_MapPhysToLinear將實體地址對映到線性地址再進行修改,但是這
樣就必須單獨寫一個VxD,比較麻煩,那麼能不能在應用程式中直接呼叫VMM功
能呢?一般不能,因為VMM功能要在Ring 0上呼叫,而一般的應用程式工作在
Ring 3上,那麼為什麼CIH 病毒能夠呼叫VMM功能呢,CIH病毒使用了一種技術,
採用的中斷從Ring 3轉到Ring 0,我們完全可以借鑑這種技術來調
用VMM功能,下面的程式演示瞭如何修改實體記憶體——以在Windows 95程式
中修改加密扇區大小(實體地址0000:0525H)為例:

;****************************************************************************
;* Windows 95加密核心模組之一--扇區大小修改程式 *
;* *
;* 本程式在Windows 95下修改記憶體實體地址0000:0525 處的磁碟扇區大小位元組, *
;* 為了能夠修改實體地址,本程式使用了VMM 功能_MapPhysToLinear將實體地址對映 *
;* 到線性地址進行修改。為了在應用程式中呼叫VMM 功能,本程式使用了CIH 病毒的 *
;* 原理,使用中斷將由Ring 3轉到Ring 0,然後呼叫VMM 功能。 *
;* 本程式中的過程ChangeSectorSize在VC中的原型可以寫成: *
;* *
;* void _stdcall ChangeSectorSize(BYTE SectorSize); *
;****************************************************************************

.386p

.model flat,stdcall

;修改的中斷號,如果本中斷號改成3則可以防止Soft-ICE跟蹤!

HookExceptionNo EQU 05h

.data
IDTR_1 6 dup(0) ;儲存中斷描述符表暫存器
OldExceptionHook dd 0 ;儲存原先的中斷入口地址

.code

;修改扇區大小過程

ChangeSectorSize PROC SectorSize:BYTE
push eax
;獲取修改的中斷的中斷描述符(中斷門)地址
sidt IDTR_1
mov eax,d ptr IDTR_1+02h
add eax,HookExceptionNo*08h+04h
cli
;儲存原先的中斷入口地址
push ecx
mov ecx,dword ptr [eax]
mov cx,word ptr [eax-04h]
mov dword ptr OldExceptionHook,ecx
pop ecx
;設定修改的中斷入口地址為新的中斷處理程式入口地址
push ebx
lea ebx,NewExceptionHook
mov word ptr [eax-04h],bx
shr ebx,10h
mov word ptr [eax+02h],bx
pop ebx
;中斷,轉到Ring 0(與CIH 病毒原理相似!)
push ebx
mov bl,byte ptr SectorSize ;扇區大小儲存在bl暫存器中
int HookExceptionNo
pop ebx
;恢復原先的中斷入口地址
push ecx
mov ecx,dword ptr OldExceptionHook
mov word ptr [eax-04h],cx
shr ecx,10h
mov word ptr [eax+02h],cx
pop ecx
;修改扇區大小過程結束
sti
pop eax
ret
ChangeSectorSize ENDP

;新的中斷處理程式

NewExceptionHook PROC
push eax
push ebx
push ecx
push edx
push esi
;修改扇區大小
push dword ptr 00000000h ;必須為0
push dword ptr 00000001h ;位元組數
push dword ptr 00000525h ;實體地址0000:0525
int 20h
dd 0001006ch ;以上兩條指令相當於 VMMCall _MapPhysToLinear
pop esi
pop esi
pop esi
mov byte ptr [eax],bl ;修改扇區大小
;中斷處理程式結束
pop esi
pop edx
pop ecx
pop ebx
pop eax
iretd
NewExceptionHook ENDP

end

本過程可以被C語言呼叫,編譯方法:ml /c /coff w95enc.asm。請用MASM 6.11
以上版本編譯,不需要DDK。將編譯生成的OBJ插入VC的工程中,並在VC程式
中寫上原型說明,就可以呼叫了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-995500/,如需轉載,請註明出處,否則將追究法律責任。

相關文章