变量类型

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内核学习一的更多相关文章

  1. 学习windows内核书籍推荐 ----------转自http://tieshow.iteye.com/blog/1565926

      虽然,多年java,正在java,看样子还得继续java.(IT小城,还是整java随意点)应用程序 运行于操作系统之上,  晓操作系统,方更晓应用程序. 主看windows,因为可玩性高,闭源才 ...

  2. 【翻译】 Windows 内核漏洞学习—空指针解引用

    Windows Kernel Exploitation – NullPointer Dereference 原文地址:https://osandamalith.com/2017/06/22/windo ...

  3. Windows 内核漏洞学习—空指针解引用

    原标题:Windows Kernel Exploitation – NullPointer Dereference 原文地址:https://osandamalith.com/2017/06/22/w ...

  4. windows内核Api的学习

    windows内核api就是ntoskrnl.exe导出的函数.我们能够跟调用应用层的api一样,调用内核api. 只是内核api须要注意的是.假设函数导出了.而且函数文档化(也就是能够直接在msdn ...

  5. Windows内核驱动开发入门学习资料

    声明:本文所描述的所有资料和源码均搜集自互联网,版权归原始作者所有,所以在引用资料时我尽量注明原始作者和出处:本文所搜集资料也仅供同学们学习之用,由于用作其他用途引起的责任纠纷,本人不负任何责任.(本 ...

  6. windows内核对象管理学习笔记

    目前正在阅读毛老师的<windows内核情景分析>一书对象管理章节,作此笔记. Win内核中是使用对象概念来描述管理内核中使用到的数据结构.此对象(Object)均是由对象头(Object ...

  7. Windows原理深入学习系列-Windows内核提权

    这是[信安成长计划]的第 22 篇文章 0x00 目录 0x01 介绍 0x02 替换 Token 0x03 编辑 ACL 0x04 修改 Privileges 0x05 参考文章 继续纠正网上文章中 ...

  8. windows内核编程之常用数据结构

    1.返回状态 绝大部分的内核api返回值都是一个返回状态,也就是一个错误代码.这个类型为NTSTATUS.我们自己写的函数也大部分这样做. NTSTATUS MyFunction() { NTSTAT ...

  9. windows进程/线程创建过程 --- windows操作系统学习

    有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...

  10. KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态获取 《寒江独钓》内核学习笔记(5)

    目录 . 相关阅读材料 . <加密与解密3> . [经典文章翻译]A_Crash_Course_on_the_Depths_of_Win32_Structured_Exception_Ha ...

随机推荐

  1. 三天吃透Spring Cloud面试八股文

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...

  2. Python Web开发初试,基于Flask

    目录 关于web框架 Python flask使用 关于web框架 仅仅对于应用层的coder而言,web框架的使用其实就是写路由,分发路由,写输出.当然如果要安全,要测试,要写优秀的接口,那需要继续 ...

  3. 近期调研和使用 zeromq 与 cppzmq 的一些问题

    关于message 消息分片 消息分片的发送 消息分片允许将多个消息封装成一条消息.在发送自定义协议数据时,我们经常需要在消息前"填充"一个包头.如下代码,在发送的时候加上 zmq ...

  4. 使用 zeromq与cppzmq 程序退出遇到的坑

    在使用zeromq 退出的时候还遇到一点坑,对于服务deaman(守护进程)化的进程可能会遇到这个问题. 现象: 这个问题导致的现象是服务一旦关闭(stop),就会 core dump,core du ...

  5. Markdown 的常用语法

    声明(叠甲):鄙人水平有限,本文章仅供参考. 且本文章是一个不全的分享,只有我目前用的比较多的语法,如果有什么错误,欢迎大家指正.具体可以查看该网站 写博客我使用的是 Markdown,为熟悉 Mar ...

  6. requests不带参数的get请求和带get参数请求

    requests库常用的方法 requests.Request(url) 构造一个请求,支持以下各种方式 requests.get() 发送get请求 requests.post() 发送post请求 ...

  7. springsecurity-jwt整合

    2 springsecurity-jwt整合 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章http://www.javaman.cn/sb2/jwt 2.1整合springse ...

  8. 有执行语句:console.log(fn2(2)[3]),补充函数,使执行结果为"hello"

    function fn2(a){ return [1,2,3,"hello"];}console.log(fn2(2)[3])//hello 这个2是混淆视线的,即使没有这个2.函 ...

  9. Django之时区修改

    修改时区方法 环境:windows10 修改settings.py文件,修改TIME_ZONE和USE_TZ参数 TIME_ZONE = 'Asia/Shanghai' USE_TZ = False

  10. python之PySimpleGUI(一)元素

    1themesg.theme_previewer()获取所有主题颜色sg.preview_all_look_and_feel_themes()同上theme_name_list = sg.theme_ ...