首页
社区
课程
招聘
[求助]Hook SwapContext 和 Hook FastCallEntry的问题
发表于: 2013-5-7 20:20 6122

[求助]Hook SwapContext 和 Hook FastCallEntry的问题

2013-5-7 20:20
6122
在虚拟机 开4核 驱动正常加载 和 使用

在实体机 Hook SwapContest 或 Hook FastCallEntry 这2个HOOK 放开任意一个Hook 驱动正常加载 和 使用

如果2个hook都放开就直接蓝屏或重启  请问我这个是错在那里了...

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 34
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没有大牛 来看看吗? 在线等
2013-5-7 20:38
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
错在哪里?Code呢?
2013-5-7 20:51
0
雪    币: 34
活跃值: (14)
能力值: ( 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;
        }
}
2013-5-7 21:46
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
...HOOK SwapContext 本身就是很危险的事情  WirteHookFunc是什么东东?

然后请上DUMP
2013-5-7 22:23
0
雪    币: 19
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
就是写入IDT数据咯。
还是那个原因,DPC可以在任意线程中断。
2013-5-10 10:22
0
雪    币: 19
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
当DPC中断到任意一个进程,比如OD线程,此时DPC读取出来的IDT你觉得会是什么呢。
IoContectIntrrupt 绑定ISR到DISPATCH_LEVEL可以实现一样的效果。
2013-5-10 10:25
0
雪    币: 257
活跃值: (67)
能力值: ( 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频繁切换,也就更无法保证稳定性
2013-5-12 09:10
0
雪    币: 19
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
lidt有问题哦。
2013-5-12 09:32
0
雪    币: 19
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
据说只有启动的时候用才没问题。不过还是推荐用lidt吧。
原子化。NMI中断也在这条指令执行完被触发,免得写一半就崩了。
2013-5-12 09:34
0
游客
登录 | 注册 方可回帖
返回
//