首页
社区
课程
招聘
[求助]hook掉NtOpenProcess跳到自己函数保护指定进程,无法实现是怎么回事
发表于: 2013-3-10 12:54 8431

[求助]hook掉NtOpenProcess跳到自己函数保护指定进程,无法实现是怎么回事

2013-3-10 12:54
8431
已经hook 掉NtOpenProcess跳到自己函数中去,并且找了被保护的那个进程,接下我该怎么处理才能做到保护

以下是自己函数的代码
extern "C" NTSTATUS __declspec(naked) _stdcall NewNtOpenProcess(
                        PHANDLE ProcessHandle,
                        ACCESS_MASK DesiredAccess,
                        POBJECT_ATTRIBUTES ObjectAttributes,
                        PCLIENT_ID ClientId)
{
        NTSTATUS result;
        HANDLE pid;
        _asm
        {
                push ebp
                mov ebp,esp
                sub esp,0ch
                pushad

        }
        if(ClientId != NULL)
        {
                pid = ClientId->UniqueProcess;
                KdPrint(("pid : %d\n",pid));
                if(InPID == pid) //找到被保护的进程PID
                {
                        ProcessHandle = NULL;
                        result = STATUS_ACCESS_DENIED; //拒绝访问
                        PEPROCESS  EP = PsGetCurrentProcess();
                        KdPrint(("ACESS Process Name : %s\n",(PTSTR)((ULONG)EP+0x174))); //输出进程名
                        _asm
                        {
                                popad
                                mov esp,ebp
                                pop ebp
                                mov eax,result
                                retn 0x10 //这里执行完后,该进程还是可以被正常打开,郁闷!!!
                        }       
                }
        }
        _asm
        {
                popad
                mov esp,ebp
                pop ebp
                push 0xc4
                mov eax,RealNtOpenProcess
                add eax,5
                jmp eax
        }
        //return ret;
}
大家看看有什么问题呀??如何修改

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 496
活跃值: (291)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
2

NTSTATUS __declspec(naked) NewNtOpenProcess_stub( 
	PHANDLE ProcessHandle,
	ACCESS_MASK DesiredAccess,
	POBJECT_ATTRIBUTES ObjectAttributes,
	PCLIENT_ID ClientId)
{
	_asm
	{
		mov		edi, edi
		push	ebp
		mov		ebp, esp
		mov		eax, RealNtOpenProcess
		add		eax, 5
		jmp		eax 
	}
}

NTSTATUS NewNtDeviceIoControlFile( 
	PHANDLE ProcessHandle,
	ACCESS_MASK DesiredAccess,
	POBJECT_ATTRIBUTES ObjectAttributes,
	PCLIENT_ID ClientId)
{
	if(ClientId != NULL)
	{
		HANDLE pid = ClientId->UniqueProcess;
		KdPrint(("pid : %d\n", pid));

		if(g_TargetPid == pid) //找到被保护的进程PID
		{
			// 输出进程名,这里硬编码的话兼容性很差的,换个系统可能就挂了
			PEPROCESS EP = PsGetCurrentProcess();
			KdPrint(("ACESS Process Name : %s\n",(PTSTR)((ULONG)EP+0x174))); 

			// 处理返回值
			// 你的主要错误就在这里吧,传入的是应用层的Handle的地址,要赋值的话需要解引用
			*ProcessHandle = NULL;	
			NTSTATUS status = STATUS_ACCESS_DENIED; //拒绝访问
			return status;
		}
	}

	return NewNtOpenProcess_stub(
		ProcessHandle,
		DesiredAccess,
		ObjectAttributes,
		ClientId);
}

2013-3-10 14:05
0
雪    币: 169
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢,解决了
2013-3-10 14:28
0
雪    币: 169
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢已解决,我是照的那个人的教程做的,为什么他的代码就没事呢
2013-3-10 14:29
0
雪    币: 169
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那个人的原代码是这样的,但是可以照常实现

