这个是过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. 【译】Asp.Net Identity与Owin,到底谁是谁?

    送给正在学习Asp.Net Identity的你 :-) 原文出自 trailmax 的博客AspNet Identity and Owin. Who is who. Recently I have ...

  2. 发布构件到Maven中央仓库

    一.注册jira账号 访问如下网址: https://issues.sonatype.org/secure/Signup.jspa 记住邮箱,用户名,密码以备以后使用,一定牢记. 二.创建一个issu ...

  3. ECS Navicat for MySQL远程连接报10038的错误

    解决问题时,建议先在阿里云设置好数据库访问的白名单,把自己的IP地址填进去 问题现象 Navicat for MySQL访问远程mysql数据库,出现报错,显示“2003- Can't connect ...

  4. CentOS 7.x 安装 Docker

    安装之前确保之前没有安装过docker为此首先删除存在的docker程序 sudo yum remove docker \ docker-common \ docker-selinux \ docke ...

  5. 【AtCoder】AtCoder Petrozavodsk Contest 001

    A - Two Integers 如果\(X\)是\(Y\)的倍数的话不存在 可以输出\(X \cdot (\frac{Y}{gcd(X,Y)} - 1)\) 代码 #include <bits ...

  6. 【LOJ】#2551. 「JSOI2018」列队

    题解 老年选手一道裸的主席树都要看好久才看出来 首先熟练的把这个区间建成\(n\)个主席树 然后对于一个询问,我们相当于在主席树上二分一个mid,使得\(mid - K + 1\)正好和\([l,r] ...

  7. java 常用面试题

    基础问题和思想:1.抽象类和接口的区别(单纯的语法区别只能给一半分,要说出来适用场景):2.hashcode()和equals()的关系:3.HashMap(Set)底层机制(用到的数据结构以及代码原 ...

  8. MySQL的lock tables和unlock tables的用法(转载)

    早就听说lock tables和unlock tables这两个命令,从字面也大体知道,前者的作用是锁定表,后者的作用是解除锁定.但是具体如何用,怎么用,不太清楚.今天详细研究了下,总算搞明白了2者的 ...

  9. spring+springmvc+hibernate 礼品管理系统

    spring+springmvc+hibernate template礼品管理系统 1.简单介绍 如标题所示,这篇文章简单写了一个基于spring+springmvc+hibernate templa ...

  10. 整理低版本ie兼容问题的解决方案

    CSS hack \9    所有的IE10及之前 *     IE7以及IE7以下版本的 _     IE6以及IE6以下版本的      !important  提升样式优先级权重 1.ie6,7 ...