;filename:my_ssdt_hook_2.asm
;made by correy
;QQ:112426112
;Email:leguanyuan at 126 dot com
;HomePage:http://correy.webs.com
;不足之处敬请指点
;还有可以改进的地方。
;指令有点乱,优化就交给你吧!
.386
.model flat, stdcall
option casemap:none
include ntddk.inc
include ntoskrnl.inc
includelib ntoskrnl.lib
.code
yy dd 0
correy db "ZwOpenProcess is called",0
;ep dd 0
notepad db "notepad.exe",0
szeax db "eax == %x",0
align 2
szOpenProcess dw 'Z','w','O','p','e','n','P','r','o','c','e','s','s',0
align 4
puOpenProcess dw sizeof szOpenProcess -2
dw sizeof szOpenProcess
dd offset szOpenProcess
myOpenProcess PROc x1:dword,x2:dword,x3:dword,x4:dword
local ep:dword
pushad
pushfd
;int 3
mov ecx,dword ptr [x4]
invoke PsLookupProcessByProcessId,dword ptr [ecx],addr ep
cmp eax,0 ;调试发现有几个返回值是c0000008,c000000b啥的值。
jne next ;所以加上这个判断。没有这两行在windows xp-32位打开任务管理器会蓝屏。
push eax
invoke DbgPrint,addr szeax,eax
pop eax
;int 3
mov esi,dword ptr ep
add esi,174h ;更好的办法,以后会改进的。还有未公开的函数:PsGetProcessImageFileName。
;还有ObReferenceObjectByHandle,但这个要加到后面。
;经调试的windows 7-32是16ch,windows xp-32是174h
;下面的也是一种方法。
invoke strcmp,esi,addr notepad
.if eax == 0
mov eax,0C0000022h
ret
.endif
;lea edi,notepad
;mov ecx,9
;repe CMPSB ;不匹配大小写。
;jne next
;mov eax,0C0000022h
;ret;这样可以打开那个进程,并点击X把它X了。就是不能在任务管理器中给结束掉。甚至在任务栏右键把它给关闭掉。
next:
;invoke DbgPrint,offset correy;打印一个信息。
push x4 ;调用原来的函数。
push x3
push x2
push x1
call dword ptr [yy]
mov r,eax
popfd
popad
mov eax,r
ret
r dd 0 ;这样也可以定义变量,并且是初始化的。
myOpenProcess endp
DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
local y:dword
local tem:dword
invoke MmGetSystemRoutineAddress,addr puOpenProcess;必须是Zw系列的,nt系列的得到的索引不对。他们的地址还不一样。
;这里返回的是Zw系列函数的地址,非Nt系列的函数的地址。
;用本函数的有点是稳定,缺点是不能获取未公开的函数,我没有试,是猜想的。
;此函数在windows xp与windows 7下通吃。也就是此程序。
inc eax ;注释:此处用一个技巧,此处的汇编是mov eax,xxh 占用5个字节。
mov ecx,[eax] ;所以跳过一个字节就是索引了。
sal ecx,2
mov eax,KeServiceDescriptorTable;这是个变量还是个函数呀!在头文件里面。
mov eax,[eax]
mov eax,[eax]
add eax,ecx
mov y,eax ;得到存储函数地址的地址。
mov eax,[eax] ;得到Nt系列的函数的地址。
mov yy,eax
push eax;另一种办法是mdl,甚么的。
cli
mov eax, cr0;
mov tem, eax;
and eax, 0FFFEFFFFh;
mov cr0, eax;
pop eax;
mov eax,myOpenProcess ;这三行是赋予新的函数的地址。
mov edx,y
mov dword ptr [edx],eax
push eax; 不用说了吧!
mov eax,tem
mov cr0, eax;
pop eax;
sti
mov eax,0
ret
DriverEntry endp
end DriverEntry
;没有卸载函数。你找工具卸载吧!
;made at 2011.06.20
没有评论:
发表评论