//方式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. QSettings 类

    一 .QSettings介绍: 用户通常希望应用程序记住其设置.在windows中,这些设置保存在注册表中,ios在属性文件列表中,而unix,在缺乏标准的情况下,其存储在ini文本中.QSettin ...

  2. Tomcat类加载

    一.为什么会有类加载 1.在类加载阶段,虚拟机需要完成以下3件事情 1)通过一个全限类定名来获取此类的二进制字节流 2) 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 3)在内存中生成 ...

  3. VC++ 实现程序重启

    转载:https://blog.csdn.net/what951006/article/details/72729448 一.创建一个Win32项目 二.窗口处理函数中,Create窗口时创建一个按钮 ...

  4. windows微信双开

    下面的代码写到xxx.bat文件中 @echo off start /d "D:\software\WeChat\" WeChat.exe start /d "D:\so ...

  5. P4116 Qtree3

    思路 可以树剖可以LCT,树剖就是每个重链开一个SET维护一下黑点的深度 非常不优美 使用LCT,在splay上二分找出需要的节点即可 代码 #include <cstdio> #incl ...

  6. Linux (麒麟)系统 重启后无法登陆进图形界面

    登录图形化界面的时候,会显示GNOME电源管理器没启动等提示信息,会一直卡在登录界面 在启动的时候按ESC或者在登录界面crtl+alt +f3 进入字符终端界面 查看物理存储空间占用信息,可能会有一 ...

  7. EF的优缺点

    优点: 1.简洁的Linq to Sql语句大大提高了开发人员的效率,不要再写复杂的sql语句: 2.不再需要再管应用程序如何去连接数据库: 3.EF可以用作用于数据服务和OData Service的 ...

  8. 16_Linux网络配置

    A类:255.0.0.0        8 0 000 0001 - 0 111 1111 127用户回环,1-126 2^7-1个A类地址 容纳多少个主机:2^24-2 主机位全0:网络地址 主机位 ...

  9. 【centos7】 Failed to start LSB Bring up/down

    今天碰到几个问题: 1. Failed to start LSB Bring up/down 归结一下 百度 的答案: 1). 90% 修改MAC 地址 2).10% 重启 networkmanage ...

  10. 在linux上运行网页程序及日志文件查看