// 自定义的NtOpenProcess函数 ZwOpenProcess
#pragma PAGECODE
extern "C" NTSTATUS __declspec(naked) __stdcall MyNtOpenProcess(
        OUT     PHANDLE ProcessHandle,
        IN     ACCESS_MASK DesiredAccess,
        IN     POBJECT_ATTRIBUTES ObjectAttributes,
        IN     PCLIENT_ID ClientId )
{
        NTSTATUS     rc;
        HANDLE       PID;

        //KdPrint(("++++++++++++Entry MyNtOpenProcess int   ++++++++++++++\n"));  

        //rc = (NTSTATUS)RealNtOpenProcess( ProcessHandle, DesiredAccess, ObjectAttributes, ClientId );        

        if( (ClientId != NULL) )
        {
                PID = ClientId->UniqueProcess;          
                KdPrint(( "------------------------- PID=%d--------------\n",(int*)PID ));

                // 如果是被保护的PID,则拒绝访问,并将句柄设置为空
                if(PID == MyPID)
                {
                        KdPrint(("被保护进程 MyPID=%d \n",(int)MyPID));
                        //调试输出 类似C语言的 Printf
                        ProcessHandle = NULL; //这个是关键
                        rc = STATUS_ACCESS_DENIED; //这个返回值
                        //PsLookupProcessByProcessId((ULONG)PID,&EP);
                        EP=PsGetCurrentProcess();                         
                        KdPrint((" ACESS Process Name  --:%s--   \n",(PTSTR)((ULONG)EP+0x174)));
                        __asm
                        {
                                retn 0x10
                        }

                }
        }
        __asm
        {   int 3
                push    0C4h
                mov eax,RealNtOpenProcess //
                add eax,5
                jmp eax

        }
        //return rc;
}
2013-3-10 14:31
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
6
ClientId  这是一个指针... 一定要判断 mmUserAddressRegion  ,probeForRead等.....大哥....小心蓝.....
2013-3-10 14:59
0
雪    币: 169
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
什么情况

???
2013-3-10 15:12
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
8
.text:B1AB4ADF loc_B1AB4ADF:                           ; CODE XREF: sub_B1AB4A8C+3Dj
.text:B1AB4ADF                 push    4
.text:B1AB4AE1                 pop     edi
.text:B1AB4AE2                 push    edi             ; Alignment
.text:B1AB4AE3                 push    edi             ; Length
.text:B1AB4AE4                 push    eax             ; Address
.text:B1AB4AE5                 call    ds:ProbeForWrite
.text:B1AB4AEB                 mov     ecx, ds:MmUserProbeAddress
.text:B1AB4AF1                 mov     eax, [ebp+Address]
.text:B1AB4AF4                 cmp     eax, [ecx]
.text:B1AB4AF6                 jnb     short near ptr byte_B1AB4ACB
.text:B1AB4AF8                 push    edi             ; Alignment
.text:B1AB4AF9                 push    18h             ; Length
.text:B1AB4AFB                 push    eax             ; Address
.text:B1AB4AFC                 mov     esi, ds:ProbeForRead
.text:B1AB4B02                 call    esi ; ProbeForRead
.text:B1AB4B04                 mov     eax, [ebp+arg_C]
.text:B1AB4B07                 test    eax, eax
.text:B1AB4B09                 jnz     short loc_B1AB4B2B
.text:B1AB4B0B                 mov     [ebp+ms_exc.disabled], 0FFFFFFFEh

某驱动 ,看看就知道鸟.... hook 得稳定哈
2013-3-10 15:14
0
雪    币: 496
活跃值: (291)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
9
擦 不好意思啊。。贴错一个函数名。。
2013-3-10 15:17
0
雪    币: 169
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
不就个名字,把跳转单独写在一个函数,有什么好
2013-3-10 15:24
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
看LZ是2007年注册的。。。
这已经是驱动保护的入门级别了啊
2013-3-10 15:25
0
雪    币: 169
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
就是刚开始学驱动,只是注册的早
2013-3-10 15:28
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
13
extern "C" NTSTATUS __declspec(naked) _stdcall NewNtOpenProcess(
      PHANDLE ProcessHandle,
      ACCESS_MASK DesiredAccess,
      POBJECT_ATTRIBUTES ObjectAttributes,
      PCLIENT_ID ClientId)
{

奇葩的函数声明。。。。。
2013-3-10 15:30
0
雪    币: 169
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
extern "C" 声明为C函数
__declspec(naked) 生成纯汇编
_stdcall 调用自身平衡栈

不知道有什么新见解?
2013-3-10 15:38
0
雪    币: 115
活跃值: (46)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
15
个人有地方不懂,如果是开头就跳的话,那么返回指针有无修改应该都一样,因为根本没去执行真的NTOP

测试结果成功保护了进程,奇怪的是
_asm
      {
        popad
        mov esp,ebp
        pop ebp
        mov eax,result //这行要放在leave之上,不然返回值会变成其他的,显示"句柄无效"
        retn 0x10 //这里执行完后,该进程还是可以被正常打开,郁闷!!!
}
2013-3-10 15:51
0
雪    币: 46
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
好贴必定必定必定
2013-3-18 10:40
0
游客
登录 | 注册 方可回帖
返回
//