首页
社区
课程
招聘
未解决 [求助]怎样在内核下获取当前活动的窗口
发表于: 2019-12-24 11:36 3405

未解决 [求助]怎样在内核下获取当前活动的窗口

2019-12-24 11:36
3405
通过自己分析和查找资料发现可以使用NtUserGetThreadState函数

	ULONG_PTR NtUserGetThreadState(ULONG ThreadState)
	{
		PVOID ThreadStateProcAddr = NULL;

		ThreadStateProcAddr = GetShadowSSDTProcAddr(0x3);
		KdPrint(("NtUserGetThreadState的地址为%p\n", ThreadStateProcAddr));


		NTSTATUS status;
		
		PRKAPC_STATE apcState;
		
		PEPROCESS eprocess;
		
		status = PsLookupProcessByProcessId((HANDLE)GetPidByProcName((PWCHAR)L"csrss.exe"), &eprocess);
		
		if (!NT_SUCCESS(status))
		{
			return NULL;
		}
		
		apcState = (PRKAPC_STATE)ExAllocatePool(NonPagedPool, sizeof(KAPC_STATE));
		
		KeStackAttachProcess((PRKPROCESS)eprocess, apcState);


		// 这里蓝屏,在获取当前线程信息时,rax返回为0,所以在返回句柄时出现内存访问错误

		ULONG_PTR hActiveWindow = ((pfNtUserGetThreadState)ThreadStateProcAddr)(ThreadState);
	

		KeUnstackDetachProcess(apcState);
		ExFreePool(apcState);
		
		ObDereferenceObject(eprocess);

		return hActiveWindow;
	}


	NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
	{
		NTSTATUS status = STATUS_UNSUCCESSFUL;


		DriverObject->DriverUnload = DriverUnload;


		status = STATUS_SUCCESS;


		HANDLE hActiveWindow = (HANDLE)NtUserGetThreadState(1);

		KdPrint(("驱动加载\n"));

		return status;
	}



调试发现在NtUserGetThreadState函数内部,在获取当前线程信息时返回为0,之后造成内存访问出错蓝屏

我觉得可能是我这个函数不会用,请教下该如何使用

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

最后于 2019-12-24 11:37 被TopC编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
2
调用SSSDT函数需要在GUI线程环境
2019-12-24 11:41
0
雪    币: 6977
活跃值: (1786)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
刘铠文 调用SSSDT函数需要在GUI线程环境
sssdt和gui无关 只要不是session为none的都可以调用
2019-12-24 12:14
0
雪    币: 6977
活跃值: (1786)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
刘铠文 调用SSSDT函数需要在GUI线程环境
我看了下这个函数确实需要运行在gui线程环境下,函数内部没有校验,默认就是gui环境。请问怎么在gui线程环境下运行
2019-12-24 16:57
0
雪    币: 6
活跃值: (3290)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
TopC 我看了下这个函数确实需要运行在gui线程环境下,函数内部没有校验,默认就是gui环境。请问怎么在gui线程环境下运行
切换到explorer进程试下。 csrss有多个,要切换到登陆用户的session那个csrss才行
2019-12-24 20:09
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
6
TopC 我看了下这个函数确实需要运行在gui线程环境下,函数内部没有校验,默认就是gui环境。请问怎么在gui线程环境下运行
比较正常的就是IRP派遣函数里,用GUI线程通信,但是很多函数只需要修改ETHREAD就可以调用,具体实现的代码可以去抄老v的内核gdi绘制代码,看雪有。
2019-12-25 01:18
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
7
具体函数是导出的,PsSetThreadWin32Thread
2019-12-25 01:21
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
ebudsbiwbdudg
2019-12-25 12:13
0
游客
登录 | 注册 方可回帖
返回
//