2012年7月5日星期四

my_ssdt_hook_2.asm


;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

没有评论:

发表评论