关于hook ntdll 代码详解

news2024/11/24 9:05:46

UNHOOK ntdll

DWORD unhook() {
	//创建该结构体用于获取该dll的信息 将所有成员变量初始化为零
	MODULEINFO mi = {};
	//获取当前内存的ntdll的句柄
	HMODULE ntdllModule = GetModuleHandleA("ntdll.dll");
	//HANDLE(-1)表示获取当前进程的句柄 该函数用于获取该进程的信息
	GetModuleInformation(HANDLE(-1), ntdllModule, &mi, sizeof(mi));
	//获取该ntdll的基地址
	LPVOID ntdllBase = (LPVOID)mi.lpBaseOfDll;
	//调用CreateFileA打开新的一个ntdll
	HANDLE ntdllFile = CreateFileA("c:\\windows\\system32\\ntdll.dll", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
	//将该新的ntdll映射到内存中 但是还没有映射到当前进程中
	HANDLE ntdllMapping = CreateFileMapping(ntdllFile, NULL, PAGE_READONLY | SEC_IMAGE, 0, 0, NULL);
	//MapViewOfFile将文件映射的视图映射到调用进程的地址空间中 也就是当前的进程
	LPVOID ntdllMappingAddress = MapViewOfFile(ntdllMapping, FILE_MAP_READ, 0, 0, 0);

	//获取该ntdll的PE结构的DOS头 (旧的)
	PIMAGE_DOS_HEADER hookedDosHeader = (PIMAGE_DOS_HEADER)ntdllBase;
	PIMAGE_NT_HEADERS hookedNtHeader = (PIMAGE_NT_HEADERS)((DWORD_PTR)ntdllBase + hookedDosHeader->e_lfanew);

	for (WORD i = 0; i < hookedNtHeader->FileHeader.NumberOfSections; i++) {
		//每个节的头是固定大小且是连续的。一个节头挨着一个节头的比如rdata的节头完了之后就是紧挨着data节头的。IMAGE_SIZEOF_SECTION_HEADER确实是40字节
		PIMAGE_SECTION_HEADER hookedSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD_PTR)IMAGE_FIRST_SECTION(hookedNtHeader) + ((DWORD_PTR)IMAGE_SIZEOF_SECTION_HEADER * i));
		//获取节的头之后判断name是不是等于text,因为要覆盖的是text的内容 hookedSectionHeader->Name获取的是字节不是char 因此要转为char strcmp要求是char *
		if (!strcmp((char*)hookedSectionHeader->Name, (char*)".text")) {
			DWORD oldProtection = 0;
			//VirtualProtect修改旧的 ntdll的保护属性为可读可写可执行(PAGE_EXECUTE_READWRITE),并且将原来的保护属性保存在oldProtection中 以下仅仅支持.text节的 
			bool isProtected = VirtualProtect((LPVOID)((DWORD_PTR)ntdllBase + (DWORD_PTR)hookedSectionHeader->VirtualAddress), hookedSectionHeader->Misc.VirtualSize, PAGE_EXECUTE_READWRITE, &oldProtection);
			//两个dll由于第一个节是空的在内存中,而text节又是第二个节,因此VirtualAddress是一样的 这样就将旧ntdll中test节的内容覆盖成了新的
			memcpy((LPVOID)((DWORD_PTR)ntdllBase + (DWORD_PTR)hookedSectionHeader->VirtualAddress), (LPVOID)((DWORD_PTR)ntdllMappingAddress + (DWORD_PTR)hookedSectionHeader->VirtualAddress), hookedSectionHeader->Misc.VirtualSize);
			//还原保护属性
			isProtected = VirtualProtect((LPVOID)((DWORD_PTR)ntdllBase + (DWORD_PTR)hookedSectionHeader->VirtualAddress), hookedSectionHeader->Misc.VirtualSize, oldProtection, &oldProtection);
		}
	}

	CloseHandle(ntdllFile);
	CloseHandle(ntdllMapping);
	FreeLibrary(ntdllModule);

	return 0;
}

关于代码中的IMAGE_SIZEOF_SECTION_HEADER

节的头是连续的 每个节的头的大小 即IMAGE_SIZEOF_SECTION_HEADER都等于40

