//方式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. 项目添加大量js文件时关闭Eclipse校验机制

    1,如:当添加Ext JS的examples文件夹时

  2. php 把数组保存为标准的数组格式,存储到文件中

    <?php $file='./test.php'; $array=array('color'=> array('blue','red','green'),'size'=> array ...

  3. Haystack全文检索

    1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsearch(java写的 ...

  4. 271. 杨老师的照相排列【线性DP】

    杨老师希望给他的班级拍一张合照. 学生们将站成左端对齐的多排,靠后的排站的人数不能少于靠前的排. 例如,12名学生(从后向前)可以排列成每排5,3,3,1人,如下所示: X X X X X X X X ...

  5. [opengl]Clion配置opengl

    如何在Clion中编写Opengl程序 首先下载 GLAD GLFW 创建Clion工程 在工程中创建文件夹lib.dll.include文件夹 把下载下来的东西放入对应的文件夹 CMakeLists ...

  6. HDU 3948 The Number of Palindromes(Manacher+后缀数组)

    题意 求一个字符串中本质不同的回文子串的个数. $ 1\leq |string| \leq 100000$ 思路 好像是回文自动机的裸题,但是可以用 \(\text{Manacher}\) (马拉车) ...

  7. python - Random常用方法记录

    import random # range [a,b) 不包含b # 获取随机整数 # randrange [a,b) 不包含b a = random.randrange(0, 101, 5) # E ...

  8. oracle数据库查看和解除死锁

    查看死锁: select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_ ...

  9. threejs深入纹理,立体场景cubeResolution(四)

    在这个课程里主要完成讲解两个demo: 一个是电视墙:用视频做纹理 一,用视频做纹理 首先我们用video标签把视频源引入: <video id="video" autopl ...

  10. Unity自定义定时器,模拟协程,脱离MonoBehavior控制

    using System; using System.Collections.Generic; using System.Timers; public class PETimer { private ...