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

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

2019-12-24 11:36
3015
通过自己分析和查找资料发现可以使用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,之后造成内存访问出错蓝屏

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

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

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