无题
双机调试
使用 vmware + windows 10 虚拟机 和 VirtualKD工具进行调试
在Github的Releases下载后:
得到如上内容,我们将 target64 放入虚拟机中。
以管理员身份运行它,点击Install->确定->确定..
它会帮我们禁用签名,最后windows重新启动,在启动的时候,我们按下F8 选择如下内容启动
启动后,我们在物理机(主机)上运行vmmon64.exe会得到如下内容,选择WinDbg Preview后点击Rundebugger
会自动建立一个通道:如下
稍等一会儿后我们点击Go -> 虚拟机就能开机了。
这个时候我们的双击调试就已经做好了。
双击调试基础操作
使用一些简单的指令
内存相关
1 | dq , dd , dw ,db |
d:display 展示,陈列
q:qword -> 64位整数 d:dword w:word b:byte
dd 0xaddress
:显示从0xaddress
开始的 DWORD 数据。dq esp
:显示当前栈指针(ESP)处的 QWORD 数据。dw 0x12345678 L4
:显示从0x12345678
开始的 4 个 WORD 数据。
1 | eq,ed,ew,eb |
e:edit
这些指令都是用于修改指定地址位置上的数据
ed fffff800 52462e95 12345678
:修改该位置上的值为12345678
1 | !db,!dd,!dw,!dq |
1 | u :查看指令 |
1 | r :显示寄存器 |
1 | s:搜索指令 |
杂项
显示当前线程的调用堆栈(Call Stack)。
1 | k |
继续
1 | gc/g |
用于显示某个结构体
1 | dt |
断点
1 | bp:下断点 |
1 | bl :显示当前断点列表 |
1 | ba 硬件断点 |
1 | bu 下一个不知道的断点 |
在写驱动的时候bu
条件断点:一个if语法: “.if(){}.else{}”
1 | bp NtOpenProcess ".if(@rdx=0x1000){}.else{gc}" |
第一个Hello Kernel
首先需要安装WDK和IDE,它将用于写驱动程序,这里我使用的是VS2022。
https://learn.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk
因为写驱动的时候会使用很多函数API:https://learn.microsoft.com/zh-cn/;在官网查看他们的使用方法是最好的。
在安装完成后:选择“新建项目”–>“Empty”
最后是“Hello Kernel”的代码块
1 |
|
在生成sys文件后,我们使用驱动加载程序(更方便)InstDrv:https://github.com/BeneficialCode/InstDrv
效果:
操作系统相关概念
==windows 一切皆对象==
Process 进程
进程包括
- 可执行程序
- 私有的虚拟地址
虚拟地址—> paging –>RAM(RAM内存条)
Winddbg中查看进程
!process 查看当前附加进程
!process 0 0 查看所有进程
.process /i EPROCESS 【地址】来附加进程
Thread 线程
KPCR
Kernel Processor Control Region
KPCR 是每个 CPU 内核私有的数据结构,是线程调度与 CPU 状态切换的重要基础
Kernel Processor Control Block
KPRCB 内部包含调度、DPC、线程相关信息
可以用dt 命令来查看
句柄
句柄表:句柄到内核对象的查找
- 句柄的值是4的倍数。除以4可以在句柄表中找到索引
- 内核模式代码可以调用ObReferenceObjectByHandle函数从一个有效的句柄得到指针。