- 注册时间
- 2011-3-10
- 最后登录
- 1970-1-1
该用户从未签到
|
NtOpenProcess 这两个函数在WIN7下是CALL的 PS开头的
NtOpneThread 进入CALL内部可发现 PsOpenProcess 和 PsOpenthread 里面被HOOK
被HOOK的前几行都有检测,修改直接蓝屏,建议从前面第5行就JMP
NtReadVirtualMemory 这两个函数主要是还原的时候push的第二个参数不知道从何得来
NtWriteVirtualMemory 希望大牛们帮忙!网上看说是要解析PE文件,不明白如何解析。。
KeAttachProcess 这个函数不在SSDT表中,用工具看不到,不知道哪里被修改,希望能告知如何查看该函数被修改。。
之后Debug Port清0问题,也不知道从哪里可以看到被清0,从何下手。。(不是上网看,根本还不知道有这条)
还有二个地方被修改为
KDCOM.dll:KdReceivePacket
KDCOM.dll:KdSendPacket 这两个地方如何改回来,现在还没有头绪,希望大牛们帮忙
#pragma code_seg("PAGE")
_declspec(naked) void My_NtWriteVirtualMemory()
{
_asm
{
push 18h
push 0x83ca9ae0
jmp Real_NtWriteVirtualMemory_7
}
}
我这里用的是绝对地址,但是每次重起后这个地址会变。
想请问下大牛们,NtWriteVirtualMemory 被HOOK后,第二个push的参数是怎么得来的。
#pragma code_seg("PAGE")
VOID TPHOOK()
{
//DWORD PNtOpenProcess,PNtOpenThread,PObOpenObjectByPointer;
UNICODE_STRING US_NtOpenProcess,US_NtOpenThread,US_ObOpenObjectByPointer;
RtlInitUnicodeString(&US_NtOpenProcess,L"NtOpenProcess");
RtlInitUnicodeString(&US_NtOpenThread,L"NtOpenThread");
RtlInitUnicodeString(&US_ObOpenObjectByPointer,L"ObOpenObjectByPointer");
PNtOpenProcess=(DWORD)MmGetSystemRoutineAddress(&US_NtOpenProcess);
PNtOpenThread=(DWORD)MmGetSystemRoutineAddress(&US_NtOpenThread);
PObOpenObjectByPointer=(DWORD)MmGetSystemRoutineAddress(&US_ObOpenObjectByPointer);
DbgPrint("NtOpenProcess源地址:%x\nNtOpenThread源地址:%x\nObOpenObjectByPointer源地址:%x\n"
,PNtOpenProcess,PNtOpenThread,PObOpenObjectByPointer);
DbgPrint("============计算NtOpenProcess开始=============\n");
DWORD NtOpenProcess_py=*((DWORD*)(PNtOpenProcess+0x28+1));
//计算NtOpenProcess Hook 地址
_asm
{
mov ebx,PNtOpenProcess
add ebx,0x28 //ebx=PPsOpenProcess=PNtOpenProcess+0x28;
add ebx,NtOpenProcess_py //+跳
add ebx,0x5
add ebx,0x21e
mov PPsOpenProcess_21E,ebx
}
DbgPrint("NtOpenProcess_py为:%x\nPPsOpenProcess_21e为:%x\n",NtOpenProcess_py,PPsOpenProcess_21E);
DbgPrint("============计算NtOpenProcess结束=============\n");
DbgPrint("============计算NtOpenThread开始=============\n");
DWORD NtOpenThread_py=*((DWORD*)(PNtOpenThread+0x27+1));
//计算NtOpenProcess Hook 地址
_asm
{
mov ebx,PNtOpenThread
add ebx,0x27 //ebx=PPsOpenProcess=PNtOpenProcess+0x28;
add ebx,NtOpenThread_py //+跳
add ebx,0x5
add ebx,0x209
mov PPsOpenThread_209,ebx
}
DbgPrint("NtOpenThread_py为:%x\nPPsOpenThread_209为:%x\n",NtOpenThread_py,PPsOpenThread_209);
DbgPrint("============计算NtOpenThread结束=============\n");
_asm
{
//去掉页面保护
cli
mov eax,cr0
and eax,not 10000h //and eax,0FFFEFFFFh
mov cr0,eax
}
_asm
{
//恢复NtOpenProcess
mov ebx,PPsOpenProcess_21E
mov al,0xe9
mov byte ptr [ebx+0],al
lea eax,My_NtOpenProcess
sub eax,PPsOpenProcess_21E
sub eax,5
mov [ebx+1],eax
/*//恢复NtOpenThread
mov ebx,PPsOpenThread_209
mov al,0xe9
mov byte ptr [ebx+0],al
lea eax,My_NtOpenThread
sub eax,PPsOpenThread_209
sub eax,5
mov [ebx+1],eax*/
}
//恢复SSDT NtReadVirtualMemory NtWriteVirtualMemory
_asm
{
//获取SSDT表地址
mov eax,KeServiceDescriptorTable
mov eax,[eax]
mov ssdtaddr,eax
//恢复NtReadVirtualMemory
/*mov eax,ssdtaddr
add eax,0x115*4
lea ebx,My_NtReadVirtualMemory
mov ecx,[eax]
add ecx,7
mov Real_NtReadVirtualMemory_7,ecx
mov [eax],ebx
//恢复NtWriteVirtualMemory
mov eax,ssdtaddr
add eax,0x18F*4
lea ebx,My_NtWriteVirtualMemory
mov ecx,[eax]
add ecx,7
mov Real_NtWriteVirtualMemory_7,ecx
mov [eax],ebx*/
}
_asm //恢复页保护
{
mov eax,cr0
or eax,10000h //or eax,not 0FFFEFFFFh
mov cr0,eax
sti
}
DbgPrint("ssdtaddr为:%x\n",ssdtaddr);
DbgPrint("============计算NtReadVirtualMemory结束=============\n");
} |
|