MSRHook与SSDTHook
//方式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的更多相关文章
- SSDTHook实例--编写稳定的Hook过滤函数
解说怎样写Hook过滤函数,比方NewZwOpenProcess.打开进程. 非常多游戏保护都会对这个函数进行Hook. 因为我们没有游戏保护的代码,无法得知游戏公司是怎样编写这个过滤函数. 我看到非 ...
- Hook集合----SSDTHook(x86 Win7)
最近在学习Ring0层Hook的一些知识点,很久就写完SSDTHook的代码了,但是一直没有整理成笔记,最近有时间也就整理整理. 介绍: SSDTHook 实质是利用Ntoskrnl.exe 中全局导 ...
- ring0 关于SSDTHook使用的绕过页面写保护的原理与实现
原博:http://www.cnblogs.com/hongfei/archive/2013/06/18/3142162.html 为了安全起见,Windows XP及其以后的系统将一些重要的内存页设 ...
- ring0 恢复SSDTHook
原理: 用ZwQuerySystemInformation 功能号为11(SystemModuleInformation) 得到所有系统模块的地址 遍历搜索得到ntos模块的基地址 读Ntos模块到 ...
- ring0 SSDTHook 实现x64/x86
#include "HookSSDT.h" #include <ntimage.h> #define SEC_IMAGE 0x001000000 ULONG32 __N ...
- ring0 SSDTHook
SSDT 的全称是 System Services Descriptor Table,系统服务描述符表.这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来. ...
- 进程隐藏与进程保护(SSDT Hook 实现)(二)
文章目录: 1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ri ...
- 调用Nt函数内核模式切换问题
很久不写博客了,笔记大多记在电脑上在,以后整理好了再搬运上来吧. 今天记一下“进程内存管理器”这个小程序上遇到的一个问题——内核模式调用Nt*函数. 使用的是内核中的NtQueryVirtualMem ...
- ce+od无法同时附加进程的问题
CE+OD无法附加游戏进程的破解方法 来吧 别在为这烦恼了 其实看过 windows 核心编程那本书的人都知道 计算机编程领域 那些所谓的游戏保护 真的只是为难菜鸟而已,对于大鸟基本不起作用. 游戏无 ...
随机推荐
- 【POJ 2176】Folding
[原题链接]传送门 [题面大意] 一个字符串,可以将它改写成循环节带括号的形式进行压缩,输出压缩长度最小的字符串. [题解思路] 1.没思路没思路,不知道怎么乱搞,大概就可以想到动态规划. 2.套路区 ...
- 蒙德里安的梦想【状压DP】
求把N*M的棋盘分割成若干个1*2的的长方形,有多少种方案. 例如当N=2,M=4时,共有5种方案.当N=2,M=3时,共有3种方案. 如下图所示: 输入格式 输入包含多组测试用例. 每组测试用例占一 ...
- 如何恢复已禁用的console.log?
如何恢复已禁用的console.log? How to Restore a Disabled console.log?通过将其拉出iframe,在已删除的页面(如twitter)上恢复console. ...
- js添加的元素无法触发click事件
动态生成的元素,使用.on绑定事件,比如$(document).on("click",".divclick",function(){})
- 浅谈Cocos2d-js ListView滑动防止误触
Event背景 最近,接到一个需求,优化房间内设置界面: 表面问题:用户在按钮表面,滑动界面的时候,总会误触到界面上的按钮或者复选框 根本问题:由于ListView的事件具有传递性,导致双重事件触发, ...
- Python开发 基础篇
2019-02-01 产生验证码: 用户输入的值和显示的值相同时显示Correct,否则继续生成随机验证码等待用户输入 def check_code(): import random checkcod ...
- samtools 使用简述
功能如下: 1.View 主要功能讲sam文件转位bam文件. 涉及的参数: -b 输出bam格式..默认是sam文件 -h 输出的sam文件带header..默认不带 -H 仅仅输出header - ...
- Python中怎么读写文件
python中对文件的操作大概分为三步:打开文件.操作文件(读.写.追加写入).关闭文件. 1.无论对文件做哪种操作,操作前首先要保证文件被打开了,即需要一个打开的操作. 例:open(XXX.txt ...
- cef-3.2623 build on vs2013
1. 参文"在Windows下编译Cef3.2623并加入mp3.mp4支持(附带源码包和最终DLL)"下载包 http://blog.csdn.net/zhuhongshu/ar ...
- dedecms织梦文章微信分享带缩略图与简介
dedecms V5.7二次开发 php5.6 mysql5.1 问题:dedecms文章分享到微信,带缩略图与简介.如下图: 1.准备工作 PHP 5.3+ 并且 curl扩展已经开启 微信服务号一 ...