//方式1:MSR Hook

#include <ntifs.h>

UINT32 oldaddr = ;
UINT32 pidtoprotect = ;
PCLIENT_ID pid = ;
PUINT32 accessmask = ;
UINT32 ssdtindex = ; VOID MyKiFastCallEntry();
//#pragma alloc_text(NONE_PAGE,MyKiFastCallEntry) VOID OnHook()
{ __asm
{
pushad
pushfd mov ecx, 0x176
rdmsr
mov oldaddr, eax mov ecx, 0x176
xor edx, edx
mov eax, MyKiFastCallEntry
wrmsr popfd
popad
} } VOID OffHook()
{
__asm
{
pushad
pushfd mov ecx,0x176
xor edx,edx
mov eax,oldaddr
wrmsr popfd
popad
}
} VOID UnloadMe(PDRIVER_OBJECT pdo)
{
OffHook();
} __declspec(naked) VOID MyKiFastCallEntry() //原来裸函数内不能使用auto或register变量的
{
__asm
{
mov ssdtindex, eax;
} if (ssdtindex == 0xbe)
{
_asm
{
push dword ptr[edx + * ];
pop pid;
push edx;
add dword ptr[esp], ;
pop accessmask; //这里得注意,这种方式,得到的是accessmask的地址..太阴险了
pushad;
}
if ((pid->UniqueProcess == pidtoprotect) && (*accessmask&0x0001))
{
KdPrint(("I'm Here2!\n"));
*accessmask &= ~0x0001;
}
_asm popad;
}
__asm
{ jmp oldaddr;
}
} NTSTATUS DriverEntry(PDRIVER_OBJECT pdo, PUNICODE_STRING ppath)
{
OnHook(); pdo->DriverUnload = UnloadMe;
return STATUS_SUCCESS;
} //不知为何,虽然保护成功了,但是在任务管理器多次结束任务,那么那个进程还是被结束了..
//方式2:SSDT Hook

#include <ntifs.h>

#pragma pack(1)
typedef struct _ServiceDescriptorEntry
{
ULONG *ServiceTableBase;
ULONG *ServiceCounterTableBase;
ULONG NumberOfServices;
UCHAR *ParamTableBase;
}SSDTEntry, *PSSDTEntry;
#pragma pack() NTSYSAPI SSDTEntry KeServiceDescriptorTable;
VOID OnHook();
VOID OffHook(); VOID OffMemProtect()
{
__asm
{
push eax;
mov eax, CR0;
and eax, ~0x10000;
mov CR0, eax;
pop eax;
}
} VOID OnMemProtect()
{
__asm
{
push eax;
mov eax, CR0;
or eax, 0x10000;
mov CR0, eax;
pop eax;
}
} VOID UnloadMe(PDRIVER_OBJECT pdo)
{
OffHook();
} ULONG pidtoprotect = ; typedef NTSTATUS(NTAPI *NTOPENPROCESS)(__out PHANDLE ProcessHandle,
__in ACCESS_MASK DesiredAccess,
__in POBJECT_ATTRIBUTES ObjectAttributes,
__in_opt PCLIENT_ID ClientId
);
NTOPENPROCESS oldaddr; NTSTATUS MyZwOpenProcess(
_Out_ PHANDLE ProcessHandle,
_In_ ACCESS_MASK DesiredAccess,
_In_ POBJECT_ATTRIBUTES ObjectAttributes,
_In_opt_ PCLIENT_ID ClientId
); NTSTATUS MyZwOpenProcess(
_Out_ PHANDLE ProcessHandle,
_In_ ACCESS_MASK DesiredAccess,
_In_ POBJECT_ATTRIBUTES ObjectAttributes,
_In_opt_ PCLIENT_ID ClientId
)
{
if ((ClientId->UniqueProcess == pidtoprotect) && (DesiredAccess & 0x0001))
{
KdPrint(("IM in"));
return STATUS_ACCESS_DENIED;
}
else
return oldaddr(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);
} VOID OnHook()
{
DbgBreakPoint();
OffMemProtect(); PULONG pssdtbase = KeServiceDescriptorTable.ServiceTableBase; ULONG uIndex = 0xbe; oldaddr = pssdtbase[uIndex];
pssdtbase[uIndex] = MyZwOpenProcess;
OnMemProtect(); } VOID OffHook()
{
OffMemProtect();
PULONG pssdtbase = KeServiceDescriptorTable.ServiceTableBase;
ULONG uIndex = 0xbe;
pssdtbase[uIndex] = oldaddr;
OnMemProtect();
} NTSTATUS DriverEntry(PDRIVER_OBJECT pdo, PUNICODE_STRING ppath)
{
OnHook(); pdo->DriverUnload = UnloadMe;
return STATUS_SUCCESS;
}

