绿林科技 发表于 2013-6-11 18:54

【原创】Win7下过Hack*Shield的部分驱动保护

在Win7下很多XP的驱动都不适用了!前几个月研究了一下盛*大游戏的泡泡*堂的Hack*Shield驱动保护发现Hook了十多个内核函数,Ring 3和 Ring 0的双重保护
现在暂时发现钩住了一下函数
hook NtOpenProcess

hook NtReadVirtualMemory

hook NtWriteVirtualMemory

Hook NtClose

Hook NtProtectVirtualMemory

Hook NtGetContextThread

其中HOOK NtGetContextThread中用了两个钩子,恢复起来有些麻烦,但还是给恢复了

Ring 3层的程序通过DeviceIoControl传递游戏进程ID给驱动,然后驱动就执行相关的动作!现在给出部分关键的代码!

Ring 3层:

// 安装驱动的线程函数
UINT __cdecl CDriverProtectDlg::InstallDriverThread(LPVOID pParam)
{
CDriverProtectDlg* pDlg = NULL;
pDlg = (CDriverProtectDlg*)pParam;
pDlg->UpdateData(TRUE);
if (pDlg->strPath.IsEmpty())
{
    AfxMessageBox(L"请选择驱动路径!");
    return 0;
}
if (pDlg->strrGamePath.IsEmpty())
{
    AfxMessageBox(L"请选择游戏路径!");
    return 0;
}
if (!pDlg->LoadNTDriver(L"HelloDDK",pDlg->strPath.GetBuffer()))
{
    pDlg->UnloadNTDriver(L"HelloDDK");
    pDlg->LoadNTDriver(L"HelloDDK",pDlg->strPath.GetBuffer());
}
HANDLE hDevice =
    ::CreateFileW(L"\\\\.\\HelloDDK",
    GENERIC_READ | GENERIC_WRITE,
    0,    // share mode none
    NULL,// no security
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL );    // no template
if (hDevice == INVALID_HANDLE_VALUE)
{
    pDlg->m_DriverINFORMATION.SetWindowTextW(L"打开驱动错误!");
    return 1;
}
DWORD Pid = pDlg->TransferProcessID(pDlg->strrGamePath.GetBuffer());
int a = (int)Pid;
UCHAR* InputBuffer = new UCHAR;
UCHAR* OutputBuffer= new UCHAR;
BOOL bRet;
DWORD dwOutput;
//输入缓冲区作为输入,输出缓冲区作为输出
bRet = DeviceIoControl(hDevice, IOCTL_TEST1, InputBuffer, a, OutputBuffer, a, &dwOutput, NULL);
if (bRet)
{
    pDlg->m_DriverINFORMATION.SetWindowTextW(L"开启保护成功!");
}
CloseHandle(hDevice);
delete []InputBuffer;
delete []OutputBuffer;
//AfxEndThread(0);
ResumeThread(pDlg->ProcessMainThread);
pDlg = NULL;
return 0;
}
UINT __cdecl CDriverProtectDlg::UnInstallDriverThread(LPVOID pParam)
{
CDriverProtectDlg* pDlg = NULL;
pDlg = (CDriverProtectDlg*)pParam;
pDlg->UpdateData(TRUE);
if (pDlg->strPath.IsEmpty())
{
    AfxMessageBox(L"请选择驱动路径!");
    return 0;
}
if (pDlg->strrGamePath.IsEmpty())
{
    AfxMessageBox(L"请选择游戏路径!");
    return 0;
}
pDlg->UnloadNTDriver(L"HelloDDK");
//AfxEndThread(0);
pDlg = NULL;
return 0;
}
Ring 0层的:

#include "HookNtOpenProcess.h"
#include "Function.h"

int nNtOpenProcessAddr;
int nHookNtOpenProcessAddr;
int nHookNtOpenPrpcessJmp;
int nHookNtOpenPrpcessOldJmp;
int nObOpenObjectByPointerAddr;
extern int GameProcessID;
static __declspec(naked) void MyNtOpenProcess()
{
__asm
{
    push dword ptr
    push dword ptr
    push dword ptr
    push dword ptr
}
if (PanDuanProcessID()==GameProcessID)
{
    __asm
    {
      jmp nHookNtOpenPrpcessOldJmp
      call nObOpenObjectByPointerAddr
      jmp nHookNtOpenPrpcessJmp
    }
}
else
{
    __asm
    {
      call nObOpenObjectByPointerAddr
      jmp nHookNtOpenPrpcessJmp
    }
}
}


void HookNtOpenProcess()
{

//DbgPrint("要HOOK的进程ID为:%d",GameProcessID);
nNtOpenProcessAddr=GetFunCtionAddr(L"NtOpenProcess");
char code = {(char)0xFF,(char)0x75,(char)0xFC,(char)0xFF,(char)0x75,(char)0xFC,(char)0xFF,(char)0x75,(char)0x0C,(char)0xFF,(char)0x75,(char)0x08,(char)0xE8};
nHookNtOpenProcessAddr=SearchFeature(nNtOpenProcessAddr,code,13)-13;
//DbgPrint("nHookNtOpenProcessAddr=%x\n",nHookNtOpenProcessAddr);
nHookNtOpenPrpcessJmp=nHookNtOpenProcessAddr+17;
nHookNtOpenPrpcessOldJmp=nHookNtOpenProcessAddr+12;
//DbgPrint("nHookNtOpenPrpcessJmp=%x\n",nHookNtOpenPrpcessJmp);
//DbgPrint("nHookNtOpenPrpcessOldJmp=%x\n",nHookNtOpenPrpcessOldJmp);
nObOpenObjectByPointerAddr = GetCallAddr(nHookNtOpenPrpcessOldJmp+1);
//DbgPrint("nObOpenObjectByPointerAddr=%x\n",nObOpenObjectByPointerAddr);
InLineHookEngine(nHookNtOpenProcessAddr,(int)MyNtOpenProcess);
}


void UnHookNtOpenProcess()
{
char code = {(char)0xFF,(char)0x75,(char)0xFC,(char)0xFF,(char)0x75,(char)0xFC,(char)0xFF,(char)0x75,(char)0x0C,(char)0xFF,(char)0x75,(char)0x08,(char)0xE8};
UnInLineHookEngine(nHookNtOpenProcessAddr,code,5);
}
DriverProtect.rar 为Ring 3层的源码
driver.rar 为Ring 0层的驱动文件及调试用的PDB文件

然后这些代码就可以让CE正常打开进程扫描,修改游戏内存数据了!OD附加功能还在开发中。


本人顺便录制了一个教程帮助讲解代码:

http://pan.baidu.com/share/link?shareid=3747786441&uk=3155594444

bambooqj 发表于 2013-6-11 19:04

膜拜大牛。。。不过驱动级别的怎么修改呢。

1354669803 发表于 2013-6-11 19:05

膜拜会Hook的大大

Victory.ms 发表于 2013-6-11 19:05

难道HS跟TP难度一个层次,这么容易过?

求过NP保护的思路

E_eYYF 发表于 2013-6-11 20:05

看到干驱动保护的就知道是大牛,给跪了!

天高云淡 发表于 2013-6-12 08:56

好东西,先试试看!

m2m 发表于 2013-6-28 00:58

不错,看看思路。。。。

Ylca 发表于 2013-6-28 01:06

果然是大神, 不是何时才能创造出此代码

yoder 发表于 2013-7-8 21:33

模板会写驱动hook的

康弟 发表于 2013-7-9 22:33

我靠,行家呀?{:1_908:}
页: [1] 2 3 4 5
查看完整版本: 【原创】Win7下过Hack*Shield的部分驱动保护