YJX_Driver_032_自写驱动保护XX进程

1、

自写驱动保护XX进程(HOOK SSDT)
  A、构建自己的内核函数(用来替换对应的内核函数)
  C、Hook和UnHook函数构建
  D、修改EXE和SYS对应源代码实现所谓保护
  E、测试效果

2、

一、以28课的代码为例 新建一个hook.h单元

#pragma once
#ifdef __cplusplus
extern "C"
{
#endif

#include <NTDDK.h> //这里包含需要用C方式编译的头文件

#ifdef __cplusplus
}
#endif

//#include <windef.h>

bool ssdthook_flag=false;
ULONG RealNtOpenAddress;
HANDLE MyPID;

// A、构建自己的内核函数(用来替换对应的内核函数)

// 定义一下NtOpenProcess的原型
extern "C" typedef NTSTATUS __stdcall NTOPENPROCESS
(
    OUT PHANDLE ProcessHandle,
    IN ACCESS_MASK AccessMask,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN PCLIENT_ID ClientId
);
NTOPENPROCESS * RealNtOpenProcess;

PEPROCESS EP;

// 自定义的NtOpenProcess函数
#pragma PAGECODE
extern "C" NTSTATUS __stdcall MyNtOpenProcess(
    OUT PHANDLE ProcessHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN PCLIENT_ID ClientId )
{
  NTSTATUS rc;
  HANDLE PID;

  KdPrint(("++++++++++++Entry MyNtOpenProcess int ++++++++++++++\n"));

  rc = (NTSTATUS)RealNtOpenProcess( ProcessHandle, DesiredAccess, ObjectAttributes, ClientId );

  if( (ClientId != NULL) )
  {
    PID = ClientId->UniqueProcess;
    KdPrint(( "------------------------- PID=%d--------------\n",(int*)PID ));

    // 如果是被保护的PID,则拒绝访问,并将句柄设置为空
    if(PID == MyPID)
    {
      KdPrint(("被保护进程 MyPID=%d \n",(int)MyPID));
      //调试输出 类似C语言的 Printf

      ProcessHandle = NULL; //这个是关键
      rc = STATUS_ACCESS_DENIED; //这个返回值
      //PsLookupProcessByProcessId((ULONG)PID,&EP);
      EP=PsGetCurrentProcess();
      KdPrint((" ACESS Process Name --:%s-- \n",(PTSTR)((ULONG)EP+0x174)));
    }
  }
  return rc;
}

//HOOK 函数构建
#pragma PAGECODE
VOID Hook()
{
  ssdthook_flag=true;//设置被HOOK标志
  KdPrint(("++++HOOK START ++++-\n"));
  LONG *SSDT_Adr,SSDT_NtOpenProcess_Cur_Addr,t_addr;

  KdPrint(("驱动成功被加载中.............................\n"));
  //读取SSDT表中索引值为0x7A的函数
  //poi(poi(KeServiceDescriptorTable)+0x7a*4)
  t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase;
  SSDT_Adr=(PLONG)(t_addr+0x7A*4);
  SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr;
  RealNtOpenAddress = *SSDT_Adr;
  RealNtOpenProcess = ( NTOPENPROCESS *)RealNtOpenAddress;

  KdPrint(( "真实的NtOpenProcess地址: %x\n",(int) RealNtOpenAddress ));
  KdPrint((" 伪造NTOpenProcess地址: %x\n", (int)MyNtOpenProcess ));

  __asm //去掉页面保护
  {
    cli
      mov eax,cr0
      and eax,not 10000h //and eax,0FFFEFFFFh
      mov cr0,eax
  }

  *SSDT_Adr= (ULONG)MyNtOpenProcess;

  __asm
  {
      mov eax, cr0
      or eax, 10000h
      mov cr0, eax
    sti
  }
  return;
}

//UnHook函数构建
//////////////////////////////////////////////////////
#pragma PAGECODE

VOID UnHook()
{
  ULONG Old_ssdt;
  Old_ssdt = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;
  if (ssdthook_flag)
  {
    ssdthook_flag=false;
    __asm
    {
      cli
        mov eax, cr0
        and eax, not 10000h
        mov cr0, eax
    }

    // 还原SSDT
    *((ULONG*)Old_ssdt) = (ULONG)RealNtOpenAddress;

    __asm
    {
        mov eax, cr0
        or eax, 10000h
        mov cr0, eax
      sti
    }
    KdPrint(("UnHook还原SSDT OK \n"));
  }
  return;
}

二、修改ctl_code.h 头文件

//ctl_code.h 修改如下:

//郁金香灬外挂技术 www.yjxsoft.com QQ150330575

#ifndef CTL_CODE
  #pragma message("\n \n-----------EXE模式 Include winioctl.h ")
  #include<winioctl.h> //CTL_CODE ntddk.h wdm.h
#else
  #pragma message("-\n \n---------SYS模式NO Include winioctl.h ")
#endif

#define add_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_NEITHER,FILE_ANY_ACCESS)
#define sub_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_NEITHER,FILE_ANY_ACCESS)
#define hook_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_NEITHER,FILE_ANY_ACCESS)
#define unhook_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_NEITHER,FILE_ANY_ACCESS)

三、修改EXE部分源代码

