首页
社区
课程
招聘
[求助]在内核里调用想获取某应用层线程rip是不是必须用PsGetContextThread
发表于: 2017-8-8 14:13 5423

[求助]在内核里调用想获取某应用层线程rip是不是必须用PsGetContextThread

2017-8-8 14:13
5423

在内核里调用想获取某应用层线程rip是不是必须用PsGetContextThread

当我用Nt/ZwGetContextThread时候,因为第二参数是BUF指针地址是自己定义的,在KERNEL里(大于0x800000000)

所以一直0xc000000005


是不是在内核调用,就只能用PsGetContextThread, 并且指定第三参数为0(kernelmode)?


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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 209
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
发现PsGetContextThread也是c00000005
2017-8-8 14:35
0
雪    币: 209
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
		PETHREAD peth;
		NTSTATUS nts1 = PsLookupThreadByThreadId(PsGetCurrentThreadId(), &peth);
		typedef NTSTATUS(*PSGETCONTEXTTHREAD)(PETHREAD Thread, PCONTEXT Context, KPROCESSOR_MODE AccessMode);
		PSGETCONTEXTTHREAD psgetcontextthread = (PSGETCONTEXTTHREAD)GetFunctionAddr(L"PsGetContextThread");
		CONTEXT context_1;
		RtlZeroMemory(&context_1, sizeof(CONTEXT));
		NTSTATUS nts2 = psgetcontextthread(peth, &context_1, KernelMode);
		NTSTATUS nts3 = psgetcontextthread(peth, &context_1, UserMode);
		DbgPrint("%llx %llx %llx, %llx", nts1, nts2, nts3, context_1.Rip);

在驱动自定义的IOCTRL里执行这代码。

打印结果为

0 c000000d c0000005, 0


不管是kernelmode还是usermode都失败。

2017-8-8 16:03
0
雪    币: 209
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
请问X64在内核中到底调用哪个函数去获取用户线程的寄存器信息
2017-8-8 16:55
0
雪    币: 209
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
This  function  returns  the  usermode  context  of  the  specified  thread.  This
        function  will  fail  if  the  specified  thread  is  a  system  thread.  It  will
        return  the  wrong  answer  if  the  thread  is  a  non-system  thread  that  does
        not  execute  in  user-mode.
2017-8-8 21:10
0
雪    币: 201
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我用这个函数也是这个错误码,0xc000000005 STATUS_ACCESS_VIOLATION 也不知道为什么
2021-2-24 11:35
0
雪    币: 5734
活跃值: (1737)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
context 这个缓冲区必须在r3 地址。
2021-2-25 01:42
0
游客
登录 | 注册 方可回帖
返回
//