这个是过TX游戏自我保护驱动的源代码。可以过qq堂、DNF、寻仙等QQ游戏。

#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("恢复NtOpenProcess成功");
        }

if (g_NtOpenThread)
        {
                memcpy((PVOID)g_NtOpenThread, (PVOID)g_NtOpenThreadSave, sizeof(g_NtOpenThreadSave));
        //        DbgPrint("恢复NtOpenThread成功");
        }

if (g_NtReadVirtualMemory)
        {
                memcpy((PVOID)g_NtReadVirtualMemory, (PVOID)g_NtReadVirtualMemorySave, sizeof(g_NtReadVirtualMemorySave));
        //        DbgPrint("恢复NtReadVirtualMemory成功");
        }

if (g_NtWriteVirtualMemory)
        {
                memcpy((PVOID)g_NtWriteVirtualMemory, (PVOID)g_NtWriteVirtualMemorySave, sizeof(g_NtWriteVirtualMemorySave));
        //        DbgPrint("恢复NtWriteVirtualMemory成功");
        }

if (g_KiAttachProcess)
        {
                memcpy((PVOID)g_KiAttachProcess, (PVOID)g_KiAttachProcessSave, sizeof(g_KiAttachProcessSave));
        //        DbgPrint("恢复KiAttachProcess成功");
        }

__asm
        {
                push        eax
                mov                eax, cr0
                or                eax, 0x10000
                mov                cr0, eax
                sti
                pop                eax
        }
        DbgPrint("恢复成功");
        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("创建内核线程:%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("卸载成功");
}

//        驱动程序加载时调用DriverEntry例程
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
        pDriverObj->DriverUnload = OnUnload;
        DbgPrint("加载成功");
        Hook();
        return STATUS_SUCCESS;
}

[转]过XX游戏驱动保护的代码的更多相关文章

  1. 剑指XX(游戏10) - 走正步工厂一个安静的农场游戏的代码

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lsYW5ncXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  2. 驱动保护中的ObjectType_Callback探索

    最近学习驱动保护,有点小小心德与大家分享下. 当前环境:VM中的win7 32 保护程序是某游戏的驱动保护. 具体现象是:在用PCHunter工具查看object钩子时发现如下的信息: 疑问点1:在H ...

  3. 过 DNF TP 驱动保护(二)

    过 DNF TP 驱动保护(二)   文章目录:                   01. 博文简介: 02. 环境及工具准备: 03. 分析 TP 所做的保护: 04. 干掉 NtOpenProc ...

  4. 过 DNF TP 驱动保护(一)

    过 DNF TP 驱动保护(一)   文章目录:                   01. 博文简介: 02. 环境及工具准备: 03. 分析 TP 所做的保护: 04. 干掉 NtOpenProc ...

  5. INLINE HOOK过简单驱动保护的理论知识和大概思路

    这里的简单驱动保护就是简单的HOOK掉内核API的现象 找到被HOOK的函数的当前地址在此地址处先修改页面保护属性然后写入5个字节.5个字节就是一个简单的JMP指令.这里说一下JMP指令,如下: 00 ...

  6. [转]使用Cython来保护Python代码库

    转自:http://blog.csdn.net/chenyulancn/article/details/77168621 最近,我在做一个需要使用Cython来保护整个代码库的Python项目. 起初 ...

  7. 微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js)

    微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞 ...

  8. 微信小游戏 demo 飞机大战 代码分析 (三)(spirit.js, animation.js)

    微信小游戏 demo 飞机大战 代码分析(三)(spirit.js, animation.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码 ...

  9. 微信小游戏 demo 飞机大战 代码分析 (二)(databus.js)

    微信小游戏 demo 飞机大战 代码分析(二)(databus.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码分析(三)(spirit. ...

随机推荐

  1. vs中如何统计整个项目的代码行数

    在一个大工程中有很多的源文件和头文件,如何快速统计总行数? ------解决方案--------------------b*[^:b#/]+.*$^b*[^:b#/]+.*$ ctrl + shift ...

  2. tar命令的实用详解(C参数和排除文件 --exclude)

    一.tar:从压缩包中解压出指定文件 [root@d176 test]# tar ztf nrpe-2.12.tar.gz |grep srcnrpe-2.12/src/nrpe-2.12/src/. ...

  3. 配置Eclipse编写HTML/JS/CSS/JSP页面的自动提示

    我们平时用eclipse开发jsp页面时智能提示效果不太理想,今天用了两个小时发现了eclipse也可以像Visual Studio 2008那样完全智能提示HTML/JS/CSS代码,使用eclip ...

  4. 抓包获取百度音乐API

    这次抓包是获取手机APP中的数据包,共分为三个部分: 1.win7建立wifi 2.PC架设代理服务器 手机设置代理 3.抓包分析 一.win7建立wifi 在win7下搭建wifi非常简单,网上的教 ...

  5. spring-mvc集成 swagger

    问题1:spring-mvc集成 swagger, 配置好后界面 404, 原因: dispatcher-servlet.xml 文件中, 要在这上面 <!-- 启用spring mvc 注解 ...

  6. Java编程的逻辑 (16) - 继承的细节

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  7. js下判断 iframe 是否加载完成的完美方法

    一般来说,我们判断 iframe 是否加载完成其实与 判断JavaScript 文件是否加载完成.     采用的方法很类似: var iframe = document.createElement( ...

  8. BZOJ 1878 HH的项链 | 主席树

    题意 询问区间有多少不同的数. 题解 和Luogu 1903一样,这道题也是用pre数组来求区间不同数的个数,这里pre[i]表示a[i]上一次出现的位置 +1,询问相当于查询区间内有多少pre小于等 ...

  9. OLAP和OLTP基础知识

    数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing).联机分析处理OLAP(On-Line Analytical Processing).O ...

  10. python基础下的数据结构与算法之链表

    一.链表的定义 用链接关系显式表示元素之间顺序关系的线性表称为链接表或链表. 二.单链表的python实现 class Node(object): """定义节点&quo ...