四、修改SYS部分源代码

时间: 2024-10-11 12:54:51

YJX_Driver_032_自写驱动保护XX进程的相关文章

若水软件论坛过游戏驱动保护视频教程

课程分四个大章节:?1.初级篇,2.中级篇,3.进阶篇,4.高级篇 初级篇1.VS2003/2008/VC6.0编译驱动A.VS2003驱动编译环境配置B.VS2003集成环境下编译一个简单的驱动2.创建一个卸载例程A.认识PDRIVER_OBJECT结构B.卸载例程回调函数构建C.查看卸载例程调试信息3.添加设备例程A.认识驱动对象DRIVER_OBJECTB.认识设备对象DEVICE_OBJECTC.添加创建设备的例程D.用工具查看驱动及驱动设备4.添加删除设备例程A.删除符号链接B.删除设

过 DNF TP 驱动保护(一)

文章目录:                   01. 博文简介: 02. 环境及工具准备: 03. 分析 TP 所做的保护: 04. 干掉 NtOpenProcess 中的 Deep InLine Hook: 05. 干掉 NtOpenThread 中的 Deep InLine Hook: 06. 干掉 NtReadVirtualMemory 中的 InLine Hook: 07. 干掉 NtWriteVirtualMemory 中的 InLine Hook: 08. 干掉 KiAttachP

YJX_Driver_021_绕过驱动保护

1. 绕过SSDT驱动保护 A.去掉页面保护 B.写入In Line HOOK代码 C.用OD附加测试效果 D.反HOOK代码 [190]复制 第20课 的代码 [315]涉及到 页面的保护 ==> 涉及到 一个特殊的寄存器 cr0,32位寄存器 ==> 其中的第17位(从第0位开始) ==> CW位 [480]CW位: 置1 --> 开启 页面保护 置0 --> 去掉 页面保护 [530]这只是一种方法(修改cr0的CW位),还有一种是修改内存描述符(MDL)(相关函数前面

【转】[内核/驱动]驱动中获取进程全路径和注册表全路径

转载地址: http://blog.sina.com.cn/s/blog_60a1a51d0100e78g.html 2008.07.05 经过这几天的努力,注册表保护驱动已经基本稳定.很多人都在网上问如何获取访问注册表的进程全路径和被访问的注册表的全路径,下面就将部分代码贴出来. //驱动中获取被访问注册表的全路径 BOOLEAN GetRegFullPath(HANDLE KeyHandle, PUNICODE_STRING pRegFullPath) { POBJECT pKey = NU

地磁驱动及算法进程

----------------    取芯片自检数据, 在工厂模式检测做fangdai处理 ----------- 芯片都有自检程序, 驱动里面应该有一个节点, 调用自检程序, 返回自检程序结果. 工厂各器件测试, 先做器件的自检测试 . 然后再做其他, 先确定芯片有没有问题. 以此fangdai. ---------------  板子调试初期, 先确定有无hall器件 ----------- hall器件对磁力线响应, 可以重直, 可以水平. 翻盖上的磁铁位置, 要先标记出hall在翻盖上

通过修改CR0寄存器绕过SSDT驱动保护

为了安全起见,Windows XP及其以后的系统将一些重要的内存页设置为只读属性,这样就算有权力访问该表也不能随意对其修改,例如SSDT.IDT等.但这种方法很容易被绕过,我们只要将这些部分修改为可写属性就可以了,不过当我们的事情做完后记得把它们恢复为只读属性,不然会造成一些很难预料到的后果. cr0是系统内的控制寄存器之一.控制寄存器是一些特殊的寄存器,它们可以控制CPU的一些重要特性. 控制寄存器最初出现于低级的286处理器中,以前称之为机器状态字(machine status word),

Python写自动化之启动进程并获取进程输出

当我们需要执行外部命令或自己写一个自动化执行器时,需要使用到启动进程并获取输出的操作 首先,我们启动进程采用Python的subprocess模块,为了保证标准输出和标准错误输出能够正常运行,启动两个线程来检测输出结果部分 class Daemon(threading.Thread): def __init__(self, workDir, logFunction=None, *args): threading.Thread.__init__(self) self.process = None

写程序取自己进程的AEP

测试程序功能 打印出自己进程的程序入口点地址. 结合OD载入程序,看到的入口点确实是0x004014f0, 说明程序入口点找到了 测试程序 [cpp] view plain copy /// @file exam_1_1.c #include <stdlib.h> #include <stdio.h> void fnGetProgEntry(); int main(int agrc, char** argv) { fnGetProgEntry(); printf("END

驱动层得到进程的完整路径

在得到进程EProcess之后,对于进程完整路径的获得一般有两种方法,一种是访问的进程的PEB结构,在PEB结构中保存有进程的完整路径,另一种方法就是采用访问_FILE_OBJECT的方法. 访问PEB的方法便存在线程靠挂的问题,因为运行于Ring0层的线程是无法去访问用户地址空间的,需要将线程暂时靠挂到目标呢进程,进而去访问进程的PEB结构.我一般都采用的访问_FILE_OBJECT的方法,避免了线程的靠挂问题,而且访问peb的方法会存在一个问题:如果想要进行进程拦截,在进程未启动之前就阻止进