内核上项目【通信】

文章目录

  • 目的
  • 操作步骤
  • 逆向分析
  • 实现代码
  • 参考文献

目的

在Win7 64位系统上编写驱动利用ExRegisterAttributeInformationCallback注册回调进行通信

操作步骤

1.利用MmGetSystemRoutineAddress获取ExRegisterAttributeInformationCallback中ExpDisSetAttributeInformation、ExpDisQueryAttributeInformation全局变量位置,并将其置为0,以实现执行到注册的目标回调函数
2.三环部分利用NtQueryInformationFile进行通信,最后一项的FileInformationClass成员置为0x34以实现调用到0环注册的回调函数
3.在卸载驱动时将其原先保存的ExpDisQueryAttributeInformation、ExpDisSetAttributeInformation进行恢复,否则将蓝屏

逆向分析

箭头所标记位置进行判断全局变量ExpDisSetAttributeInformation、ExpDisQueryAttributeInformation是否为空,如果不为空就不进行注册,所以需要在操作步骤一中将其进行置0
在这里插入图片描述对ExpDisQueryAttributeInformation进行交叉引用发现其最终会通过NtQueryInformationFile进行调用
在这里插入图片描述NtQueryInformationFile中会判断成员FileInformationClass是否为0x34,如果不为0x34则不进行调用ExQueryAttributeInformation
在这里插入图片描述

实现代码

Win7_Comm.h(通信头文件)

#pragma once
#include<ntifs.h>
typedef struct _CommPackage
{ULONG64 Id;ULONG64 cmd;ULONG64 Data;ULONG64 Size;ULONG64 retStatus;
}CommPackage, * PCommPackage;typedef NTSTATUS(*CommCallbackProc)(PCommPackage package);
typedef NTSTATUS(*FileCallBack)(HANDLE FileHandle, PVOID info);
typedef struct _RegisterCallback
{FileCallBack QueryFileCallback;FileCallBack SetFileCallBack;}RegisterCallback, * PRegisterCallback;
typedef NTSTATUS(*ExRegisterAttributeInformationCallbackProc)(PRegisterCallback callbacks);NTSTATUS CommWin7(CommCallbackProc callback);VOID UnRegisterCommWin7();VOID UnRegisterCommWin10();VOID UnRegisterComm();NTSTATUS SetFileCallBack(HANDLE FileHandle, PVOID info);NTSTATUS QueryFileCallBack(HANDLE FileHandle, PVOID info);

Win7_Comm.c (通信实现代码)

#include"Win7_comm.h"FileCallBack oldExpDisQueryAttributeInformationFunc = 0;
FileCallBack oldExpDisSetAttributeInformationFunc = 0;
CommCallbackProc gCommCallback = NULL;
PULONG64 gWin7CallbackVar = 0;NTSTATUS QueryFileCallBack(HANDLE FileHandle, PVOID info)
{KdPrintEx((77, 0, "QueryFileCallBack\r\n"));if (MmIsAddressValid(info)){PCommPackage package = (PCommPackage)info;if (package->Id == 0x12345678){package->retStatus = gCommCallback(package);}else{if (oldExpDisQueryAttributeInformationFunc){return oldExpDisQueryAttributeInformationFunc(FileHandle, info);}}}return STATUS_SUCCESS;
}NTSTATUS SetFileCallBack(HANDLE FileHandle, PVOID info)
{KdPrintEx((77, 0, "SetFileCallBack\r\n"));if (MmIsAddressValid(info)){PCommPackage package = (PCommPackage)info;if (package->Id == 0x12345678){package->retStatus = gCommCallback(package);}else{if (oldExpDisSetAttributeInformationFunc){return oldExpDisSetAttributeInformationFunc(FileHandle, info);}}}return STATUS_SUCCESS;
}NTSTATUS CommWin7(CommCallbackProc callback)
{UNICODE_STRING unName = { 0 };RtlInitUnicodeString(&unName, L"ExRegisterAttributeInformationCallback");ExRegisterAttributeInformationCallbackProc pFunc = MmGetSystemRoutineAddress(&unName);DbgBreakPoint();//寻找系统初始化的ExpDisQueryAttributeInformation与ExpDisSetAttributeInformationULONG64 offset = *(PULONG)((ULONG64)pFunc + 0xD + 3);PULONG64 ExpDisQueryAttributeInformation = (offset + 0x14 + (ULONG64)pFunc);oldExpDisQueryAttributeInformationFunc = (FileCallBack)ExpDisQueryAttributeInformation[0];oldExpDisSetAttributeInformationFunc = (FileCallBack)ExpDisQueryAttributeInformation[1];ExpDisQueryAttributeInformation[0] = 0;ExpDisQueryAttributeInformation[1] = 0;RegisterCallback rcb = { 0 };rcb.SetFileCallBack = SetFileCallBack;rcb.QueryFileCallback = QueryFileCallBack;NTSTATUS state = pFunc(&rcb);if (NT_SUCCESS(state)){gWin7CallbackVar = ExpDisQueryAttributeInformation;gCommCallback = callback;}return state;
}VOID UnRegisterCommWin7()
{if (gWin7CallbackVar){gWin7CallbackVar[0] = oldExpDisQueryAttributeInformationFunc;gWin7CallbackVar[1] = oldExpDisSetAttributeInformationFunc;}
}VOID UnRegisterComm()
{RTL_OSVERSIONINFOEXW version = { 0 };RtlGetVersion(&version);if (version.dwBuildNumber == 7600 || version.dwBuildNumber == 7601){UnRegisterCommWin7();return;}
}

