實現ring0倒不是很難。
如果你不想為此再寫一個vxd的話,用CIH的技術吧。
不好意思,俺不懂uixm
轉一篇白雲黃鶴上的帖子,供參考
【實際當中應這樣寫函式原型
extern "C" void _stdcall ChangeSectorSize(BYTE SectorSize); 】
---------------------------------------------------
發信人: TBsoft (TBsoft), 信區: Virus
標 題: CIH 病毒原理的應用――實體記憶體的讀寫
發信站: 武漢白雲黃鶴站 (Fri Mar 12 18:44:00 1999) , 站內信件
大家都很討厭CIH 病毒,可毛老人家教導我們:“要一分為二地看問題”,
CIH病毒很可怕,但是它使用的某些特殊技術還是可以借鑑的,這樣可以做到
變害為利
Windows 95/98應用程式無法直接讀寫實體記憶體,如果使用VxD程式設計,可以
呼叫VMM功能_MapPhysToLinear將實體地址對映到線性地址再進行修改,但是這
樣就必須單獨寫一個VxD,比較麻煩,那麼能不能在應用程式中直接呼叫VMM功
能呢?一般不能,因為VMM功能要在Ring 0上呼叫,而一般的應用程式工作在
Ring 3上,那麼為什麼CIH 病毒能夠呼叫VMM功能呢,CIH病毒使用了一種技術,
採用Intel處理器的中斷從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 db 6 dup(0) ;儲存中斷描述符表暫存器
OldExceptionHook dd 0 ;儲存原先的中斷入口地址
.code
;修改扇區大小過程
ChangeSectorSize PROC SectorSize:BYTE
push eax
;獲取修改的中斷的中斷描述符(中斷門)地址
sidt IDTR_1
mov eax,dword 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程式中寫
上函式原型說明,就可以呼叫了。
本斑竹這幾天在集中精力研究CIH病毒,希望能夠儘早分析出它的殺除方法。這
段文章算是一個“副產品”吧,有什麼意見只管提呀。
好久沒有發文章了……
--
天生我才,就做一篇錦繡文章。
風起雲湧,就挽一回狂瀾巨浪。
成也堂堂!
敗也堂堂!
※ 修改:・TBsoft 於 Mar 12 18:45:48 修改本文・[FROM: 210.42.24.31]
※ 來源:・武漢白雲黃鶴站 s1000e.whnet.edu.cn・[FROM: 210.42.24.31]