找一个dll看看 确实节的头是连续 也确实大小是 5*8=40字节

节头存放的是节的各种信息包括 节的名称、虚拟地址、大小等但是 不是存放的具体内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1546061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据开发扩展shell--尚硅谷shell笔记

大数据开发扩展shell 学习目标 1 熟悉shell脚本的原理和使用 2 熟悉shell的编程语法 第一节 Shell概述 1&#xff09;Linux提供的Shell解析器有&#xff1a; 查看系统中可用的 shell [atguiguhadoop101 ~]$ cat /etc/shells /bin/sh/bin/bash/sbin/nologin/bin/dash/bin/t…

约数个数(数论,蓝桥杯)

题目描述&#xff1a; 给定一个数n&#xff0c;再给出n个数&#xff0c;现在要求你求出这些数的乘积的约数个数总和&#xff0c;结果对1e97取模。 取值范围&#xff1a;1<n<100; 1<ni<2e9; 分析步骤&#xff1a; 第一&#xff1a;要求约数的个数&#xff0c;我们有…

Web举例:防火墙二层,上下行连接交换机的主备备份组网

Web举例&#xff1a;防火墙二层&#xff0c;上下行连接交换机的主备备份组网 介绍了业务接口工作在二层&#xff0c;上下行连接交换机的主备备份组网的Web举例。 组网需求 如图1所示&#xff0c;两台FW的业务接口都工作在二层&#xff0c;上下行分别连接交换机。FW的上下行业…

C++运算符重载中的引用返回

文章目录 引言原因1.为了支持链式调用2.避免不必要的对象创建和复制3.保持语义一致性 引言 在C编程语言中&#xff0c;运算符重载是一项强大的特性&#xff0c;它允许程序员为自定义类型重新定义或重载已有的运算符&#xff0c;从而使得这些类型能够像内置类型一样使用运算符。…

面试八股——redis——集群

0. redis集群的方案 1.主从复制&#xff08;高并发读&#xff09; 一个主节点负责写操作&#xff08;增删改&#xff09;&#xff0c;多个从节点负责查操作。 主从复制是让主节点修改数据之后&#xff0c;将对应数据同步到从节点中。 2.哨兵模式&#xff08;实现高可用&#x…

前端发版上线出现白屏问题

目录 路由配置问题资源缓存问题首屏加载过慢 &#xff1a;喂&#xff0c;你的页面白啦&#xff01; 出现上线白屏的问题有很多&#xff0c;如&#xff1a;配置错误、缓存问题、浏览器兼容问题&#xff0c;根据不同情况去解决。 路由配置问题 问题描述&#xff1a; 在vue开发…

[免费]通义灵码做活动,送礼品,快来薅羊毛!!!

你的编辑器装上智能ai编辑了吗&#xff0c;的确挺好用的。 最近阿里云AI编码搞活动&#xff0c;可以免费体验并且还可以抽盲盒。有日历、马克杯、代金券、等等其他数码产品。 大多数都是日历。 点击链接参与「通义灵码 体验 AI 编码&#xff0c;开 AI 盲盒」 https://develope…

Tableau项目案例-网上超市运营分析

一、数据简要介绍 超市运营分析.xlsx 1、客户分析 交易次数统计 购买次数即购买频率,是指消费者在一定时期内购买某种或某类商品的次数。 用tableau打开excel文件 双击城市字段,会显出出一个地图 类别字段也拖到筛选器上,如上操作相同

深入理解TCP/IP协议:网络通信的基石

提示&#xff1a;本系列文章重点学习TCP/IP协议 深入理解TCP/IP协议&#xff1a;网络通信的基石 简介一、TCP/IP协议的基本原理二、TCP/IP协议的工作机制三、TCP面向连接建立连接&#xff1a;断开连接&#xff1a; 四、分层传输五、TCP流量控制滑动窗口机制流量控制的工作流程优…

Pandoc下载和安装笔记

目录 一、下载 二、安装 1、安装软件 2、测试是否安装成功 Pandoc 的作者是 John MacFarlane&#xff0c;John MacFarlane是美国加州大学伯克利分校的哲学系的一位教授。编写Pandoc 用来生成讲义、课件和网站等。程序开源免费&#xff0c;目前以 GPL 协议托管在 Github 网站…

