首页
社区
课程
招聘
[求助]IDT HOOK 问题,请大家帮忙。
发表于: 2013-2-27 00:07 5430

[求助]IDT HOOK 问题,请大家帮忙。

2013-2-27 00:07
5430
1.在虚拟机里面跑,只要下断点调试就死机。不知道为什么。我只对相应的 进程ID进行保护。
经过分析,发现 是这句 pEprocess = PsGetCurrentProcess(); 意思是只要调用 PsGetCurrentProcess ,电脑就挂了。下面也用汇编写了下。还是不行。不知道哪里出问题了,还请过 大牛抽空帮忙看下。 小弟初学不久,还请勿喷。。

2.发现用虚拟机调试模式进入,然后HOOK Int 3 。发现 pEprocess = PsGetCurrentProcess(); 这一句这 会有个Int 3(0xCC)断点,不知道是否跟WinDbg调试有关? 用汇编 mov  eax,PsGetCurrentProcess; 也不行。 然后我不用调试模式进入系统  就不会出现这样的问题。

还请大家帮忙呀,在此谢过啦。

ps:如果发错版块,还请版主帮忙移动。谢谢。

#pragma PAGEDCODE
void _naked JmpIdtInt3()
{
	__asm
	{
		push 0x00;
		mov word ptr [esp+2],0;
		jmp  g_ulIdtInt3_9;
	}
}

#pragma PAGEDCODE 
void _naked NewIdtInt3() 
{
	__asm
	{
		pushad;
		pushfd;
	}
	
	/*
	PEPROCESS  pEprocess;
	pEprocess = PsGetCurrentProcess();
	
	//KdPrint(("Current Process Name  --:%s--   \n",(PTSTR)((ULONG)pEprocess+0x174)));
	if ( g_hPid != (HANDLE)-1/ * && *(HANDLE *)((ULONG)pEprocess+0x84) == g_hPid* /)
	{
		__asm
		{
			popfd;
			popad;
		}
		__asm iretd;
	}
	*/

	/*
	__asm
	{
		mov  eax,PsGetCurrentProcess
		call eax;
		mov  eax,[eax+0x84];
		cmp  eax,g_hPid;
		jne  __label; 
		
		popfd;
		popad;

		iretd;
__label:
	}
	*/
	__asm
	{
		popfd;	
		popad;
	}
	__asm jmp JmpIdtInt3;
}


//安装Hook的函数
#pragma PAGEDCODE
void HookIdtInt3()
{
	KdPrint(("->HookIDTInt3 !"));
	ULONG ulIdtInt3 = (ULONG)ReadIdtAddress(3);
	if (ulIdtInt3 == 0)
		return;
	g_ulIdtInt3_9 = ulIdtInt3 + 0x9;

	REMOVE_PROTECT

	__try
	{
		RtlCopyMemory(&JmpIdtInt3,(PVOID)ulIdtInt3,0x9);
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		KdPrint(("->RtlCopyMemory Failed !"));
	}
	
	__try
	{
		((PJmpCode)ulIdtInt3)->bE9 = 0xE9;
		((PJmpCode)ulIdtInt3)->ulAddress = (ULONG)(&NewIdtInt3)-ulIdtInt3-0x5;
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		KdPrint(("->Write Jmp !"));
	}
	RECOVER_PROTECT
}

#pragma PAGEDCODE
void UnHookIdtInt3()
{
	KdPrint(("->UnHookIDTInt3 !"));
	ULONG ulIdtInt3 = (ULONG)ReadIdtAddress(3);
	if (ulIdtInt3 == 0)
		return;
	
	REMOVE_PROTECT
	__try
	{
		RtlCopyMemory((PVOID)ulIdtInt3,&JmpIdtInt3,0x9);
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		KdPrint(("->RtlCopyMemory Failed !"));
	}
}

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
1. 调试器的断点就是靠的int 3,你把它Hook了,还怎么调试啊。另外别指望通过当前进程判断能完美解决问题,因为内核中某些设施运行的上下文是任意的,可能正好就在你保护的进程上下文中运行(实际上和你的进程没关系)。更重要的是,就算你不Hook它,int 3是调试系统的一部分,这部分代码本质上是不可调试的。除非你的调试机制不依赖于它。

2.为什么要paged code?此时一定低于DISPATCH_LEVEL么?
2013-2-27 08:10
0
雪    币: 18
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢楼上的回复
2013-2-27 09:42
0
雪    币: 18
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你好,很高兴你能回答我的问题。

我的想法是这样:通过HOOK  int 3 中断表中的处理函数 来实现某些指定PID的程序无法中断。

也就是 当某个程序触发int 3 中断 程序则会转到 系统的int 3处理函数执行,我通过在这个处理函数上设置个跳转,判断是否为我关心的进程ID,如果是则调试终止。如果不是则直接跳到原来的处理函数执行。

不知道我表述的是否清楚。

现在的问题主要就是 调用到PsGetCurrentProcess这个函数后就直接卡死。为此我单独测试的这个函数。 之前记得 有人这么用是可以的。不知道为什么我这不行。

对于 您说的 “为什么要paged code?此时一定低于DISPATCH_LEVEL么?” 这个疑问,其实我 就行节约内存资源,也没想那么多,直接在函数前面加上了这句。看来 以后要多注意了,谢谢提醒。
2013-2-27 09:44
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
别在任何int 3相关的函数里面下断点,包括你写的Hook和系统自己的KiTrap03,因为断点就是靠int 3的。触发断点后会再次执行int 3的处理函数,接着再次触发断点……无限递归了。就像之前说的,调试系统本身是不可调试的。除非你使用基于另一种机制的调试器。

再提示一点:User Mode的fs寄存器值和Kernel Mode的是不同的。

_KiTrap03 proc near

var_2= word ptr -2
arg_4= dword ptr  8

push    0
mov     [esp+4+var_2], 0
push    ebp
push    ebx
push    esi
push    edi
push    fs ; 保护原有的fs段寄存器值,如果PreviousMode是User,那么是3bh,如果是kernel,会是30h(XP SP3)
mov     ebx, 30h ; 设置为kernel mode的fs值
mov     fs, bx ; 为什么要这样?如果不设这个,会有什么后果

mov     ebx, large fs:0
push    ebx
下略

参考:
_PsGetCurrentProcess@0 proc near
mov     eax, large fs:124h
mov     eax, [eax+44h]
retn
_PsGetCurrentProcess@0 endp

另友情提醒,获取PID可以直接调用PsGetCurrentProcessId。
2013-2-27 14:20
0
雪    币: 18
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
多谢您的赐教。
我只是觉得有点奇怪,因为我之前看过人家这么写HOOK IDT int3 函数可以的。
我经过测试,就是到了PsGetCurrentProcess 这出问题的。

多谢你的提醒,其实 不是PsGetCurrentProcessId 的问题,我只是觉得奇怪。我还是再来调试看看。。
2013-2-27 20:47
0
游客
登录 | 注册 方可回帖
返回
//