windows内核学习一
变量类型
| kernel | user |
|---|---|
| ULONG | unsigned long |
| PULONG | unsigned long* |
| UCHAR | unsigned char |
| PUCHAR | unsigned char* |
| UINT | unsigned int |
| PUNIT | unsigned int* |
| VOID | void |
| PVOID | void* |
P代表指针
程序入口
DriverEntry,相当于main函数
函数原型
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
typedef struct _DRIVER_OBJECT {
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT DeviceObject;
ULONG Flags;
PVOID DriverStart;
ULONG DriverSize;
PVOID DriverSection;
PDRIVER_EXTENSION DriverExtension;
UNICODE_STRING DriverName;
PUNICODE_STRING HardwareDatabase;
PFAST_IO_DISPATCH FastIoDispatch;
PDRIVER_INITIALIZE DriverInit;
PDRIVER_STARTIO DriverStartIo;
PDRIVER_UNLOAD DriverUnload;
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT;
字符串
内核中使用ANSI_STRING/UNICODE_STRING来代表普通字符和宽字符
NTSTATUS testString()
{
//初始化字符串
ANSI_STRING as0;
UNICODE_STRING us0;
RtlInitAnsiString(&as0, "ansi string");
RtlInitUnicodeString(&us0, L"unicode string");
KdPrint(("%Z\n %wZ\n", &as0, &us0));
////拷贝字符串
//复制字符串要自定义缓冲区
ANSI_STRING as1;
UNICODE_STRING us1;
CHAR as[128] = { 0 };
WCHAR ws[128] = { 0 };
RtlInitEmptyAnsiString(&as1, as, sizeof(as));
RtlInitEmptyUnicodeString(&us1, ws, sizeof(ws));
RtlCopyString(&as1, &as0);
RtlCopyUnicodeString(&us1, &us0);
KdPrint(("%Z\n %wZ\n", &as1, &us1));
////比较字符串
ANSI_STRING as2;
UNICODE_STRING us2;
RtlInitAnsiString(&as2, "second ansi string");
RtlInitUnicodeString(&us2, L"second unicode string");
//为true代表忽略大小写
BOOLEAN b0 = RtlCompareString(&as0, &as2, FALSE);
BOOLEAN b1 = RtlCompareString(&as0, &as2, TRUE);
BOOLEAN b2 = RtlCompareUnicodeString(&us0, &us2, FALSE);
BOOLEAN b3 = RtlCompareString(&as0, &as1, FALSE);
KdPrint(("%d %d %d %d\n", b0, b1, b2, b3));
////ansi与unicode相互转化
ANSI_STRING as3;
UNICODE_STRING us3;
RtlAnsiStringToUnicodeString(&us3, &as0, TRUE);
RtlUnicodeStringToAnsiString(&as3, &us0, TRUE);
KdPrint(("%Z\n %wZ\n", &as3, &us3));
//释放
RtlFreeAnsiString(&as3);
RtlFreeUnicodeString(&us3);
return STATUS_SUCCESS;
}
句柄表
一个进程打开或创建一个内核对象时会得到一个句柄,这样可以防止直接操作内存引起蓝屏。每个进程一个句柄表。句柄表在_EPROCESS结构体+0xc4处。句柄项位于句柄值/4*8+句柄表基址。可以通过遍历其他进程的句柄表来判断自身是否被其他程序所使用。
存在一个全局句柄表,为多级结构。

windows内核学习一的更多相关文章
- 学习windows内核书籍推荐 ----------转自http://tieshow.iteye.com/blog/1565926
虽然,多年java,正在java,看样子还得继续java.(IT小城,还是整java随意点)应用程序 运行于操作系统之上, 晓操作系统,方更晓应用程序. 主看windows,因为可玩性高,闭源才 ...
- 【翻译】 Windows 内核漏洞学习—空指针解引用
Windows Kernel Exploitation – NullPointer Dereference 原文地址:https://osandamalith.com/2017/06/22/windo ...
- Windows 内核漏洞学习—空指针解引用
原标题:Windows Kernel Exploitation – NullPointer Dereference 原文地址:https://osandamalith.com/2017/06/22/w ...
- windows内核Api的学习
windows内核api就是ntoskrnl.exe导出的函数.我们能够跟调用应用层的api一样,调用内核api. 只是内核api须要注意的是.假设函数导出了.而且函数文档化(也就是能够直接在msdn ...
- Windows内核驱动开发入门学习资料
声明:本文所描述的所有资料和源码均搜集自互联网,版权归原始作者所有,所以在引用资料时我尽量注明原始作者和出处:本文所搜集资料也仅供同学们学习之用,由于用作其他用途引起的责任纠纷,本人不负任何责任.(本 ...
- windows内核对象管理学习笔记
目前正在阅读毛老师的<windows内核情景分析>一书对象管理章节,作此笔记. Win内核中是使用对象概念来描述管理内核中使用到的数据结构.此对象(Object)均是由对象头(Object ...
- Windows原理深入学习系列-Windows内核提权
这是[信安成长计划]的第 22 篇文章 0x00 目录 0x01 介绍 0x02 替换 Token 0x03 编辑 ACL 0x04 修改 Privileges 0x05 参考文章 继续纠正网上文章中 ...
- windows内核编程之常用数据结构
1.返回状态 绝大部分的内核api返回值都是一个返回状态,也就是一个错误代码.这个类型为NTSTATUS.我们自己写的函数也大部分这样做. NTSTATUS MyFunction() { NTSTAT ...
- windows进程/线程创建过程 --- windows操作系统学习
有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...
- KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态获取 《寒江独钓》内核学习笔记(5)
目录 . 相关阅读材料 . <加密与解密3> . [经典文章翻译]A_Crash_Course_on_the_Depths_of_Win32_Structured_Exception_Ha ...
随机推荐
- 详解低延时高音质:丢包、抖动与 last mile 优化那些事儿
本篇是「详解低延时高音质系列」的第三篇技术分享.我们这次要将视角放大,从整个音频引擎链路的角度,来讲讲在时变的网络下,针对不同的应用场景,如何权衡音质和互动的实时性. 当我们在讨论实时互动场景下的低延 ...
- KCP协议浅析
概述 KCP协议结合了TCP和UDP协议的特点,是一个快速可靠的协议. 引述官方介绍: KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大 ...
- 设计模式(二十九)----综合应用-自定义Spring框架-Spring IOC相关接口分析
1 BeanFactory解析 Spring中Bean的创建是典型的工厂模式,这一系列的Bean工厂,即IoC容器,为开发者管理对象之间的依赖关系提供了很多便利和基础服务,在Spring中有许多IoC ...
- MQTT(EMQX) - Java 调用 MQTT Demo 代码
POM <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse ...
- 随机分布和随机数生成——R语言
在人们的生活中,很多场景都需要用到随机数,例如福利彩票,车牌摇号,公共用房分配等.在用数学模型, 包括概率统计模型处理实际应用中的问题时, 我们希望建立的模型能够尽可能地符合实际情况.但是,实际情况是 ...
- elk7.15.1安装部署搭建
ELK简介 ELK是Elasticsearch.Logstash.Kibana三大开源框架首字母大写简称(但是后期出现的Filebeat(beats中的一种)可以用来替代Logstash的数据收集功能 ...
- python入门教程之二十四Python MySQL - mysql-connector 驱动
MySQL 是最流行的关系型数据库管理系统,如果你不熟悉 MySQL,可以阅读我们的 MySQL 教程. 本章节我们为大家介绍使用 mysql-connector 来连接使用 MySQL, mysql ...
- 机器学习(四):4层BP神经网络(只用numpy不调包)用于训练鸢尾花数据集|准确率96%
题目: 设计四层BP网络,以g(x)=sigmoid(x)为激活函数, 神经网络结构为:[4,10,6, 3],其中,输入层为4个节点,第一个隐含层神经元个数为10个节点:第二个隐含层神经元个数为6个 ...
- Semantic Kernel 入门系列:💾Native Function
语义的归语义,语法的归语法. 基础定义 最基本的Native Function定义只需要在方法上添加 SKFunction 的特性即可. using Microsoft.SemanticKernel. ...
- Linux(三)磁盘管理
Linux磁盘管理 Linux中的tree工具 tree可以查看目录的树形结构,前提是需要自行安装 yum install tree -y [root@hadoop100 ~]# tree ./ ./ ...