欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]游戏保护那些事儿~~过滤函数里,tp爆非法模块的解决方法

[原创]游戏保护那些事儿~~过滤函数里,tp爆非法模块的解决方法

在前面AD一下:www.AntiGameProtect.com 反游戏保护技术研究
在hookport过滤函数中,一不小心就种了tp的圈套~~下面是处理方法:
NTSTATUS __stdcall NewNtOpenProcess(
        OUT PHANDLE             ProcessHandle,
        IN ACCESS_MASK          AccessMask,
        IN PVOID                           ObjectAttributes,
        IN PCLIENT_ID           ClientId
        )
{
        PEPROCESS EProcess;
        NTSTATUS status;
        ZWOPENPROCESS OldZwOpenProcess;
        ULONG ulPage;
        __asm{
                push eax
                mov eax,[ebp+4]
                mov ulPage,eax
                pop eax
        }
        //如果是自己的驱动调用,则返回哦
        if (ulPage >= ulMyDriverBase && ulPage <= ulMyDriverBase+ulMyDriverSize)
        {
                goto _FunctionRet;
        }
        if (KeGetCurrentIrql() != PASSIVE_LEVEL)
        {
                goto _FunctionRet;
        }
        //如果退出了
        if (!bIsInitSuccess)
                goto _FunctionRet;
        //是否要保护
        if (!bProtectProcess)
                goto _FunctionRet;
        //过滤掉桌面进程以及csrss进程
        if (_stricmp(PsGetProcessImageFileName(RPsGetCurrentProcess()),"explorer.exe") == 0 ||
                RPsGetCurrentProcess() == CsrssEProcess)
        {
                goto _FunctionRet;
        }
        if (MmIsAddressValidEx(ClientId))
        {
                if (IsFromDebugProcessId(ClientId->UniqueProcess))
                {
                        //乾坤大挪移
                        ClientId->UniqueProcess = PsGetCurrentProcessId();
                        if (DebugOn)
                                KdPrint(("open OD process by %s\n",PsGetProcessImageFileName(RPsGetCurrentProcess())));
                }
                //如果调用者不是csrss,那么所有来自任何进程打开csrss的操作,都XXXX
                if (PsGetCurrentProcessId() != CsrssID)
                {
                        if (ClientId->UniqueProcess == CsrssID)
                        {
                                //乾坤大挪移
                                ClientId->UniqueProcess = PsGetCurrentProcessId();
                                if (DebugOn)
                                        KdPrint(("open csrss process by %s\n",PsGetProcessImageFileName(RPsGetCurrentProcess())));
                        }
                }
        }
_FunctionRet:
        //tp的菊花痒了,非得用原始KeServiceDescriptorTable里面的函数,经过tp的钩子,才不报非法模块
        OldZwOpenProcess = KeServiceDescriptorTable->ServiceTable[ZwOpenProcessIndex];
        //让OD能XXXXXX
        if (IsFromDebugProcess(RPsGetCurrentProcess()))
        {
                OldZwOpenProcess = OriginalServiceDescriptorTable->ServiceTable[ZwOpenProcessIndex];
        }
        return OldZwOpenProcess(
                ProcessHandle,
                AccessMask,
                ObjectAttributes,
                ClientId
                );
}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功