首页
社区
课程
招聘
[求助]ssdt hook NtGetContextThread/NtSetContextThread 在打开OD附件任何程序就蓝屏
发表于: 2011-2-24 05:35 8748

[求助]ssdt hook NtGetContextThread/NtSetContextThread 在打开OD附件任何程序就蓝屏

2011-2-24 05:35
8748
#define DNF_EXE "DNF.exe" //DNF进程名 
ULONG uNtSetContextThreadAddress;
ULONG uNtGetContextThreadAddress;
ULONG TenNtSetContextThread,TenNtGetContextThread;

//////////////////////////////////////////////////////////////////////
//  名称:  _MyNtGetThreadContext
//  功能:  两个SSDT HOOK伪造函数的中继函数
//  参数:  
//  返回:  
//////////////////////////////////////////////////////////////////////


NTSTATUS _declspec(naked)  Nakd_NtGetThreadContext(HANDLE hThread,PCONTEXT pContext)
{
	__asm
	{
		jmp dword ptr [TenNtGetContextThread]
	}

}

NTSTATUS _declspec(naked) Nakd_NtSetThreadContext(HANDLE hThread,PCONTEXT pContext)
{
	__asm
	{
		jmp dword ptr [TenNtSetContextThread]
	}

}

//////////////////////////////////////////////////////////////////////
//  名称:  MyNtGetThreadContext && MyNtSetThreadContext
//  功能:  NtGetThreadContext与NtSetThreadContext函数被SSDT HOOK的伪造函数
//  参数:  
//  返回:  
//////////////////////////////////////////////////////////////////////
//UCHAR* PsGetProcessImageFileName( IN PEPROCESS Process ); 

extern "C" UCHAR * PsGetProcessImageFileName(__in PEPROCESS Process);



NTSTATUS MyNtGetThreadContext(HANDLE hThread , PCONTEXT pContext)
{
	
	if (_stricmp((const char*)PsGetProcessImageFileName(PsGetCurrentProcess()),DNF_EXE))
	{
		KdPrint(("------------------%S",PsGetProcessImageFileName(PsGetCurrentProcess())));
		return Nakd_NtGetThreadContext(hThread,pContext);
	}
	return STATUS_SUCCESS;
}


NTSTATUS MyNtSetThreadContext(HANDLE hThread, PCONTEXT pContext)
{
	if (_stricmp((const char*)PsGetProcessImageFileName(PsGetCurrentProcess()),DNF_EXE))
	{
		return Nakd_NtSetThreadContext(hThread,pContext);
	}

	return STATUS_SUCCESS;
}

//////////////////////////////////////////////////////////////////////
//  名称:  My_Recovery_HardwareBreakpoint
//  功能:  通过对set与get进行SSDT HOOK来恢复硬件断点
//  参数:  
//  返回:  
//////////////////////////////////////////////////////////////////////
NTSTATUS My_Recovery_HardwareBreakpoint()
{
	KIRQL Irql;
	uNtGetContextThreadAddress=(ULONG)KeServiceDescriptorTable->ServiceTableBase+0xD5*4;
	uNtSetContextThreadAddress=(ULONG)KeServiceDescriptorTable->ServiceTableBase+0x55*4;

	TenNtGetContextThread=uNtGetContextThreadAddress;
	TenNtSetContextThread=uNtSetContextThreadAddress;

	KdPrint(("Set地址:%0X\n",TenNtSetContextThread));
	KdPrint(("Get地址:%0X\n",TenNtGetContextThread));

		WPOFF();
		Irql=KeRaiseIrqlToDpcLevel();
		*(ULONG*)uNtGetContextThreadAddress=(ULONG)MyNtGetThreadContext;
		*(ULONG*)uNtSetContextThreadAddress=(ULONG)MyNtSetThreadContext;
		KeLowerIrql(Irql);
		WPON();

return STATUS_SUCCESS;



加载完自己写的驱动以后,在打开OD附加任务的程序  都蓝屏

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

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
泪奔~~
2011-2-24 07:45
0
雪    币: 5
活跃值: (1131)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
TenNtGetContextThread=*(ULONG*)uNtGetContextThreadAddress;
TenNtSetContextThread=*(ULONG*)uNtSetContextThreadAddress;
2011-2-24 08:52
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
4
jmp dword ptr [TenNtGetContextThread] 你没查看下跳转地址对不
2011-2-24 14:21
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哎  我真马虎啊  谢谢了
2011-2-24 21:24
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=房有亮;929142]jmp dword ptr [TenNtGetContextThread] 你没查看下跳转地址对不[/QUOTE]

谢谢 就是这个地址的原因
2011-2-24 21:27
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
前几天有个帖子介绍过这个吧
2011-2-25 13:13
0
雪    币: 40
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
你那个应该返回不成功吧
2011-2-26 21:00
0
雪    币: 40
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
返回的理解错了  你这样等于 是 DNF 返回正确函数 不是DNF 就返回 没有调用成功
去看下
_stricmp
2011-2-26 21:01
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
为什么还要加个取值符号呢?
2011-3-1 09:21
0
游客
登录 | 注册 方可回帖
返回
//