这个是过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. Linux驱动技术(五) _设备阻塞/非阻塞读写【转】

    转自:http://www.cnblogs.com/xiaojiang1025/p/6377925.html 等待队列是内核中实现进程调度的一个十分重要的数据结构,其任务是维护一个链表,链表中每一个节 ...

  2. RTS与CTS的含义【转】

    转自:http://www.cnblogs.com/sunyubo/archive/2010/04/21/2282176.html 一.RS232标准中的RTS与CTS RTS,CTS------请求 ...

  3. Visual Studio 2012“完美的拥抱”Visual Studio Online

    看了Visual Studio 2012完美的拥抱GitHub 写的不错,不过,配置起来太麻烦.既然是使用VS编码,微软的东西嘛,当然还有更简单的,那就是Visual Studio Online.不用 ...

  4. SOAP简单示例

    看了网上的几个文章,SOAP的示例布局都不清晰,不能马上入手,特意写个例子与大家分享,同时记录备用. 当前环境:VS2013 + WPF private void Button_Click(objec ...

  5. 关于RestFul API 介绍与实践

    之前演示的PPT,直接看图...     •参考链接: •RESTful API 设计最佳实践 •RESTful API 设计指南 •SOAPwebserivce和RESTfulwebservice对 ...

  6. 初始ASP.NET数据控件【续 ListView】

    ListView控件   ListView控件可以用来显示数据,它还提供编辑,删除,插入,分页与排序等功能.ListView是GridView与DataList的融合体,它具有GridView控件编辑 ...

  7. ajax调用WebService 不能跨域

    http://www.cnblogs.com/dojo-lzz/p/4265637.html "Access-Control-Allow-Origin":'http://local ...

  8. C# 各版本新特性

    C# 2.0 泛型(Generics) 泛型是CLR 2.0中引入的最重要的新特性,使得可以在类.方法中对使用的类型进行参数化. 例如,这里定义了一个泛型类: class MyCollection&l ...

  9. java Comparator和Comparable(比较器)

    Comparable: 一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序,sort方法调用compareTo()方法里定义 ...

  10. PHP获取客户端的IP地址

    首先我们来了解相关变量的含义: $_SERVER['REMOTE_ADDR']:浏览当前页面的用户计算机的ip地址 $_SERVER['HTTP_CLIENT_IP']:客户端的ip $_SERVER ...