DriverMain.c (驱动主函数)

#include<ntifs.h>
#include"Win7_comm.h"VOID DriverUnload(_In_ struct _DRIVER_OBJECT* DriverObject)
{DbgPrint("--------------DRIVER_UNLOAD-----------------");UnRegisterComm();
}NTSTATUS NTAPI DispatchComm(PCommPackage package)
{DbgPrintEx(77, 0, "[db]:%llx,%llx\r\n", package->Id, package->cmd);
}NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{NTSTATUS state = CommWin7(DispatchComm);pDriverObject->DriverUnload = DriverUnload;return STATUS_SUCCESS;
}

通信三环程序.cpp (三环通信程序)

#include <stdio.h>
#include<windows.h>typedef struct _IO_STATUS_BLOCK {union {ULONG Status;PVOID Pointer;};ULONG_PTR Information;
} IO_STATUS_BLOCK, * PIO_STATUS_BLOCK;typedef struct _CommPackage
{ULONG64 Id; ULONG64 cmd;ULONG64 Data;ULONG64 Size;ULONG64 retStatus;
}CommPackage, * PCommPackage;typedef ULONG(WINAPI* NtQueryInformationFileProc)(__in HANDLE FileHandle,__out PIO_STATUS_BLOCK IoStatusBlock,__out_bcount(Length) PVOID FileInformation,__in ULONG Length,__in ULONG FileInformationClass);int main()
{char a[] = "123";PUCHAR b = (PUCHAR)a;NtQueryInformationFileProc NtQueryInformationFile = (NtQueryInformationFileProc)GetProcAddress(GetModuleHandleA("ntdll"),"NtQueryInformationFile");if (NtQueryInformationFile == NULL){printf("NtQueryInformationFile获取失败!\n");system("pause");return 0;}IO_STATUS_BLOCK is = { 0 };char buf[0xFF] = { 0 };PCommPackage package = (PCommPackage)buf;package->Id = 0x12345678;package->cmd = 1;HANDLE handle = CreateFileA("C:\\1.txt", FILE_ALL_ACCESS, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);system("pause");NtQueryInformationFile(handle, &is, buf, sizeof(buf), 0x34);CloseHandle(handle);system("pause");
}

参考文献

某超级注入程序的驱动逆向
火哥内核视频

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

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

相关文章

接口自动化多层嵌套json数据处理代码实例

最近在做接口自动化测试&#xff0c;响应的内容大多数是多层嵌套的json数据&#xff0c;在对响应数据进行校验的时候&#xff0c;可以通过&#xff08;key1.key2.key3&#xff09;形式获取嵌套字典值的方法获取响应值&#xff0c;再和预期值比较 1 2 3 4 5 6 7 8 9 10 11 12 13…

Enabling Application Engine Tracing 启用应用程序引擎跟踪

Enabling Application Engine Tracing 启用应用程序引擎跟踪 By default, all Application Engine traces are turned off. To see a trace or a combination of traces, set trace options before you run a program. 默认情况下&#xff0c;所有应用程序引擎跟踪都处于关闭…

自动化测试基础知识:什么是自动化测试?需要学习哪些知识与工具!

1、自动化测试概念 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c; 在设计了测试用例并通过评审之后&#xff0c;由测 试人员根据测试用例中描述的规程一步步执行测试&#xff0c;得到实际结果与期望结果的比较。简言之&#xff0c;自动化测试…

12.12 作业

1&#xff0c; 源代码&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);speerornew QTextToSpeech(this);idstartTimer(1000);//每隔一秒&#xf…

LLM之RAG理论(一)| CoN:腾讯提出笔记链(CHAIN-OF-NOTE)来提高检索增强模型(RAG)的透明度

论文地址&#xff1a;https://arxiv.org/pdf/2311.09210.pdf 检索增强语言模型&#xff08;RALM&#xff09;已成为自然语言处理中一种强大的新范式。通过将大型预训练语言模型与外部知识检索相结合&#xff0c;RALM可以减少事实错误和幻觉&#xff0c;同时注入最新知识。然而&…

【无标题】重生奇迹mu召唤萤石魂石最强搭配

