能力值:
( LV2,RANK:10 )
|
-
-
2 楼
没有大牛 来看看吗? 在线等
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
错在哪里?Code呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
//SwapContext 关键代码
void CheckFuncEx(PETHREAD pTargetThead)
{
//ULONG uDealProcessor;
IDTRINFO IdtInfo = {0};
ULONG uTempBase;
PEPROCESS pTargetEProcess = (PEPROCESS)*(PULONG)((ULONG)pTargetThead + 0x44);
PUCHAR pszTargetName = PsGetProcessImageFileName(pTargetEProcess);
__asm sidt IdtInfo;
uTempBase = MAKELONG(IdtInfo.lowBase,IdtInfo.highBase);
if ( _stricmp((const char *)pszTargetName,"game.exe") == 0 )
{
WirteHookFunc((PVOID)uTempBase);
}
else
{
WirteOriginalFunc((PVOID)uTempBase);
}
__asm lidt IdtInfo;
}
__declspec(naked)
void __stdcall HookFunc_SwapContext()
{
__asm
{
pushfd;
pushad;
push esi;
call CheckFuncEx;
popad;
popfd;
mov dword ptr ds:[ebx+18h], eax;
sti;
mov eax,dword ptr ds:[edi+44h];
jmp dword ptr ds:HookAddr_SwapContext_ret;
}
}
//FastCallEntry 关键代码
//函数返回需要替换的地址;
//参数1:函数索引;
//参数2:函数地址;
//参数3:表Base;
ULONG MyDisposeFunc(ULONG uIndex,ULONG uFuncAddr,ULONG uServiceTableBase)
{
ULONG uNewFuncAddr;
PUCHAR szName;
szName = PsGetProcessImageFileName(IoGetCurrentProcess());
uNewFuncAddr = uFuncAddr;
if ( _stricmp((const char *)szName,"game.exe") == 0 )
{
return uNewFuncAddr;
}
if ( uServiceTableBase == *(PULONG)KeServiceDescriptorTable )
{
switch ( uIndex )
{
case 0x21: // NtCreateDebugObject
uNewFuncAddr = (ULONG)My_NtCreateDebugObject;
break;
case 0x39: // NtDebugActiveProcess
uNewFuncAddr = (ULONG)My_NtDebugActiveProcess;
break;
case 0x3A: // NtDebugContinue
uNewFuncAddr = (ULONG)My_NtDebugContinue;
break;
case 0x10D: // NtWaitForDebugEvent
uNewFuncAddr = (ULONG)My_NtWaitForDebugEvent;
break;
case 0x7A: // NtOpenProcess
uNewFuncAddr = Original_NtOpenProcessAddr;
break;
case 0xBA: // NtReadVirtualMemory
uNewFuncAddr = Original_NtReadVirtualMemroyAddr;
break;
case 0x115: // NtWriteVirtualMemory
uNewFuncAddr = Original_NtWriteVirtualMemoryAddr;
break;
default:
uNewFuncAddr = uFuncAddr;
}
}
return uNewFuncAddr;
}
__declspec(naked)
void __stdcall HookFunc_KiFastCallEntry()
{
__asm
{
pushad;
pushfd;
push edi;
push ebx;
push eax;
call MyDisposeFunc
mov dword ptr ds:[esp + 0x14],eax;
popfd;
popad;
sub esp, ecx;
shr ecx, 2 ;
jmp dword ptr ds:HookAddr_KiFastCallEntry_ret;
}
}
|
能力值:
( LV5,RANK:70 )
|
-
-
5 楼
...HOOK SwapContext 本身就是很危险的事情 WirteHookFunc是什么东东?
然后请上DUMP
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
就是写入IDT数据咯。
还是那个原因,DPC可以在任意线程中断。
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
当DPC中断到任意一个进程,比如OD线程,此时DPC读取出来的IDT你觉得会是什么呢。
IoContectIntrrupt 绑定ISR到DISPATCH_LEVEL可以实现一样的效果。
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
语法不够严谨,代码也有点问题
__declspec(naked)和__stdcall不应该同时出现在函数名前面,应该使用__stdcall的函数也没有使用
SwapContext的关键代码中没有处理多核
想必WirteHookFunc((PVOID)uTempBase)和WirteOriginalFunc((PVOID)uTempBase)都已经处理了IDT,还__asm lidt IdtInfo干嘛?
还有就是,__asm sidt IdtInfo和__asm lidt IdtInfo频繁切换,也就更无法保证稳定性
|
能力值:
( LV3,RANK:20 )
|
-
-
9 楼
lidt有问题哦。
|
能力值:
( LV3,RANK:20 )
|
-
-
10 楼
据说只有启动的时候用才没问题。不过还是推荐用lidt吧。
原子化。NMI中断也在这条指令执行完被触发,免得写一半就崩了。
|
|
|