吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 23107|回复: 43
收起左侧

[游戏安全] 【原创】Win7下过Hack*Shield的部分驱动保护

  [复制链接]
绿林科技 发表于 2013-6-11 18:54
在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[a];
  UCHAR* OutputBuffer= new UCHAR[a];
  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 [ebp-4]
    push dword ptr [ebp-4]
    push dword ptr [ebp+0x0C]
    push dword ptr [ebp+8]
  }
  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[13] = {(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[13] = {(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附加功能还在开发中。
driver.rar (44.48 KB, 下载次数: 87) DriverProtect.rar (134.39 KB, 下载次数: 76)

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

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

免费评分

参与人数 1热心值 +1 收起 理由
E_eYYF + 1 膜拜!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

头像被屏蔽
bambooqj 发表于 2013-6-11 19:04
膜拜大牛。。。不过驱动级别的怎么修改呢。
1354669803 发表于 2013-6-11 19:05
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
我靠,行家呀?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-26 06:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表