-
-
[求助]IDT HOOK 问题,请大家帮忙。
-
发表于:
2013-2-27 00:07
5429
-
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 !"));
}
}
[课程]Linux pwn 探索篇!