荧光宝石搭配&#xff1a; 1、每个装备上都会有不同的孔洞&#xff0c;所镶嵌的3个宝石都是不相同的。 2、宝石也分为很多的种类。选择比较困难。 推荐搭配&#xff1a; 如果有宝石等级比较高&#xff0c;那么就选择高的来搭配。最好的搭配是就是同样的属性搭配一套&#x…

优雅玩转实验室服务器(一)登录服务器

这篇文章更加偏向于使用python程序进行研究的朋友们 原料 Windows主机实验室Linux服务器&#xff08;可以访问互联网&#xff09;一点点耐心 step.0 windows terminal is all you need 别跟我说什么putty&#xff0c;什么winscp&#xff0c;我就是单推Win11自带的软件——win…

005、Softmax损失

之——softmax与交叉熵 杂谈 我们常用到softmax函数与交叉熵的结合作为损失函数以监督学习&#xff0c;这里做一个小小的总结。 正文 1.softmax的基本改进 所谓softmax就是在对接全连接层输出时候把输出概率归一化&#xff0c;最基础的就是这样&#xff1a; 效果就是这样&…

【Android嵌入式开发及实训课程实验】【项目1】 图形界面——计算器项目

【项目1】 图形界面——计算器项目 需求分析界面设计实施1、创建项目2、 界面实现实现代码1.activity_main.xml2.Java代码 - MainActivity.java 3、运行测试 注意点结束~ 需求分析 开发一个简单的计算器项目&#xff0c;该程序只能进行加减乘除运算。要求界面美观&#xff0c;…

【异常解决】SpringBoot + Maven 在 idea 下启动报错 Unable to start embedded Tomcat(已解决)

Unable to start embedded Tomcat&#xff08;已解决&#xff09; 一、背景介绍二、原因分析2.1 网络上整理2.2 其他原因 三、解决方案 一、背景介绍 spring boot(v2.5.14) maven idea 启动项目 之前项目一直启动的好好的&#xff0c;都能正常运行。重启的时候突然就不能启…

汽车服务行业分析:预计2028年将达到38亿元

在推进加快检验机构建设同时&#xff0c;综合评估检验机构数量、分布和检测能力&#xff0c;探索试点汽车 4S 店开展检验&#xff0c;提供维修、保养、车检一体化服务。汽车服务主要是指围绕汽车展开的一系列服务活动&#xff0c;包括维修、美容、金融等&#xff0c;除具有一般…

Wireshark中的http协议包分析

Wireshark可以跟踪网络协议的通讯过程&#xff0c;本节通过http协议&#xff0c;在了解Wireshark使用的基础上&#xff0c;重温http协议的通讯过程。 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于 字节流…

【C++】类与对象(下)

本文目录 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字 2. static成员2.1 概念2.2 特性 3. 友元3.1 友元函数3.2 友元类 4. 内部类5. 匿名对象6. 拷贝对象时的一些编译器优化7. 再次理解类和对象 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&am…

山西电力市场日前价格预测【2023-12-09】

1.日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-09&#xff09;山西电力市场全天平均日前电价为366.40元/MWh。其中&#xff0c;最高日前电价为629.26元/MWh&#xff0c;预计出现在08:00。最低日前电价为216.58元/MWh&#xff0c;预…

Tomcat部署及优化

1. Tomcat 简介 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;是 Apache 软件基金会的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。 Tomcat 属于轻量级应用服务器…

【数据结构】堆的模拟实现

前言:前面我们学习了顺序表、单链表、栈、队列&#xff0c;今天我们就开始新的学习吧&#xff0c;今天我们将进入堆的学习&#xff01;(最近博主处于低谷期)一起加油吧各位。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:数据结构 &…

【代码随想录】刷题笔记Day34

前言 考过概率论&#xff0c;发过一场烧&#xff0c;兜兜转转又一月&#xff0c;轻舟已撞万重山&#xff0c;赶紧刷题 贪心算法理论基础 贪心的本质&#xff1a;局部最优→全局最优无套路&#xff0c;常识性推导 举反例 455. 分发饼干 - 力扣&#xff08;LeetCode&#xf…

小黑独自去逛城墙和夫子庙,夜泊秦淮被雨淋,南京马拉松323刷新自己最好成绩,开始参加部里公务员培训的leetcode之旅:12. 整数转罗马数字

小黑代码 class Solution:def intToRoman(self, num: int) -> str:# 定义字符数组和数字数组chars [M, CM, D, CD, C, XC, L, XL, X, IX, V, IV,I]nums [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]total numres # 遍历每个符号for i in range(13):# 依次进…

自炫锁2-b

1. 自旋锁 自旋锁也是为实现保护共享资源而提出一种锁机制。其实&#xff0c;自旋锁与互斥锁比较类似&#xff0c;它们都是为了解决对某项资源的互斥使用。 无论是互斥锁&#xff0c;还是自旋锁&#xff0c;在任何时刻&#xff0c;最多只能有一个保持者&#xff0c;也就说&…

进程(IPC)_D3(2023-12-12)

XMind&#xff08;分图版&#xff09;