首页
社区
课程
招聘
[旧帖] 过TP ntopenprocess 蓝屏问题 0.00雪花
发表于: 2011-6-28 18:52 7248

[旧帖] 过TP ntopenprocess 蓝屏问题 0.00雪花

2011-6-28 18:52
7248
0x805CC628    |    FF75 C8    |    push dword ptr [ebp-38]    |        
0x805CC62B    |    FF75 DC    |    push dword ptr [ebp-24]    |        
0x805CC62E    |    E8 4706FFFF    |    call ObOpenObjectByPointer    |        
0x805CC633    |    8BF8    |    mov edi, eax    |        
0x805CC635    |    8D85 48FFFFFF    |    lea eax, dword ptr [ebp-B8]    |        
0x805CC63B    |    50    |    push eax    |
0x805CC63C    |    E8 47550200    |    call SeDeleteAccessState    |        
我想从0x805CC633 开始hook,先保存 0x805CC633到0x805CC63B这三行的代码
修改后以上这几行我假想变成如下
  push dword ptr [ebp-38]
push dword ptr [ebp-24]
call ObOpenObjectByPointer
jmp myntopenprocess
nop
nop
nop
nop
(余下的用nop填充)
接下来是我的函数的处理
我想一开始先call ObOpenObjectByPointer
因为TP inline hook了
0x805CC62E    |    E8 4706FFFF    |    call ObOpenObjectByPointer   
这一行
于是得先call ObOpenObjectByPointer
得到函数返回值,然后后面有9个被破坏的代码,要弄回来于是用nop填充(这个时候用刚才保存的代码复制过来)最后再跳转到0x805CC63C这一行就行了,我的函数代码如下
mov eax,0x805BCC7A//我家ObOpenObjectByPointer的地址是0x805BCC7A
jmp eax
nop
nop
nop
nop
nop
nop
nop
nop
nop
mov eax,0x805CC63C
jmp eax
最后我想再在卸载驱动的时候,将保存的代码复制过去,就行了,但是我却无数次的蓝屏,各位大虾帮我看看,代码如下
#include <ntddk.h>
#include <windef.h>
#include <ntstatus.h>
BYTE JmpAddress[9]={0xE9,0,0,0,0,0x90,0x90,0x90,0x90};
ULONG hookaddress;
BYTE store[9];
void A()
{
   __asm{
    cli
         mov  eax,cr0
    and  eax,not 10000h
    mov  cr0,eax
  }
}
void B()
{
   __asm{
          mov  eax,cr0
    or   eax,10000h
    mov  cr0,eax
    sti
  }
}
__declspec(naked) VOID __stdcall New_NtOpenProcess()
{
  _asm
{
  mov eax,0x805CC633//call ObOpenObjectByPointer
  call eax
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  nop//中间的nop用来保存被破坏的代码
    mov eax,0x805CC63C//跳转到0x805CC63C
    jmp eax
}
}
void Hook()
{
KIRQL Irql;
    hookaddress=(ULONG)0x805CC633;
   *(ULONG*)(JmpAddress+1)=(ULONG)New_NtOpenProcess-((ULONG)hookaddress+0x5);//这里是inline hook的准备大家都懂吧
   A();
   Irql=KeRaiseIrqlToDpcLevel();
   memcpy(store,(BYTE*)hookaddress,9);//保存9字节代码
   memcpy((BYTE*)New_NtOpenProcess+7,store,9);将9字节代码复制到New_NtOpenProcess的nop位置
   memcpy((BYTE*)hookaddress,JmpAddress,9);//完成inline
   KeLowerIrql(Irql);
   B();
   
}
VOID Unload(IN PDRIVER_OBJECT pDriverObj)
    {
KIRQL Irql;
   A();
   Irql=KeRaiseIrqlToDpcLevel();
   memcpy((BYTE*)hookaddress,store,9);//将代码复制过去
   KeLowerIrql(Irql);
   B();
    }
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj,PUNICODE_STRING      pRegistryString)

    {

    pDriverObj->DriverUnload = Unload;

    Hook();

    return STATUS_SUCCESS;

    }

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大家帮忙啊,谢谢了
2011-6-28 18:58
0
雪    币: 3107
活跃值: (1249)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
直接加个内核啦,还HOOK,

神马HOOK全是浮云。。
2011-6-28 20:07
0
雪    币: 96
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
怎么加内核啊啊
2011-6-28 20:15
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
5
Unload例程要求IRQL为PASSIVE_LEVEL
2011-6-30 17:45
0
雪    币: 246
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
有点想明白了。。。
2011-6-30 23:51
0
雪    币: 96
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
上面的哥们,想明白什么了,说说啊
2011-7-2 22:30
0
雪    币: 96
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
。。。。。。。。。。。。
2012-2-3 19:31
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
#pragma PAGECODE
__declspec(naked)VOID My_NtOpenPrcoess()
{ 
__asm
{
push dword ptr [ebp-0x38]
push dword ptr [ebp-0x24]
call Old_ObOpenObjectByPointer_Addr
jmp Old_NtOpenProcess_Addr_229
}
}
 
HOOK的时候
#pragma PAGECODE
VOID HOOK(){ 
mov ebx,Old_NtOpenProcess_Addr
add ebx,0x21E
mov al,0xE9
mov byte ptr [ebx],al
lea eax,My_NtOpenPrcoess
sub eax,ebx 
sub eax,5
mov [ebx+0x1],eax
}
2012-2-5 12:00
0
游客
登录 | 注册 方可回帖
返回
//