• <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;
            }
            ?

            亚洲午夜无码久久久久| 无码人妻少妇久久中文字幕 | 国内精品伊人久久久久影院对白 | 亚洲?V乱码久久精品蜜桃| 久久久久噜噜噜亚洲熟女综合 | 一本久久综合亚洲鲁鲁五月天| 亚洲va中文字幕无码久久不卡| 久久最新精品国产| 久久九九精品99国产精品| 合区精品久久久中文字幕一区| 波多野结衣中文字幕久久| 国产精品欧美久久久天天影视| 久久精品国产亚洲av麻豆色欲 | 狠狠色丁香久久婷婷综合| 亚洲精品久久久www| 色天使久久综合网天天| 亚洲级αV无码毛片久久精品 | 91精品日韩人妻无码久久不卡 | 久久久久久久久久免免费精品 | 国产精品一久久香蕉产线看| 久久996热精品xxxx| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 精品久久久久久国产 | 亚洲欧美另类日本久久国产真实乱对白 | 久久亚洲日韩看片无码| 一本色道久久综合亚洲精品| 久久精品亚洲一区二区三区浴池 | 国产免费久久精品丫丫| 久久天天躁狠狠躁夜夜96流白浆| 国产精品9999久久久久| 久久久黄片| 精品久久久久久久| 九九精品久久久久久噜噜| 国产成人久久精品一区二区三区| 久久久不卡国产精品一区二区| 亚洲综合精品香蕉久久网| 国产精品久久久久无码av| 久久精品无码免费不卡| 国产L精品国产亚洲区久久| 久久精品无码午夜福利理论片| 久久笫一福利免费导航 |