CIH病毒原理的應用——實體記憶體的讀寫 (轉)
大家都很討厭 ,可毛老人家教導我們:“要一分為二地看問題”,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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CIH 病毒原理的應用――實體記憶體的讀寫 (4千字)記憶體
- Linux讀寫實體記憶體Linux記憶體
- 讀寫CMOS記憶體 (轉)記憶體
- 7.7 實現程式記憶體讀寫記憶體
- Billy Belceb病毒編寫教程(DOS篇)---駐留記憶體病毒記憶體
- 記憶體不能為read 記憶體讀寫錯誤的解決辦法記憶體
- 記憶體管理篇——實體記憶體的管理記憶體
- Java應用程式中的記憶體洩漏及記憶體管理Java記憶體
- android 管理應用的記憶體Android記憶體
- OS實驗八:採用快取記憶體實現檔案讀寫快取記憶體
- Netweaver工作程式的記憶體限制 VS CloudFoundry應用的記憶體限制記憶體Cloud
- python能讀寫記憶體嗎Python記憶體
- filebeat實踐-記憶體佔用-最大記憶體佔用記憶體
- [轉帖]Solaris記憶體管理以及判定記憶體是否夠用的方法記憶體
- Oracle9i的實體記憶體管理(轉)Oracle記憶體
- 虛擬記憶體系統——瞭解記憶體的工作原理記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- 記憶體定址原理記憶體
- 用匯編編寫DOS下的記憶體駐留程式(5) (轉)記憶體
- 用匯編編寫DOS下的記憶體駐留程式(3) (轉)記憶體
- 用匯編編寫DOS下的記憶體駐留程式(4) (轉)記憶體
- 巨耗記憶體的寫法:記憶體
- 企業應用的轉折點:記憶體計算技術記憶體
- 減少.NET應用程式記憶體佔用的一則實踐記憶體
- volatile的記憶體語義與應用記憶體
- Java 8 記憶體管理原理解析及記憶體故障排查實踐Java記憶體
- 實體記憶體和虛擬記憶體記憶體
- iOS底層原理(一):OC物件實際佔用記憶體與開闢記憶體關係iOS物件記憶體
- golang 切片記憶體應用技巧Golang記憶體
- OpenResty 和 Nginx 的共享記憶體區是如何消耗實體記憶體的RESTNginx記憶體
- Linux記憶體使用的體會(轉)Linux記憶體
- 遊戲修改器製作教程四:用API讀寫記憶體遊戲API記憶體
- Go實戰 | 基於本地記憶體的快取的應用及實現Go記憶體快取
- 【轉】java中的記憶體溢位和記憶體洩漏Java記憶體溢位
- iOS記憶體管理的那些事兒-原理及實現iOS記憶體
- C++ 多型的實現原理與記憶體模型C++多型記憶體模型
- 一款高效又省記憶體的讀寫Excel的JAVA框架記憶體ExcelJava框架
- android training管理應用的記憶體AndroidAI記憶體