MSRHook与SSDTHook的更多相关文章

  1. SSDTHook实例--编写稳定的Hook过滤函数

    解说怎样写Hook过滤函数,比方NewZwOpenProcess.打开进程. 非常多游戏保护都会对这个函数进行Hook. 因为我们没有游戏保护的代码,无法得知游戏公司是怎样编写这个过滤函数. 我看到非 ...

  2. Hook集合----SSDTHook(x86 Win7)

    最近在学习Ring0层Hook的一些知识点,很久就写完SSDTHook的代码了,但是一直没有整理成笔记,最近有时间也就整理整理. 介绍: SSDTHook 实质是利用Ntoskrnl.exe 中全局导 ...

  3. ring0 关于SSDTHook使用的绕过页面写保护的原理与实现

    原博:http://www.cnblogs.com/hongfei/archive/2013/06/18/3142162.html 为了安全起见,Windows XP及其以后的系统将一些重要的内存页设 ...

  4. ring0 恢复SSDTHook

    原理: 用ZwQuerySystemInformation 功能号为11(SystemModuleInformation)  得到所有系统模块的地址 遍历搜索得到ntos模块的基地址 读Ntos模块到 ...

  5. ring0 SSDTHook 实现x64/x86

    #include "HookSSDT.h" #include <ntimage.h> #define SEC_IMAGE 0x001000000 ULONG32 __N ...

  6. ring0 SSDTHook

    SSDT 的全称是 System Services Descriptor Table,系统服务描述符表.这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来. ...

  7. 进程隐藏与进程保护(SSDT Hook 实现)(二)

    文章目录:                   1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ri ...

  8. 调用Nt函数内核模式切换问题

    很久不写博客了,笔记大多记在电脑上在,以后整理好了再搬运上来吧. 今天记一下“进程内存管理器”这个小程序上遇到的一个问题——内核模式调用Nt*函数. 使用的是内核中的NtQueryVirtualMem ...

  9. ce+od无法同时附加进程的问题

    CE+OD无法附加游戏进程的破解方法 来吧 别在为这烦恼了 其实看过 windows 核心编程那本书的人都知道 计算机编程领域 那些所谓的游戏保护 真的只是为难菜鸟而已,对于大鸟基本不起作用. 游戏无 ...

随机推荐

  1. deepin Gtk-WARNING **: 无法在模块路径中找到主题引擎:“adwaita”

    虽然没影响使用,但是看着有点不爽. 执行 sudo apt-get install gnome-themes-standard 就可以了.

  2. ES6 解构

    { "code": 200, "msg": "success", "data": { "total" ...

  3. bash 基础命令

    bash的基础特性(): () 命令历史 history 环境变量: HISTSIZE:命令历史记录的条数: HISTFILE:~/.bash_history: HISTFILESIZE:命令历史文件 ...

  4. 深入理解泛型之JAVA泛型的继承和实现、泛型擦除

    很多的基础类设计会采用泛型模式,有些应用在使用的时候处于隔离考虑,会进行继承,此时子类如何继承泛型类就很讲究了,有些情况下需要类型擦除,有些情况下不需要类型擦除,但是大多数情况下,我们需要的是保留父类 ...

  5. mysqli_query($conn, $sql)的返回值类型

    SQL语句的分类: DDL: Data Define Language,数据定义语言——定义列 CREATE / DROP / ALTER / TRUNCATE DML: Data Manipulat ...

  6. Android中的数据储存

    数据的储存是一个十分重要的功能,它涉及到各种类型的数据,各种的储存方式,今天就接触了Android中数据储存的简单应用,有一种方式是可以将存入的数据原封不动的存储起来,这里要用到openfileout ...

  7. Appium 框架工作流程及原理

    目前Appium框架可以时支持android 和 ios 两个操作系统的App自动化测试,咱们分别对以下两款操作系统的工作流程进行说明. 一.appium-Android工作流 在Android端,a ...

  8. Oracle使用——oracle11g安装——Oracle要求的结果: 5.0,5.1,5.2,6.0 6.1 之一 实际结果: 6.2

    问题 正在检查操作系统要求...        要求的结果: 5.0,5.1,5.2,6.0 之一        实际结果: 6.1        检查完成.此次检查的总体结果为: 失败 <&l ...

  9. 论文笔记:ATOM: Accurate Tracking by Overlap Maximization

    ATOM: Accurate Tracking by Overlap Maximization  2019-03-12 23:48:42  Paper:https://arxiv.org/pdf/18 ...

  10. Visual Studio 2017 和 Visual Assist X 番茄助手的安装教程

    声明:本文所提供的所有软件均来自于互联网,仅供个人研究和学习使用,请勿用于商业用途,下载后请于24小时内删除,请支持正版! 一.Visual Studio 2017的安装教程 Visual Studi ...