如何建立内核级钩子控制操作系统实现程序隐身
typedef struct _MDL {struct _MDL *Next;CSHORT Size;CSHORT MdlFlags;struct _EPROCESS *Process;PVOID MappedSystemVa;PVOID StartVa;ULONG ByteCount;ULONG ByteOffset; } MDL, *PMDL; #define MDL_MAPPED_TO_SYSTEM_VA 0x0001 #define MDL_PAGES_LOCKED 0x0002 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004 #define MDL_ALLOCATED_FIXED_SIZE 0x0008 #define MDL_PARTIAL 0x0010 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020 #define MDL_IO_PAGE_READ 0x0040 #define MDL_WRITE_OPERATION 0x0080 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100 #define MDL_FREE_EXTRA_PTES 0x0200 #define MDL_IO_SPACE 0x0800 #define MDL_NETWORK_HEADER 0x1000 #define MDL_MAPPING_CAN_FAIL 0x2000 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000 #define MDL_MAPPING_FLAGS (MDL_MAPPED_TO_SYSTEM_VA | \MDL_PAGES_LOCKED | \MDL_SOURCE_IS_NONPAGED_POOL | \MDL_PARTIAL_HAS_BEEN_MAPPED | \MDL_PARENT_MAPPED_SYSTEM_VA | \MDL_SYSTEM_VA | \MDL_IO_SPACE ) |
#pragma pack(1) typedef struct ServiceDescriptorEntry {unsigned int *ServiceTableBase;unsigned int *ServiceCounterTableBase;unsigned int NumberOfServices;unsigned char *ParamTableBase; } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t; #pragma pack() __declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable; PVOID* NewSystemCallTable; PMDL pMyMDL = MmCreateMdl( NULL,KeServiceDescriptorTable.ServiceTableBase,KeServiceDescriptorTable.NumberOfServices * 4 ); MmBuildMdlForNonPagedPool( pMyMDL ); pMyMDL->MdlFlags = pMyMDL->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA; NewSystemCallTable = MmMapLockedPages( pMyMDL, KernelMode ); |
图1 系统调用表示意图 |
#define HOOK_INDEX(function2hook) *(PULONG)((PUCHAR)function2hook+1) #define HOOK(functionName, newPointer2Function, oldPointer2Function ) \oldPointer2Function = (PVOID) InterlockedExchange( (PLONG) &NewSystemCallTable[HOOK_INDEX(functionName)], (LONG) newPointer2Function) #define UNHOOK(functionName, oldPointer2Function) \InterlockedExchange( (PLONG) &NewSystemCallTable[HOOK_INDEX(functionName)], (LONG) oldPointer2Function) |
图2 系统调用表拦截技术示意图 |
NTSYSAPI NTSTATUS NTAPI ZwMapViewOfSection(IN HANDLE SectionHandle,IN HANDLE ProcessHandle,IN OUT PVOID *BaseAddress,IN ULONG ZeroBits,IN ULONG CommitSize,IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,IN OUT PSIZE_T ViewSize,IN SECTION_INHERIT InheritDisposition,IN ULONG AllocationType,IN ULONG Protect ); |
typedef NTSTATUS (*ZWMAPVIEWOFSECTION)(IN HANDLE SectionHandle,IN HANDLE ProcessHandle,IN OUT PVOID *BaseAddress,IN ULONG ZeroBits,IN ULONG CommitSize,IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,IN OUT PSIZE_T ViewSize,IN SECTION_INHERIT InheritDisposition,IN ULONG AllocationType,IN ULONG Protect ); ZWMAPVIEWOFSECTION OldZwMapViewOfSection; |
NTSTATUS NewZwMapViewOfSection(IN HANDLE SectionHandle,IN HANDLE ProcessHandle,IN OUT PVOID *BaseAddress,IN ULONG ZeroBits,IN ULONG CommitSize,IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,IN OUT PSIZE_T ViewSize,IN SECTION_INHERIT InheritDisposition,IN ULONG AllocationType,IN ULONG Protect ) {NTSTATUS status;DbgPrint("comint32: NewZwMapViewOfSection called.");//我们可以对输入为所欲为,既可以马上返回,也可以继续执行原函数status = OldZwMapViewOfSection(SectionHandle,ProcessHandle,BaseAddress,ZeroBits,CommitSize,SectionOffset OPTIONAL,ViewSize,InheritDisposition,AllocationType,Protect );// 我们可以在此对输出为所欲为,想返回什么,就返回什么return status; } |
HOOK( ZwMapViewOfSection, NewZwMapViewOfSection, OldZwMapViewOfSection ); |
转载于:https://blog.51cto.com/security/77964
如何建立内核级钩子控制操作系统实现程序隐身相关推荐
- 【梅哥的Ring0湿润插入教程】重磅第三课:Ring0下的PE Loader及重加载内核秒杀一切内核级钩子(上篇)...
[梅哥的Ring0湿润插入教程] Email:mlkui@163.com 转载请注明出处,谢绝喷子记者等,如引起各类不适请自觉滚J8蛋! 第三课:Ring0下PE Loader及重加载内核绕过一切内核 ...
- 操作系统--用户级线程和内核级线程
在多线程操作系统中,各个系统的实现方式并不相同.在有的系统中实现了用户级线程,有的系统中实现了内核级线程 1.内核级线程: (1)线程的创建.撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调 ...
- 哈工大李治军老师操作系统笔记【10】:内核级线程实现(Learning OS Concepts By Coding Them !)
文章目录 0 回顾 1 实现 1.1 int 0x80 fork(中断入口) 1.2 进入核心态 1.3 system_call(中断切换中间三段) 1.4 中断出口 1.3 switch_to 1. ...
- 操作系统--用户级线程与内核级线程
一.多进程是操作系统基本图像 进程都是在内核进行 二.用户级线程 2.1线程引入 可以切指令不切表,也就是资源不动,指令执行分开,更加轻量化,从而提高效率,保留并发优点,避免进程切换代价,也就引入了线 ...
- linux内核网络钩子函数使用,Linux内核IOCTL网络控制框架实现实例分析
4.6.inet_ioctl函数 由于inet_ioctl函数内容分支很多,但功能.处理不难理解,所以我把一些不常见的内容都省去,挑简单重要的说,完全在于抛砖引玉: static int inet_i ...
- 操作系统(李治军) L12内核级线程的实现
只有支持了进程才可以管理CPU 图:五段论 整个过程:从用户栈->内核栈->TCB->TCB完成切换(TCB用switch_to完成TCB的切换完成内核栈的切换)->内核栈切换 ...
- 哈工大操作系统学习笔记五——内核级线程实现
哈工大os学习笔记五(内核级线程实现) 文章目录 哈工大os学习笔记五(内核级线程实现) 一. 中断入口.中断出口(前后两段) 1. 从int中断进入内核(中断入口第一段) 2.中断出口(最后一段) ...
- 操作系统——用户级线程和内核级线程(L10,L11,L12)
用户级线程: 不同的进程的映射表不同,当一个进程中断了,我们需要切换到另外一个线程,就需要我们切换指令执行序列,切换与设备等各种资源,这样的效率是很低的 线程保留了并发的特点,又避免了进程切换的代价. ...
- OS / 线程的 3 种实现方式(内核级,用户级 和 混合型)
1 .线程的 3 种实现方式 在传统的操作系统中,拥有资源和独立调度的基本单位都是进程.在引入线程的操作系统中,线程是独立调度的基本单位,进程是资源拥有的基本单位.在同一进程中,线程的切换不会引起进程 ...
最新文章
- 资料分享:送你一本《数据结构(C语言版)》电子书!
- CentOS 7.1云服务器 配置FTP服务器vsftpd
- VS2010 连接SQLSERVER数据库步骤
- 枚举遍历法,你能循环遍历所有的枚举值吗?
- 学习笔记(43):Python实战编程-事件处理简介
- H3C交换机设置DHCP中继,配合Linux 服务器为多VLAN提供DHCP地址分配服务
- c++读取excel_Java 嵌入 SPL 轻松实现 Excel 文件合并
- Netty学习总结(4)——图解Netty之Pipeline、channel、Context之间的数据流向
- 青年会会训的一些探究
- 最后2天,BDTC 2019早鸟票即将售罄,超强阵容及议题抢先曝光!
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_17-CMS前端工程创建-单页面应用介绍...
- 信息系统项目管理师考试大纲(第2版)
- mysql 查询父子关系_递归查询具有父子关系的表
- 从模型制作(3dmax)到网页显示(babylonjs)全过程介绍
- 记一道面试算法题: 某学校需要一个能给学领前儿童自动出三个数加减法的算术题的程序(此处省略一万个字)
- 机器人视觉硬件方案设计对比
- element上传图片的时候额外参数
- 结婚仪式的过程(供朋友们参考)
- 80核处理器_最受欢迎的处理器 酷睿i5-9400F果然霸榜了
- 识别不了移动硬盘的解决方法
热门文章
- linux 快组描述符,Linux 进程描述符 task struct
- 暗棋单机版_中国暗棋游戏下载-中国暗棋下载v1.0.0 安卓版-单机手游网
- python 操作excel神器_【转】多图+代码 | 详解Python操作Excel神器openpyxl的各种操作!...
- rvest | 网络爬虫初步——使用CSS选择器
- 继续教育自动听课软件_绵阳继续教育 自动挂机学习软件 v2019.5.31
- 分支限界算法c语言_算法学习计划
- jmeter 登录用户并发压力测试案例_测试模型构建及场景用例设计
- 职业高中计算机网络试讲稿,《初识我的电脑》试讲稿+答辩
- 一个漂亮的Bootstrap查找查询框,带下拉选择按钮
- 注册表把html设置成桌面,[注册表] 将Windows 10默认应用程序设置页面添加到桌面右键菜单中...