Windows内核(7)——内核API介绍
Windows内核内核API的使用关于内存检查的API123MmIsAddressValid();//查表检测该页是否有效 一般是0x12345678 & 0xffff000 ,操作系统申请没有一个字节,而是以页为单位ProbeForRead(); //只能检测UserBuffer,而且要用异常处理,而且参数为0的时候不干事ProbeForWrite();//只能检测UserBuffer,而且要用异常处理,而且参数为0的时候不干事
关于字符串的API以 Rtl(Runtime Library)开头的函数命名源自 Windows 操作系统的运行时库(Runtime Library),这些库提供了一组基本函数,用于支持操作系统和驱动程序的开发。Rtl 函数主要用于以下几个方面:
字符串操作:包括 Unicode 和 ANSI 字符串的初始化、复制、比较、转换等操作。
内存管理:提供内存分配、释放、复制等基本功能。
其他基础操作:如列表操作、异常处理等。
12345678910RtlInitUnicodeString();//初始化一个 UNICODE_STRIN ...
Windows内核(6)——内核调试
Windows内核环境配置:学习系统内核程序是如何运行的,分析程序的运行就必须用到调试,要调试就要能下断点
Windows系统当处于调试状态的时候,所有进程都会被挂起,除了一个调试子系统,用来与本机(Windbg)通过串口进行交互,传递调试指令
Win7+WmWare+Windbg双机调试看这个博客吧,很详细
https://cloud.tencent.com/developer/article/1470241
嘿嘿嘿配好了
注意注意,一定要在系统启动的时候,打开Windbg才能调试上!
X86的Windbg有个bug,就是寄存器窗口没有值,这个可以去github上面下载一个dll
放在同个文件夹即可
然后执行命令:
1!WingDbg.regfix #注意大小写
值得注意的是,命令为:Wingdbg而不是Windbg,虽然我也不知道为什么
这下寄存器窗口就有值了
建议界面可以弄得和OD和x96dbg一样,然后点击保存工作界面:
然后再次进入Windbg的时候,如果没有自动还原工作界面,可以自行打开
Open Workspace
调试驱动程序旧版Windbg首先我们要编译 ...
Windows内核(5)——安全通讯
Windows内核安全通讯乱写Ring3的代码让Ring0崩掉???
例如Ring3给Ring0传一个地址,然后Ring0去访问这块内存,内核直接读写用户内存地址,就会造成系统崩溃。
那么如何去预防?
1.禁止内核直接访问用户层的内存地址(这能避免大部分漏洞)
非要用要保证:1.检查三环地址是否有效(ProbeRead/ProbeWrite)2.保证进程不产生切换(严格检测)
但是不访问三环地址,很难进行通讯
微软就提供了通讯方式(解决缓冲区安全问题)
1.缓冲区方式
2.直接方式
3.其他方式(直接读写用户层的内存地址 Irp->UserBuffer就是直接读写用户层地址,这个很危险)
如何设置?
在创建设备完,要设置缓冲区通讯方式,如果不设置,默认用其他方式,也就是直接访问用户层的内存地址:
设置DEVICE_OBJECT结构体里面的Flags,有缓冲区通讯和直接通讯
12345678910status = IoCreateDevice( DriverObject, // 驱动程序对象 0, ...
Windows内核(4)——R0,R3通讯,交换数据
Windows内核Windows 组件概述调用例如CreateFile这个NTDll的API,这个API会进入0环,在0环里面找到相关的服务,将信息先传给IO Mgr,被打包为IRP,然后传递给驱动,等待驱动完成请求,处理完以后,才将结果返回给Ring3
WriteFile => ntdll.dll => kernel => I/O Manager => AllocIrp => Driver
一些介绍 IoCompleteRequest 是 Windows 内核模式驱动程序开发中的一个关键函数,用于完成 I/O 请求并通知 I/O 管理器和请求的发起者(通常是用户模式应用程序或其他内核模式组件)操作已经完成。这个函数会更新 IRP(I/O 请求包)的状态,并根据请求的优先级和完成状态触发相应的后续操作。
1234VOID IoCompleteRequest( _Inout_ PIRP Irp, _In_ CCHAR PriorityBoost);
使 ...
Windows内核(3)——手搓驱动加载器
Windows内核ntoskrnl.exe杂记驱动也是一个PE文件,类似于DLL,DriverEntry类似于DllMain
多了一个INIT节
用IDA打开一个驱动程序:
发现使用到的函数都是来自一个库,叫做ntoskrnl,
发现貌似是一个exe文件,我们用IDA打开看看
ntoskrnl.exe 是 Windows 操作系统的内核映像,简称为 NT Kernel (Windows NT Kernel Image)。它是 Windows 内核的核心部分,负责多种关键任务和系统服务
发现导出函数都在这个EXE的导出表里面
说明,逆向内核就相当于逆向这个exe程序
做一个驱动加载工具目标:尝试做一个驱动加载工具
自行写一个驱动的安装,启动,关闭,卸载
PrintErrorMessage这个函数能够自动根据错误码输出错误内容
12345678910111213141516171819202122void PrintErrorMessage(DWORD errorCode){ LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE ...
Windows内核(2)——IRP介绍&实现Ring0与Ring3交互
Windows内核2IRP(I/O Request Package)IRP是什么从概念上讲IRP类似于windows应用程序的消息。我们知道在windows中应用程序是由消息驱动的。
IRP的全名是I/O Request Package,即输入输出请求包,它是Windows内核中的一种非常重要的数据结构。上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求,操作系统将相应的I/O请求转换成相应的IRP,不同的IRP会根据类型被分派到不同的派遣例程中进行处理。
与IRP相关的几个常用的事件
驱动层
功能解释
对应于应用层
IRP_MJ_CREATE
请求一个句柄
CreateFile
IRP_MJ_CLOSE
关闭句柄
CloseHandle
IRP_MJ_READ
从设备得到数据
ReadFile
IRP_MJ_WRITE
传送数据到设备
WriteFile
IRP_MJ_DEVICE_CONTROL
控制操作利用IOCTL宏
DeviceIoControl
这几个IRP事件放在MajorFunctio ...
Windows内核(1)——内核初探&编写第一个驱动程序
Windows内核内核杂记内核(Kernel)
安全角度:Rootkit,漏洞利用,病毒
Rootkit(也称隐匿软件[1])是指主要为隐藏其他程序进程的软件,可能是一种或以上软件的组合;广义而言,Rootkit也可视为一项技术。今天,Rootkit一词更多指伪装成驱动程序加载到操作系统内核中的恶意软件,其代码在特权模式运行,能造成意外危险。
三种模式CPU的三种模式:
实模式(Real Mode)
实模式是x86处理器的初始模式,也是最早期的处理模式。在实模式下,CPU的特性和限制主要包括:
地址空间:只有20位地址总线,因此可以访问的物理内存最多为1MB。
段式内存管理:内存地址通过段寄存器和偏移量组合计算,例如,地址由段寄存器(16位)乘以16再加上偏移量(16位)组成。
无内存保护:没有内存保护机制,任何程序可以访问所有内存区域,包括操作系统和硬件设备的内存。
简单的中断处理:中断向量表固定在内存地址0x0000到0x03FF之间。
保护模式(Protected Mode)
保护模式是x86处理器的一种增强模式,提供了更强大的内存管理和保护功能。保护模式的主 ...
用管道将cmd.exe信息输出到窗口代码分析
用管道将cmd.exe信息输出到窗口12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182void CParentDlg::OnBnClickedButton3(){ //创建管道 SECURITY_ATTRIBUTES sa = {}; sa.nLength = sizeof(sa); sa.bInheritHandle = TRUE; ::CreatePipe(&m_hSelfRead, &m_hCmdWrite, &sa, 0); ::CreatePipe(&m_hCmdRead, &m_hSelfWrite, &sa, 0); //创建子进程 STARTUPINFO si = {}; si.cb = sizeof(si); s ...
X64异常分析(新旧版本)
X64逆向异常分析旧版本64位异常处理:
在x64的异常处理中,VS编译器不再采用在函数中注册SEH完成异常处理的方式,而是将异常信息存放在PE文件中的一个.pdata节中
在32位的情况下,想要找Funcinfo可以通过一个函数的开局 有一个
1offset __ehhandler$_main
双击点进去可以看到CxxFrameHanlder的其中一个参数unk_41B2C4,这个就是FuncInfo
但是在64位,我们在函数开头貌似并没有看到
1offset __ehhandler$_main
ThrowInfo我们只能找到CxxThrowException这个函数,然后找到pThrowInfo,然后找到ThrowInfo这个结构体
我们点进去发现,最后一个参数是一个RVA参数,为什么要用RVA呢?
原因是因为这样可以支持随机基址,拿到正确的地址的话,就可以直接通过随机基地址加上这个RVA即可
但是每次都要自己手动计算RVA转换为正确的地址,难免有些繁琐,所以我们在结构体定义的时候,就可以自己加上ImageBase,变成正确的地址:
可以看到快捷键是C ...
X64逆向
X64逆向64位相比于32位的优势:
更大的地址空间:64位系统可以访问的内存地址空间比32位系统大得多。具体来说,32位系统最多可以使用4GB的内存(2^32字节),而64位系统则可以使用高达16EB(2^64字节)的内存。这对于需要大量内存的应用程序,如大型数据库、视频编辑软件和虚拟化应用程序等,尤为重要。
更高的性能:在某些情况下,64位程序可以利用更多的寄存器和更宽的数据路径,从而提高性能。例如,64位处理器可以一次性处理更大的整数和浮点数,这对于科学计算、加密和多媒体处理等任务有显著的性能提升。
增强的安全性:64位系统通常包含更多的安全功能,例如硬件层面的地址空间布局随机化(ASLR)和数据执行保护(DEP)。这些功能可以帮助防范某些类型的攻击,如缓冲区溢出攻击。
兼容性和未来性:随着技术的发展,越来越多的软件和操作系统开始只支持64位版本。使用64位程序可以确保更好的兼容性和未来的支持,因为软件和硬件供应商将逐渐减少对32位系统的支持。
更好的多任务处理能力:64位处理器在处理多任务和多线程应用程序时,表现通常优于32位处理器。这对于需要同时运行多个应用程序或处理大量并发 ...