mubing666 发表于 2019-11-29 17:06:38

关于鹅肠某射击游戏 无驱动读写的方法研究

最近在学习windows 内核 想仿照写一个某F的保护 于是查询了一些资料 发现某F是注册一个 回调函数来保护自己游戏不被附加 于仿照做了一个 效果就是图一所示

核心代码
OB_PREOP_CALLBACK_STATUS
ProcessProtect(
        PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION pOperationInformation
)
{
        ULONG pid = (ULONG)(PsGetProcessId((PEPROCESS)pOperationInformation->Object)); //返回回调进程的pid判断 如果是我们要保护的进程 那么进行操作 如果不是=== return
       
        UNREFERENCED_PARAMETER(RegistrationContext);

        ULONG PPid = 5652;
        KdPrint(("PPID:%d", PPid));

        if (pid == PPid && PPid != 0)
        {

                pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess = 0;


        }

        return OB_PREOP_SUCCESS;
}

那么怎么能干掉这层保护呢 这里我的思路有两个
             1. 思路就是 我们注册同样的 回调函数 给被ob保护的进程 只是我们这次的回调函数里面给我们特定进程满权限 那么他的保护不久被我们废了么

                      pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess = PROCESS_ALL_ACCESS;
               核心代码就这么一句话 效果就是 图二

             2.那么我们有没有其他思路呢 当然还是有的 他不是有回调么 我们直接在他的回调函数的入口处写一个 0xc3 问题不就解决了么 于是
VOID DisableObcalls(PVOID Address)
{
        KIRQL irql;
        CHAR PatchCode[] = "\x33\xC0\xC3";
        if (!Address)
                return;
        if (MmIsAddressValid(Address))
        {
                irql = WPOFFx64();
                memcpy(Address, PatchCode, 3);
                WPONx64(irql);
        }

}
VOID DownObcallBacks()
{
        PLIST_ENTRY pCurrentEntry = NULL;
        POB_CALLBACK pObCallback;
        ULONG64 ObProcessCallBackListHead = *(PULONG64)PsProcessType + 0xC8;
        ULONG64 ObThreadCallBacListkHead = *(PULONG64)PsProcessType + 0xC8;
        KdPrint(("ObThreadCallBackListHead:[%p]\n", ObThreadCallBacListkHead));
        pCurrentEntry = ((PLIST_ENTRY)ObThreadCallBacListkHead)->Flink;

        do {

                pObCallback = (POB_CALLBACK)pCurrentEntry;

                if (pObCallback->ObHandle != 0)
                {
                        DisableObcalls((PVOID)pObCallback->PostCall);
                        DisableObcalls((PVOID)pObCallback->PreCall);
                }

                pCurrentEntry = pCurrentEntry->Flink;

        } while (pCurrentEntry != (PLIST_ENTRY)ObThreadCallBacListkHead);

        KdPrint(("ObProcessCallBackListHead:[%p]\n", ObProcessCallBackListHead));

        pCurrentEntry = ((PLIST_ENTRY)ObProcessCallBackListHead)->Flink;

        do {

                pObCallback = (POB_CALLBACK)pCurrentEntry;

                if (pObCallback->ObHandle != 0)
                {
                        DisableObcalls((PVOID)pObCallback->PostCall);
                        DisableObcalls((PVOID)pObCallback->PreCall);
                }

                pCurrentEntry = pCurrentEntry->Flink;

        } while (pCurrentEntry != (PLIST_ENTRY)ObProcessCallBackListHead);
}

             核心代码如上 这样也能达到我们想要的标准 但是你以为这样就完了么 你会发现你打开某F进程确实可以了 但是几秒之后
             内存又读不到了 这是怎么回事呢 涉及到了句柄表 ,某F会遍历自己的句柄表 发现不是自己打开进程 那么同样会给权限降低
      这里怎么解决 经过几天研究已经差不多搞了出来 但是还待优化 有时间 再发一贴讲解


               同时欢迎各位大佬加群讨论 891652790






过路的人 发表于 2019-11-29 20:11:15

mubing666 发表于 2019-11-29 18:09
无 驱动读写 哥哥 你不够智能啊

你贴的代码都是内核代码,先不说这代码是不是你写的,你搞清楚什么是无驱读写没?{:tongue:}

mubing666 发表于 2019-11-29 18:09:34

过路的人 发表于 2019-11-29 17:42
笑死,你这代码是无驱动?

无 驱动读写 哥哥 你不够智能啊

mubing666 发表于 2019-11-29 17:57:50

所说驱动加载工具就是你家的驱动?真好

过路的人 发表于 2019-11-29 17:43:03

你把驱动代码拿出来讲无驱动

过路的人 发表于 2019-11-29 17:42:01

笑死,你这代码是无驱动?
页: [1]
查看完整版本: 关于鹅肠某射击游戏 无驱动读写的方法研究