基于SpringBoot+MyBatis+Vue的电商智慧仓储管理系统的设计与实现(源码+LW+部署+讲解)

前言 博主简介&#x1f468;&#x1f3fc;‍⚕️&#xff1a;国内某一线互联网公司全栈工程师&#x1f468;&#x1f3fc;‍&#x1f4bb;&#xff0c;业余自媒体创作者&#x1f4bb;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f4d5;&#x…

AI高效生成图片,借助参考图,激发无限创意!

在数字化艺术的浪潮中&#xff0c;AI图片生成技术以其高效、便捷的特点&#xff0c;正成为创意领域的新宠。而在这其中&#xff0c;参考图的重要性不言而喻。一张精心挑选的参考图&#xff0c;能够激发AI的创造力&#xff0c;为你呈现出令人惊艳的图片作品。 首先&#xff0c;…

三菱FX系列PLC单键启停程序示例(2种方法)

三菱FX系列PLC单键启停程序示例(2种方法) 前面和大家分享了西门子S7-200SMART PLC中实现单按钮启停的具体方法,可以参考以下链接中的内容: S7-200SMART 中如何实现单按钮启停功能(两种方法)? 本次和大家分享在三菱FX3系列PLC中实现单键启停的具体方法: 如下图所示,第…

探寻UUID的起源与奥秘:从时间戳到唯一标识

title: 探寻UUID的起源与奥秘&#xff1a;从时间戳到唯一标识 date: 2024/3/26 17:06:45 updated: 2024/3/26 17:06:45 tags: UUID起源全局唯一性时间戳原理UUID/GUID区别对比SnowflakePython&JS实例分布式系统应用 1. UUID起源与原理 UUID&#xff08;Universally Uniqu…

制作小程序需要多少钱?成本分析与效益预测

在当今数字化时代&#xff0c;微信小程序已成为企业和个人拓展业务的重要工具。然而&#xff0c;许多人在考虑进入这一领域时&#xff0c;都会面临一个关键问题&#xff1a;制作一个小程序需要多少钱&#xff1f;下面和你一起探讨小程序开发的成本因素&#xff0c;帮助你更好地…

【Spring】Spring框架中的一个核心接口ApplicationContext 简介,以及入口 Run() 的源码分析

一、简介 ApplicationContext 是Spring框架中的一个核心接口&#xff0c;它是Spring IoC容器的实现之一&#xff0c;用于管理和组织应用程序中的各种Bean&#xff0c;同时提供了一系列功能来支持依赖注入、AOP等特性。 简单来说&#xff0c;ApplicationContext 是一个大型的、…

ESCTF-OSINT赛题WP

这你做不出来?check ESCTF{湖北大学_嘉会园食堂} 这个识图可以发现是 淡水渔人码头 但是 osint 你要发现所有信息 聊天记录说国外 同时 提示给了美国 你综合搜索 美国 渔人码头 在美国旧金山的渔人码头&#xff08;英语&#xff1a;Fisherman’s Wharf&#xff09;是一个著名旅…

canvas跟随鼠标画有透明度的矩形边框

提示&#xff1a;canvas跟随鼠标画有透明度的矩形边框 文章目录 前言一、跟随鼠标画有透明度的矩形边框总结 前言 一、跟随鼠标画有透明度的矩形边框 test.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

文件包含漏洞及防御

一&#xff0c;什么是文件包含漏洞 文件包含包括&#xff1a; 内容包含函数包含 优点&#xff1a;减少代码量&#xff1b;易于维护&#xff1b; 出现的问题&#xff1a; 可能会导致允许访问敏感文件或者执行恶意代 码&#xff0c;造成漏洞&#xff1b;这就被称为文件包含漏…

OceanBase实践分享:如何用ODC进行历史数据归档,提升性能

作者&#xff1a;洪波&#xff0c;数据库爱好者 最新版 V4.2.2 已上线&#xff0c;其新增的数据生命周期管理功能颇具吸引力。据官方资料显示&#xff0c;ODC现支持将源数据库中的表数据&#xff0c;无论是单次还是周期性地&#xff0c;归档至其它目标数据库。这一设计旨在解决…