首页
社区
课程
招聘
[原创]Hook ObReferenceObjectByHandle的另一种框架
发表于: 2009-8-7 22:28 7875

[原创]Hook ObReferenceObjectByHandle的另一种框架

2009-8-7 22:28
7875
看到过几次hook ObReferenceObjectByHandle的代码,总感觉过程非常纠结,不停hook了又恢复,恢复了又hook,在几个函数间来回跳。
今天下午尝试写了个不那么纠结的框架,跟大家分享:
(练手作品,有错误的地方请大家指点)
#include <ntddk.h>
//Hook ObReferenceObjectByHandle
//by Fypher
//http://hi.baidu.com/nmn714

unsigned char OriginalBytes[5]={0};
unsigned char JmpAddress[5]={0xE9,0,0,0,0};

extern POBJECT_TYPE *PsProcessType;

//唯一的fake函数,不恢复hook
_declspec (naked) void FakeReferenceObjectByHandle(){
	_asm{
		push [esp+0x18]			//参数压栈
		push [esp+0x18]
		push [esp+0x18]
		push [esp+0x18]
		push [esp+0x18]
		push [esp+0x18]
		push fakeeip			//压入假的返回地址

		mov edi,edi				//ObReferenceObjectByHandle的前5个字节
		push ebp
		mov ebp,esp

		mov eax,ObReferenceObjectByHandle
		add eax,5
		jmp eax					//跳到ObReferenceObjectByHandle去执行
	
fakeeip:
		push eax				//现在的eax是返回值,所以需要压栈保留
		mov eax,[esp+0x10]		//第3个参数,判断是不是进程
		mov ecx,PsProcessType;	
		mov ecx,[ecx];
		cmp eax,ecx;
		jnz pass;				//不是进程就pass

		mov eax,[esp+0x18];		//第5个参数,即返回的EPROCESS
		mov eax,[eax];
		add eax,0x174;
		mov eax,[eax];
		cmp al,'n';				//判断进程名是否以“n”开头,可用notepad测试
		jnz pass				//如果不是则pass

		pop eax
		mov eax,[esp+0x14]		//第5个参数,即返回的EPROCESS,填0
		mov dword ptr [eax],0
		push 0xC0000022L		//STATUS_ACCESS_DENIED
	
pass:
		pop eax;
		retn 0x18;
	}
}

//没有新意的hook函数
void  HookObReferenceObjectByHandle(){
	RtlCopyMemory(OriginalBytes,(unsigned char*)ObReferenceObjectByHandle,5);
	*(ULONG *)(JmpAddress+1)=(ULONG)FakeReferenceObjectByHandle-((ULONG)ObReferenceObjectByHandle+5);
	_asm{
		cli
		mov eax, cr0 
		and eax, not 0x10000 
		mov cr0, eax
	}
    RtlCopyMemory((unsigned char *)ObReferenceObjectByHandle,JmpAddress,5);
	_asm{
		mov eax, cr0
		or eax,0x10000
		mov cr0,eax
		sti
	}
}

//unhook函数
void UnHookObReferenceObjectByHandle(){
	_asm{
		cli
		mov eax, cr0 
		and eax, not 0x10000 
		mov cr0, eax
	}
	RtlCopyMemory((unsigned char*)ObReferenceObjectByHandle,OriginalBytes,5);
	__asm{
		mov eax, cr0
		or eax,0x10000
		mov cr0,eax
		sti
	}
}

VOID OnUnload(IN PDRIVER_OBJECT o){
	UnHookObReferenceObjectByHandle();
	return;
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath){
	DriverObject->DriverUnload=OnUnload;
	HookObReferenceObjectByHandle();
	return STATUS_SUCCESS;
}

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
用汇编写这么多,很累啊.
呵呵.
2009-8-7 22:38
0
雪    币: 462
活跃值: (53)
能力值: ( LV9,RANK:460 )
在线值:
发帖
回帖
粉丝
3
这段代码好像是直接从Rootkit.Goldun中拿出来的
2009-8-7 22:47
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
4
_declspec (naked) void FakeReferenceObjectByHandle(){
        _asm{
                push [esp+0x18]                        //参数压栈
                push [esp+0x18]
                push [esp+0x18]
                push [esp+0x18]
                push [esp+0x18]
                push [esp+0x18]
                push fakeeip                        //压入假的返回地址

                mov edi,edi                                //ObReferenceObjectByHandle的前5个字节
                push ebp
                mov ebp,esp

                mov eax,ObReferenceObjectByHandle
                add eax,5
                jmp eax                                //跳到ObReferenceObjectByHandle去执行
        
fakeeip:
这跟sysdog另一帖的流程:
_declspec (naked) NTSTATUS OriginalObReferenceObjectByHandle(IN HANDLE  Handle,
                                                                                                                 IN ACCESS_MASK  DesiredAccess,
                                                                                                                 IN POBJECT_TYPE  ObjectType  OPTIONAL,
                                                                                                                 IN KPROCESSOR_MODE  AccessMode,
                                                                                                                 OUT PVOID  *Object,
                                                                                                                 OUT POBJECT_HANDLE_INFORMATION  HandleInformation  OPTIONAL)
{
        _asm
        {   
                    mov edi,edi
                        push ebp
                        mov ebp,esp

                        mov eax,ObReferenceObjectByHandle
                        add eax,5
                        jmp eax                
        }
        
}

NTSTATUS DetourMyObReferenceObjectByHandle(
                                                                           IN HANDLE  Handle,
                                                                           IN ACCESS_MASK  DesiredAccess,
                                                                           IN POBJECT_TYPE  ObjectType  OPTIONAL,
                                                                           IN KPROCESSOR_MODE  AccessMode,
                                                                           OUT PVOID  *Object,
                                                                           OUT POBJECT_HANDLE_INFORMATION  HandleInformation  OPTIONAL)
{
        NTSTATUS status;
        //调用原函数
        status=OriginalObReferenceObjectByHandle(Handle,DesiredAccess,ObjectType,AccessMode,Object,HandleInformation);
其实是一回事,而楼主这样写搞了大量内嵌汇编,看起来好像汇编玩得不错,但是与sysdog这个写法相比之下,楼主的就显得太矫情了,何必呢……
2009-8-7 22:57
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=轩辕小聪;667881]_declspec (naked) void FakeReferenceObjectByHandle(){
        _asm{
                push [esp+0x18]                        //参数压栈
                p...[/QUOTE]

呵呵,练手而已,想试试只有一个fake函数,不在多个函数中跳,而且整个过程不恢复hook~
另外ObReferenceObjectByHandle函数被系统调用极为频繁,这样处理对系统效率影响小一些

另:sysdog那一贴所说的耗死CPU的原因找到了吗?
2009-8-7 23:51
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
都是高手,我只是看看不说话。
2009-8-7 23:58
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
7
小聪的处理不错
2009-8-8 19:24
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
8
不使用hook 引擎?
2009-12-29 01:54
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
9
自己写的……和Rootkit.Goldun中的一样吗?还没看过Rootkit.Goldun
2009-12-29 08:43
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
10
主要是为了效率啦,这个函数系统调用很频繁的……
2009-12-29 08:44
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
11
我也hook了这个函数,xp ,2003就没有蓝过
2009-12-29 14:48
0
游客
登录 | 注册 方可回帖
返回
//