• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開(kāi)心的工作
            簡(jiǎn)單、開(kāi)放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            突破游戲驅(qū)動(dòng)級(jí)反外掛保護(hù)2009-01-25 14:01現(xiàn)在大多數(shù)網(wǎng)絡(luò)游戲都使用驅(qū)動(dòng)級(jí)的反外掛保護(hù),使其他程序無(wú)法獲得其游戲窗口句柄,下面驅(qū)動(dòng)代碼可以恢復(fù)被TesSafe.sys Hook掉的API。

            #include <ntddk.h>
            #include <windef.h>
            #include <ntimage.h>
            #include "Common.h"

            typedef struct _KAPC_STATE
            {
            LIST_ENTRY ApcListHead[2];
            PVOID Process;
            BOOLEAN KernelApcInProgress;
            BOOLEAN KernelApcPending;
            BOOLEAN UserApcPending;
            } KAPC_STATE, *PKAPC_STATE;

            ULONG g_nOpenIndex?????? = 0;
            ULONG g_nThreadIndex????? = 0;
            ULONG g_nReadIndex?????? = 0;
            ULONG g_nWriteIndex?????? = 0;

            ULONG g_NtOpenProcess????? = 0;
            ULONG g_NtOpenThread????? = 0;
            ULONG g_NtReadVirtualMemory???? = 0;
            ULONG g_NtWriteVirtualMemory??? = 0;
            ULONG g_KiAttachProcess????? = 0;
            ULONG g_PsCreateSystemThread??? = 0;

            ULONG g_PsCreateSystemThreadAddr?? = 0;

            BYTE g_NtOpenProcessSave[0x300];
            BYTE g_NtOpenThreadSave[0x300];
            BYTE g_NtReadVirtualMemorySave[0x10];
            BYTE g_NtWriteVirtualMemorySave[0x10];
            BYTE g_KiAttachProcessSave[0x10];

            INLINEHOOK g_hPsCreateSystemThread;

            VOID NTAPI MyThread(PVOID pContext)
            {


            __asm
            {
            ?? push eax
            ?? cli
            ?? mov?? eax, cr0
            ?? and?? eax, not 0x10000
            ?? mov?? cr0, eax
            ?? pop?? eax
            }

            if (g_NtOpenProcess)
            {
            ?? memcpy((PVOID)g_NtOpenProcess, (PVOID)g_NtOpenProcessSave, sizeof(g_NtOpenProcessSave));
            // DbgPrint("恢復(fù)NtOpenProcess成功");
            }

            if (g_NtOpenThread)
            {
            ?? memcpy((PVOID)g_NtOpenThread, (PVOID)g_NtOpenThreadSave, sizeof(g_NtOpenThreadSave));
            // DbgPrint("恢復(fù)NtOpenThread成功");
            }

            if (g_NtReadVirtualMemory)
            {
            ?? memcpy((PVOID)g_NtReadVirtualMemory, (PVOID)g_NtReadVirtualMemorySave, sizeof(g_NtReadVirtualMemorySave));
            // DbgPrint("恢復(fù)NtReadVirtualMemory成功");
            }

            if (g_NtWriteVirtualMemory)
            {
            ?? memcpy((PVOID)g_NtWriteVirtualMemory, (PVOID)g_NtWriteVirtualMemorySave, sizeof(g_NtWriteVirtualMemorySave));
            // DbgPrint("恢復(fù)NtWriteVirtualMemory成功");
            }

            if (g_KiAttachProcess)
            {
            ?? memcpy((PVOID)g_KiAttachProcess, (PVOID)g_KiAttachProcessSave, sizeof(g_KiAttachProcessSave));
            // DbgPrint("恢復(fù)KiAttachProcess成功");
            }

            __asm
            {
            ?? push eax
            ?? mov?? eax, cr0
            ?? or?? eax, 0x10000
            ?? mov?? cr0, eax
            ?? sti
            ?? pop?? eax
            }
            DbgPrint("恢復(fù)成功");
            PsTerminateSystemThread(STATUS_SUCCESS);
            }

            __declspec(naked) NTSTATUS MyPsCreateSystemThread_(PHANDLE ThreadHandle,ULONG DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,HANDLE ProcessHandle,PCLIENT_ID ClientId,PKSTART_ROUTINE StartRoutine,PVOID StartContext)
            {
            __asm
            {
            ?? jmp?? dword ptr [g_PsCreateSystemThreadAddr]
            }
            }

            NTSTATUS MyPsCreateSystemThread(PHANDLE ThreadHandle,ULONG DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,HANDLE ProcessHandle,PCLIENT_ID ClientId,PKSTART_ROUTINE StartRoutine,PVOID StartContext)
            {
            PDWORD Addr = (PDWORD)StartRoutine;
            HANDLE hThread = NULL;
            if ( (*Addr == 0x81EC8B55 && *(Addr + 1) == 0x94EC) || (*Addr == 0x0149F6E9 && *(Addr + 1) == 0xB2120100) || (*Addr == 0x01F1DFE9 && *(Addr + 1) == 0x13A5F300) || (*Addr == 0x02120FE9 && *(Addr + 1) == 0x6E800) )
            {
            ?? DbgPrint("創(chuàng)建內(nèi)核線程:%X\n",StartRoutine);
            // MyPsCreateSystemThread_(&hThread, (ACCESS_MASK)0, NULL,(HANDLE)0, NULL, MyThread, NULL);
            // ZwClose(hThread);
            ?? StartRoutine = MyThread;
            }
            return MyPsCreateSystemThread_(ThreadHandle, DesiredAccess, ObjectAttributes, ProcessHandle, ClientId, StartRoutine, StartContext);
            }

            ULONG GetKiAttachProcessAddr()
            {
            ULONG DisassemblerLen = 0, Size = 0;
            PBYTE FunctionAddr = (PBYTE)GetFunctionAddr(L"KeStackAttachProcess");
            do
            {
            ?? DisassemblerLen = GetOpCodeSize(FunctionAddr);
            ?? FunctionAddr = FunctionAddr + DisassemblerLen;
            ?? Size = Size + DisassemblerLen;
            ?? if (Size > 0x100 || *(PWORD)FunctionAddr == 0x8C2)
            ?? {
            ??? return 0;
            ?? }
            } while ( *FunctionAddr != 0xE8 );

            return (LONG)FunctionAddr + *(PLONG)(FunctionAddr + 1) + 5;
            }

            VOID Hook()
            {
            g_nOpenIndex????? = GetFunctionIndex("NtOpenProcess");
            g_nThreadIndex????? = GetFunctionIndex("NtOpenThread");
            g_nReadIndex????? = GetFunctionIndex("NtReadVirtualMemory");
            g_nWriteIndex????? = GetFunctionIndex("NtWriteVirtualMemory");

            g_NtOpenProcess????? = KeServiceDescriptorTable->ServiceTableBase[g_nOpenIndex];
            g_NtOpenThread????? = KeServiceDescriptorTable->ServiceTableBase[g_nThreadIndex];
            g_NtReadVirtualMemory??? = KeServiceDescriptorTable->ServiceTableBase[g_nReadIndex];
            g_NtWriteVirtualMemory??? = KeServiceDescriptorTable->ServiceTableBase[g_nWriteIndex];
            g_KiAttachProcess???? = GetKiAttachProcessAddr();


            g_PsCreateSystemThread??? = GetFunctionAddr(L"PsCreateSystemThread");

            if (g_NtOpenProcess)
            {
            ?? memcpy((PVOID)g_NtOpenProcessSave, (PVOID)g_NtOpenProcess, sizeof(g_NtOpenProcessSave));
            ?? DbgPrint("NtOpenProcess 地址:%08X", g_NtOpenProcess);
            }
            else
            {
            ?? DbgPrint("獲取NtOpenProcess地址失敗");
            }

            if (g_NtOpenThread)
            {
            ?? memcpy((PVOID)g_NtOpenThreadSave, (PVOID)g_NtOpenThread, sizeof(g_NtOpenThreadSave));
            ?? DbgPrint("NtOpenThread 地址:%08X", g_NtOpenThread);
            }
            else
            {
            ?? DbgPrint("獲取NtOpenThread地址失敗");
            }

            if (g_NtReadVirtualMemory)
            {
            ?? memcpy((PVOID)g_NtReadVirtualMemorySave, (PVOID)g_NtReadVirtualMemory, sizeof(g_NtReadVirtualMemorySave));
            ?? DbgPrint("NtReadVirtualMemory 地址:%08X", g_NtReadVirtualMemory);
            }
            else
            {
            ?? DbgPrint("獲取NtReadVirtualMemory地址失敗");
            }

            if (g_NtWriteVirtualMemory)
            {
            ?? memcpy((PVOID)g_NtWriteVirtualMemorySave, (PVOID)g_NtWriteVirtualMemory, sizeof(g_NtWriteVirtualMemorySave));
            ?? DbgPrint("NtWriteVirtualMemory 地址:%08X", g_NtWriteVirtualMemory);
            }
            else
            {
            ?? DbgPrint("獲取NtWriteVirtualMemory地址失敗");
            }


            if (g_KiAttachProcess)
            {
            ?? memcpy((PVOID)g_KiAttachProcessSave, (PVOID)g_KiAttachProcess, sizeof(g_KiAttachProcessSave));
            ?? DbgPrint("KiAttachProcess 地址:%08X", g_KiAttachProcess);
            }
            else
            {
            ?? DbgPrint("獲取KiAttachProcess地址失敗");
            }

            HookFunction(g_PsCreateSystemThread, (ULONG)MyPsCreateSystemThread, &g_hPsCreateSystemThread, &g_PsCreateSystemThreadAddr);
            }

            VOID UnHook()
            {
            UnHookFunction(&g_hPsCreateSystemThread);
            }
            void OnUnload(PDRIVER_OBJECT pDriverObj)
            {
            UnHook();
            DbgPrint("卸載成功");
            }

            // 驅(qū)動(dòng)程序加載時(shí)調(diào)用DriverEntry例程
            NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
            {
            pDriverObj->DriverUnload = OnUnload;
            DbgPrint("加載成功");
            Hook();
            return STATUS_SUCCESS;
            }
            ?

            久久精品毛片免费观看| 国产2021久久精品| 99精品久久精品一区二区| 亚洲va国产va天堂va久久| 久久精品国产一区| 国产精品久久久久久久久久影院| 久久中文字幕视频、最近更新| 久久久久久伊人高潮影院| 99久久99久久精品免费看蜜桃| 精品综合久久久久久88小说| 久久久SS麻豆欧美国产日韩| 久久九九全国免费| 色综合久久无码五十路人妻| 99热热久久这里只有精品68| 精品伊人久久大线蕉色首页| 国产精品热久久无码av| 亚洲欧美伊人久久综合一区二区 | 亚洲欧洲久久久精品| 亚洲午夜久久久久久久久电影网| 国产—久久香蕉国产线看观看| 国内精品久久久久影院老司| 国产99久久九九精品无码| 久久亚洲国产成人精品性色| 亚洲欧美国产精品专区久久| 久久综合九色综合精品| 久久青青草原亚洲av无码app| 亚洲美日韩Av中文字幕无码久久久妻妇| 久久国产成人精品麻豆| 久久丫精品国产亚洲av| 久久精品国产2020| 中文字幕久久波多野结衣av| 一本一道久久a久久精品综合| 国产精品美女久久久久av爽| 久久久久综合网久久| 久久精品国产秦先生| 国产精品美女久久久久| 久久午夜羞羞影院免费观看 | 久久成人影院精品777| 狠狠88综合久久久久综合网| 狼狼综合久久久久综合网| 久久人爽人人爽人人片AV|