HOOK NtCreateSection
#pragma once
#include <ntddk.h>
NTSYSAPI
NTSTATUS
NTAPI
NtCreateSection(OUT PHANDLE SectionHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PLARGE_INTEGER SectionSize OPTIONAL,
IN ULONG Protect,
IN ULONG Attributes,
IN HANDLE FileHandle);
NTSTATUS
DetourNtCreateSection(OUT PHANDLE SectionHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PLARGE_INTEGER SectionSize OPTIONAL,
IN ULONG Protect,
IN ULONG Attributes,
IN HANDLE FileHandle);
VOID
TrueCellUnload(IN PDRIVER_OBJECT DriverObject);
BOOLEAN
HookFunc(BOOLEAN IsHook);
NTSTATUS
DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath);
NTSTATUS
IoQueryFileDosDeviceName(IN PFILE_OBJECT FileObject,
OUT POBJECT_NAME_INFORMATION *ObjectNameInformation );
#include "Ncs.h"
#include "hde32.h"
#pragma comment(lib, "hde32.lib")
UCHAR OriFuncHead[12]={0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90};//假设目标函数头部有12个字节
UCHAR NewFuncHead[5]={0xE9,0x00,0x00,0x00,0x00};//jmp [相对偏移] 的字节码——奇妙的地方
ULONG ulHeadLen=0;
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath){
KdPrint(("[TrueCell] Driver Entry!\r\n"));
DriverObject->DriverUnload=TrueCellUnload;
return HookFunc(TRUE)?STATUS_SUCCESS:STATUS_UNSUCCESSFUL;
}
VOID TrueCellUnload(IN PDRIVER_OBJECT DriverObject){
HookFunc(FALSE);
KdPrint(("[TrueCell] Driver Unload!\r\n"));
}
_declspec(naked) NTSTATUS
GoNtCreateSection(OUT PHANDLE SectionHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PLARGE_INTEGER SectionSize OPTIONAL,
IN ULONG Protect,
IN ULONG Attributes,
IN HANDLE FileHandle){//跳板
_asm{
nop;// \
nop;// |
nop;// |
nop;// |
nop;// |
nop;// |
nop;// >开辟足够大的空间来容纳NtCreateSection开头的ulHeadlen个字节的机器码
nop;// |
nop;// |
nop;// |
nop;// |
nop;// /
mov eax,NtCreateSection;
add eax,ulHeadLen;
jmp eax
}
}
NTSTATUS
DetourNtCreateSection(OUT PHANDLE SectionHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PLARGE_INTEGER SectionSize OPTIONAL,
IN ULONG Protect,
IN ULONG Attributes,
IN HANDLE FileHandle){//代理函数
PFILE_OBJECT FileObject;
POBJECT_NAME_INFORMATION wcFilePath;
//由Protect判断当前Section是否可执行:一般将要执行的DLL和EXE的都是Section可执行的
if (Protect & (PAGE_EXECUTE|PAGE_EXECUTE_READ|PAGE_EXECUTE_READWRITE|PAGE_EXECUTE_WRITECOPY) ){
//获取FileHandle对应的FILE_OBJEC——其有我们感兴趣的成员和作用
if (NT_SUCCESS(ObReferenceObjectByHandle(FileHandle,0,NULL,KernelMode,&FileObject,NULL))){//获取文件对象
//获取FileObject对应的文件全路径
if (IoQueryFileDosDeviceName(FileObject,&wcFilePath)==STATUS_SUCCESS){//获取文件对象所对应的文件Dos设备名称,即是全路径
DbgPrint("[TrueCell] %ws\r\n",wcFilePath->Name.Buffer);
ExFreePool(wcFilePath);//IoQueryFileDosDeviceName获取的OBJECT_NAME_INFORMATION 需要手动释放
}
ObDereferenceObject(FileObject);//放弃对FileObject的引用
}
}
//“返回”到真正的“跳板”处,完成Hook过程
return GoNtCreateSection(SectionHandle,DesiredAccess,ObjectAttributes,SectionSize,Protect,Attributes,FileHandle);
}
BOOLEAN HookFunc(BOOLEAN IsHook){
ULONG Offset;
KIRQL Irql;
ULONG CR0Value;
hde32s hs;
PUCHAR code_pos;
if (IsHook==FALSE && ulHeadLen==0){
return FALSE;
}
KdPrint(("[TrueCell] %s\r\n",IsHook?"Hook":"UnHook"));
Irql=KeRaiseIrqlToDpcLevel();
if (IsHook){
Offset=(ULONG)DetourNtCreateSection-(ULONG)NtCreateSection-5;
RtlCopyMemory(NewFuncHead+1,(PUCHAR)&Offset,4);
code_pos=(PUCHAR )NtCreateSection;
while (ulHeadLen<5){//利用反汇编引擎HDE,解析目标函数位置头部能容纳Hook跳转指令所需空间的大小
RtlZeroMemory(&hs,sizeof(hs));
ulHeadLen+=hde32_disasm(code_pos,&hs);
code_pos+=ulHeadLen;
}
RtlCopyMemory(OriFuncHead,(PUCHAR)NtCreateSection,ulHeadLen);
RtlCopyMemory(GoNtCreateSection,(PUCHAR)NtCreateSection,ulHeadLen);//将目标函数位置头部的指令复制到踏板函数体内
}
_asm{//关闭写保护
cli;
push eax;
mov eax,cr0;
mov CR0Value,eax;
and eax,0xfffeffff;
mov cr0,eax;
pop eax;
}
if (IsHook){
RtlMoveMemory((PUCHAR)NtCreateSection,NewFuncHead,5);
}else{
RtlMoveMemory((PUCHAR)NtCreateSection,OriFuncHead,ulHeadLen);
}
_asm{//重启写保护
push eax;
mov eax,CR0Value;
mov cr0,eax;
pop eax;
sti;
}
KeLowerIrql(Irql);
return TRUE;
}
转载于:https://www.cnblogs.com/vcerror/p/4289158.html
HOOK NtCreateSection相关推荐
- 内核编程之SSDTHook(3)Hook NtCreateSection监控所有可执行模块加载
本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/d ...
- 阻止反外挂GPK/sys加载思路
思路建议: sys 驱动加载之前,要 CreateService ,试试拦截这个api?或者更底层? 不重启的话,Hook ZwLoadDriver,ZwSetSysteminformation基本就 ...
- 内核级HOOK的几种实现与应用
实现内核级 HOOK 对于拦截.分析.跟踪系统内核起着致关重要的作用.实现的方法不同意味着应用侧重点的不同.如想要拦截 NATIVE API 那么可能常用的就是 HOOK SERVICE TABLE ...
- 也谈SSDT Hook(二)
一.实战篇 本不想摘代码,既然实战,就不多讲废话了,还是贴上吧,谁都有违背原则的时候:). 代码一:经典案例,替换NtQuerySystemInformation,列取所有查询到的进程名,我使用修改C ...
- 分析了一下360安全卫士的HOOK
by: achillis 分析了一下360的HOOK,通过直接hook KiFastCallEntry实现对所有系统调用的过滤. 我分析的版本如下: 主程序版本: 6.0.1.1003 HookPor ...
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 在React Hook里使用history.push跳转
在React Hook里使用history.push跳转 react hook里用不了this.props.history的解决方法 首先引入 import { useHistory } from ' ...
- 在react hook里使用mobx(配置mobx依赖)
在powershell里安装依赖 (直接npm i mobx或者npm i mobx-react是会报错的) npm i mobx mobx-react --save save是下载到"de ...
- HDU-1698-Just a Hook
HDU-1698-Just a Hook http://acm.hdu.edu.cn/showproblem.php?pid=1698 还是成段更新线段树 #include<stdio.h> ...
- 一套使用注入和Hook技术托管入口函数的方案
工作中,我们可能会经常使用开源项目解决一些领域中的问题.这种"拿来主义"是一种"专业人干专业事"的思想,非常实用.(转载请指明出于breaksoftware的c ...
最新文章
- python中的列表生成式_Python中的列表生成式
- 图解 wp WordPress 文章 链接 在新窗口打开
- 变更AD计算机名称和IP地址
- SpringBoot+MyBatis+Shiro 搭建杂谈
- CSS------给字体添加边框时,边框大小无法改变问题
- java jai create 方法_使用JAI扩展Java Image的功能
- c# 保存和打开文件的方法
- 图像拼图:HTML游戏
- VC下ctreectrl的使用方法及节点前图标添加方法
- python 容器类型存放_Python学习笔记三(容器)
- freeswith 录制 MP4格式视频
- Unix网络编程第一卷学习总结
- Java动态数组ArrayList
- 推荐一款STM32F030K6T6兼容替换灵动MM32F031K6T6
- 在家做什么可以赚钱?适合在家的5个小项目!
- 牛客SQL练习-39-针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005, 使用强制索引
- 教资计算机报高中害死初中,教师资格证报名入口必须电脑登录吗_中小学教师资格考试网...
- Oracle提高命中率及优化
- Ubuntu配置Hadoop——(七)安装配置Spark
- php玩偶,玩偶娃衣 织法教程|毛衣花样图解|视频教程-编织人生
热门文章
- android内存泄露问题分析,内存泄露实例分析 -- Android内存优化第四弹
- python import as 实例化_python中import list,dictionary常量在class实例化时遇到的坑
- myeclipse导入项目中文乱码_建立一个可烧录的空项目
- MFC 多字节和UNICODE的相互转换(解决中文utf8-ASCNII乱码问题)
- 专访 | 阿里前辈李智慧:如何培养架构思维,我把20年的架构经讲给你听
- ArcCatalog连接ArcSDE连接报:unable to create new database connection file,permission is denied
- Ubuntu编写第一个Python程序
- 在iOS中获取UIView的所有层级结构 相关
- JS中showModalDialog (模态窗口)详细使用
- 什么是Code Review