首页
社区
课程
招聘
[已解决] [求助] inline hook NtOpenProcess 成功,但是获取不到进程PID 保护不了某进程 32位XP系统 50.00雪花
发表于: 2018-4-1 10:41 3197

[已解决] [求助] inline hook NtOpenProcess 成功,但是获取不到进程PID 保护不了某进程 32位XP系统 50.00雪花

2018-4-1 10:41
3197
我的测试环境是 winDbg 串口双机调试 win7 64位 和虚拟机 32位xp
//驱动部分代码
// 定义一下NtOpenProcess的原型
extern "C"    typedef  NTSTATUS      __stdcall NTOPENPROCESS 
( 
 OUT PHANDLE ProcessHandle, 


 IN ACCESS_MASK AccessMask, 


 IN POBJECT_ATTRIBUTES ObjectAttributes, 


 IN PCLIENT_ID ClientId 


 );
NTOPENPROCESS   *  RealNtOpenProcess; 

PEPROCESS  EP;

// 自定义的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; 

	DbgPrint("++++++++++++Entry MyNtOpenProcess int   ++++++++++++++\n");  

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

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

		// 如果是被保护的PID,则拒绝访问,并将句柄设置为空 
		if(PID == MyPID) 
		{ 
				DbgPrint("被保护进程 MyPID=%d \n",(int)MyPID);
				//调试输出 类似C语言的 Printf
				ProcessHandle = NULL; //这个是关键
				rc = STATUS_ACCESS_DENIED; //这个返回值 
				//PsLookupProcessByProcessId((ULONG)PID,&EP);
				EP=PsGetCurrentProcess();			 
				DbgPrint(" 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; 
} 

//HOOK 函数构建
#pragma PAGECODE
VOID Hook() 
{
	ssdthook_flag = true;//设置被HOOK标志
	DbgPrint("++++HOOK START ++++-\n");
	LONG *SSDT_Adr,SSDT_NtOpenProcess_Cur_Addr,t_addr; 

	DbgPrint("驱动成功被加载中.............................\n");
	//读取SSDT表中索引值为0x7A的函数
	//poi(poi(KeServiceDescriptorTable)+0x7a*4)
	t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase;
	SSDT_Adr=(PLONG)(t_addr+0x7A*4);

	SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr;	 
	RealNtOpenAddress = *SSDT_Adr; 
	RealNtOpenProcess = (NTOPENPROCESS *)RealNtOpenAddress; 

	DbgPrint("真实的NtOpenProcess地址: %x\n",(int) RealNtOpenAddress); 
	DbgPrint("伪造NTOpenProcess地址: %x\n", (int)MyNtOpenProcess );  


	__asm //去掉页面保护
	{
		cli
			mov eax,cr0
			and eax,not 10000h //and eax,0FFFEFFFFh
			mov cr0,eax

	}

    //[804e5a88]=MyNtOpenProcess
	//[8058270a]=jmp MyNtOpenProcess=E9 jmpaddr
	ULONG jmpaddr=(ULONG)MyNtOpenProcess-RealNtOpenAddress-5;
	SSDT_Adr= (PLONG) *SSDT_Adr; //SSDT HOOK jmp jz jnz
	// in line hook
  __asm
  { 
	  mov ebx,SSDT_Adr //RealNtOpenAddress
	  mov byte ptr ds:[ebx],0xe9
	  mov eax,jmpaddr
	  mov DWORD ptr ds:[ebx+1],eax
  }

	__asm 
	{  
			//int 3
		mov     eax, cr0 
		or     eax, 10000h 
		mov     cr0, eax 
		sti 
	}   
	return;
} 
//exe部分代码
int Hook(HANDLE hDevice, ULONG pid) //pid 需要被保护进程ID
{
	
	int port[2];
	int bufret;
	ULONG dwWrite;
	port[0]=pid;
 
	
	DeviceIoControl(hDevice, hook_code , &port, 8, &bufret, 4, &dwWrite, NULL);
	return bufret;
	
}

int main(int argc, char* argv[])
{
	//add
	//CreateFile 打开设备 获取hDevice
	HANDLE hDevice = 
		CreateFile("\\\\.\\My_DriverLinkName", //\\??\\My_DriverLinkName
		GENERIC_READ | GENERIC_WRITE,
		0,		// share mode none
		NULL,	// no security
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL );		// no template
	printf("start\n");
	if (hDevice == INVALID_HANDLE_VALUE)
	{
		printf("获取驱动句柄失败: %s with Win32 error code: %d\n","MyDriver", GetLastError() );
		getchar();
		return -1;
	}

  ULONG pid;
  printf("请键入需要被保护的进程PID=");
  scanf("%d", &pid);
  Hook(hDevice, pid);

 
	return 0;
}

 不知道错在哪里 就是接受不到 线程PID 导致不能保护某个线程

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-4-1 12:01 被刘刘WDK编辑 ,原因: 添加附件
收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 775
活跃值: (2357)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
x32的话不是有很多源代码吗  .. 
2018-4-1 12:34
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
AperOdry x32的话不是有很多源代码吗 ..
我已经看了好几个代码的,都是一样的  可以  hook住  但是获取不到PID  不知道是哪里的问题,这个代码是我看的教程里面的  包括郁金香的  和天道酬勤的  都一样
2018-4-1 12:46
0
雪    币: 5
活跃值: (4486)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你代码贴完啊  IO_CTL那一部分帮你调试调试
2018-4-1 13:06
0
雪    币: 775
活跃值: (2357)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
你调用OpenProcess函数试试  ???都保护成功了怎么可能获取不到pid   
2018-4-1 13:35
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
麻木的时间 你代码贴完啊 IO_CTL那一部分帮你调试调试
https://bbs.pediy.com/attach-download-140393.htm    这个是附件地址  里面是完整的驱动和  exe程序部分
2018-4-1 13:56
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
AperOdry 你调用OpenProcess函数试试 ???都保护成功了怎么可能获取不到pid
我试了多次了  确实不行  HOOK  后  还不稳定      PID  =    ClientId->UniqueProcess;    这行代码还会造成蓝屏,我主要是技术不好,不知道是哪里的问题。
2018-4-1 13:58
0
雪    币: 545
活跃值: (257)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
驱动是教程源码编译的,EXE懒得装IDE,用的教程里编译好的,效果如图,驱动和EXE见附件,请用虚拟机测试。
上传的附件:
2018-4-1 14:40
0
雪    币: 5
活跃值: (4486)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
加Q857305819  我调试了 
2018-4-1 14:53
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
ggsuper 驱动是教程源码编译的,EXE懒得装IDE,用的教程里编译好的,效果如图,驱动和EXE见附件,请用虚拟机测试。
HOOK  我也能达到同样的效果,我主要是想要答案。  为什么获取不到PID 
2018-4-1 15:06
0
雪    币: 545
活跃值: (257)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
11
刘刘WDK HOOK 我也能达到同样的效果,我主要是想要答案。 为什么获取不到PID
注意看,我给的截图取到了PID并且成功的保护了指定的记事本进程。
2018-4-1 15:55
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
#pragma  PAGECODE
extern  "C"  NTSTATUS  __declspec(naked)  __stdcall  MyNtOpenProcessJmp(PHANDLE  ProcessHandle,  ACCESS_MASK  AccessMask,  POBJECT_ATTRIBUTES  ObjectAttributes,  PCLIENT_ID  ClientId)
{
               __asm
               {
                               push  0C4h
                                               mov  eax,RealNtOpenProcess
                                               add  eax,5
                                               jmp  eax
               }
}

#pragma  PAGECODE
extern  "C"  NTSTATUS  __stdcall  MyNtOpenProcess(PHANDLE  ProcessHandle,  ACCESS_MASK  AccessMask,  POBJECT_ATTRIBUTES  ObjectAttributes,  PCLIENT_ID  ClientId)
{

               NTSTATUS  rc;
               HANDLE  PID;
               //rc  =  (NTSTATUS)  RealNtOpenProcess(ProcessHandle,  AccessMask,  ObjectAttributes,  ClientId);

               if(  (ClientId  !=  NULL)  )
               {
                               PID  =  ClientId->UniqueProcess;

                               DbgPrint("--------PID=%d--------",  (int*)PID);
                               if  (PID  ==  MyPID)
                               {

                                               ProcessHandle  =  NULL;
                                               rc  =  STATUS_ACCESS_DENIED;
                                               EP  =  PsGetCurrentProcess();
                                               DbgPrint("线程名字  =  %s\n",  (PTSTR)((ULONG)EP+0x174));
                                               return  rc;
                               }

               }

               return  MyNtOpenProcessJmp(ProcessHandle,  AccessMask,  ObjectAttributes,    ClientId);

最终的代码改成这样了。出错的原因是堆栈不平衡
2018-4-3 21:42
0
游客
登录 | 注册 方可回帖
返回