x86内核-句柄
句柄全局句柄表在windows内核中一共有三种句柄表:全局句柄表、私有句柄表、内核句柄表。
全局句柄表中只记录两种东西,进程和线程
PID为4的倍数
x86系统的句柄占8字节 有四字节描述属性权限等信息
PID除4再乘8为全局句柄表索引
PspCidTable句柄表全局变量,结构为_HANDLE_TABLE
这里我随便找一个进程进行演示
查看PspCidTable
使用 _HANDLE_TABLE解析句柄表
12345678910111213141516171: kd> dt _HANDLE_TABLE 8aa010a8ntdll!_HANDLE_TABLE +0x000 TableCode : 0x9acf1001 //如果为0x9acf1000指向大小为4k的句柄 如果为0x9acf1001指向大小为4k的句柄目录表表中的每一项4字节成员都指向4k的句柄表 +0x004 QuotaProcess : (null) //所属进程 +0x008 UniqueProcessId : (null) //所属进程id +0x00c ...
x86内核-进程线程(烂尾中。。)
什么是进程进程本质上就是一块被特殊标识的内存区域
进程的结构由于Windows不是宏内核,所以结构被分成了两部分:执行体、微内核。
执行体结构1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351360: kd> dt _EPROCESSntdll!_EPROCESS +0x000 Pcb : _KPROCESS //微内核 +0x098 ProcessLock : _EX_PUSH_LOCK ...
x86内核-系统调用
WindowsAPI是如何从3环进入0环的在windows上,所有进程都需要调用一个模块——ntdll.dll
csrss.exe只调用ntdll.dll这一个模块(nativeProcess)
分析ReadProcessMemory如何从R3进入R0代码:
123456789#include <Windows.h>int main(){ __asm int 3; HANDLE tmp = GetCurrentProcess(); ReadProcessMemory(tmp, NULL, NULL, NULL, NULL); system("pause"); return 0;}
因为有int3断点,直接运行让Windbg接收异常信号即可,如果没有符号,可以使用.reload强制重新加载符号
单步到ReadProcessMemory的CALL处
步入,发现还在Kernel32中,在这里如果全是问号,说明没有符号,可以使用.reload强制重新加载符号
jmp过去发现又是一个jmp
继续跟,来到了KernelBase的ReadP ...
x86内核-驱动
内核的一些概念Windows内核详细组成结构
函数从三环进入内核例程
HTL相关文件
各组件接口函数的前缀
创建第一个驱动创建WDM驱动模板
在VS中创建一个WDM驱动模板,名字随意
在低版本的vs中(2015以下),创建驱动模板时会出现两个工程,把第二个Packahe工程移除
在Source Files中创建一个.c文件名字随意
在这个.c文件中加入需要的驱动代码即可。
在这留一个DriverMain的标准模板1234567891011121314#include <ntifs.h>VOID DriverUnload(PDRIVER_OBJECT pDriver){ KdPrint(("DriverUnload\r\n"));}NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pEeg){ pDriver->DriverUnload = DriverUnload; KdPrint(("DriverEntry\r\n& ...
x86内核-保护模式--控制寄存器
控制寄存器什么是控制寄存器控制寄存器是一个用于控制和确定处理器的操作模式以及当前执行任务的特性的寄存器。
控制寄存器在x86下一共有5个(CR0~CR4),其中CR1保留不用。
CR0 – 总闸
CR2 – 缺页异常
CR3 –页目录表基址
CR4 – 分闸
CR0 – 总闸
名称
位
说明
PE
0
Protection Enable开启段保护 (没有开启页保护)
MP
1
监控协处理器(Monitor coProcessor或Math Present)标志。用于控制WAIT/FWAIT指令与TS标志的交互作用。如果MP=1、TS=1,那么执行WAIT指令将产生一个设备不存在异常;如果MP=0,则TS标志不会影响WAIT的执行。
EM
2
(EMulation)标志。当该位为1时,表示处理器没有内部或外部协处理器,执行协处理器指令时会引起设备不存在异常;当为0时,表示系统有协处理器。设置这个标志可以迫使所有浮点指令使用软件来模拟。此标志还会影响MMX/SSE/SSE2/SSE3/SSSE3/SSE4 指令。
TS
3
任务已切换(Task Switche ...
x86内核-保护模式--页
101012分页模式配置我们默认的分页模式为29912分页模式,需要修改为101012分页模式。
将原本的debug启动项拷贝一份
1bcdedit /copy {current} /d 101012
]
关闭DEP(数据执行保护)
1bcdedit /set {dd64745e-0a47-11eb-bc4d-cd0e0677722b} nx AlwaysOff
关闭PAE(物理扩展内存)
1bcdedit /set {dd64745e-0a47-11eb-bc4d-cd0e0677722b} pae ForceDisale
全部操作成功的话就可以看见这两项
并且重启后数据执行保护功能变灰
并且DirBase以K为单位进行变动,说明101012分页模式开启成功
windows7 x86的两种29912分页和101012分别由ntkrnlpa.exe和nroskrnl.exe两个内核文件进行管理。
什么是分页模式?像29912或是101012这种分页模式的名字并不是cpu厂商起的,更不是操作系统厂商起的,只是为了好区分当前 ...
x86内核-保护模式--段
双机调试环境配置虚拟机bcdedit添加调试启动拷贝当前启动项1bcdedit /copy {current} /d debug
如果拷贝成功可以获得新启动项ID
将启动项添加到当前启动顺序末尾1bcdedit /displayorder {dd64745d-0a47-11eb-bc4d-cd0e0677722b} /addlast
设置全局调试参数1.使用串口COM 1进行通信,波特率为115200。
1bcdedit /dbgsettings SERIAL DEBUGPORT:1 BAUDRATE:115200
2.物理双机1394串口调试,通道为23
1bcdedit /dbgsettings 1394 CHANNEL:23
3.使用USB端口进行双机调试,目标名称为DEBUGGING
1bcdedit /dbgsettings USB TARGETNAME:DEBUGGING
这里我们使用第一项即可。
启用引导的调试1bcdedit /bootdebug {dd64745d-0a47-11eb-bc4d-cd0e0677722 ...
DirectX SDK学习笔记
创建一个窗口创建窗口需要那些步骤?
1.注册窗口类
2.创建窗口实例
3.显示窗口
4.更新窗口
5.建立消息循环
6.实现窗口过程函数
使用RegisterClass注册窗口类RegisterClass的作用是告知系统我们所需要的窗口风格
123ATOM RegisterClass( const WNDCLASS *lpWndClass );
参数 lpWndClass为指向WNDCLASS结构体的指针
WNDCLASS结构体:
12345678910111213141516typedef struct _WNDCLASS { UINT style; //风格 //一般填下面两项(当窗口被修改时,系统会通知窗口重新绘制界面)。 //CS_VREDRAW || CS_HREDRAW WNDPROC lpfnWndProc; //回调函数 int cbClsExtra; //额外大小,窗口类使用 int cbWndExtra; //额外大小,窗口实例使用 //不使用额外 ...
数据结构
时间复杂度什么是时间复杂度? 在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。
算法复杂度分为时间复杂度和空间复杂度。其作用:时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度。)计算机发展到今天,空间相对于时间来说已经没那么重要,因此现在许多程序员在设计程序或者算法时,会选择使用更高的空间复杂度来换取更低的时间复杂度。
算法时间复杂度比较的前提
1.数据样本量相同(n)
2.每一条指令执行的时间相同(t)
常见的时间复杂度O(1) 常量阶12345678int add(int m,int n){ m++; //1*t n ...
Crack Ezviz Studio
模块QtCore4
特征码:
56 8B F1 8B 46 08 8B 4C 24 08 39 41 0C 75 ?? F6 46 14 01 74 ?? 83 F8 FF 74 ?? 50 8B CE E8 ?? ?? ?? ?? C7 46 08 ?? ?? ?? ?? 8B CE E8 ?? ?? ?? ?? 5E C2 04 00