根据教程 编译WRK ,i work,
教程:
最近买了本《Windows内核原理与实现》,书中是以WRK的代码为例讲述操作系统内核的。
可书中配置WRK部分是以微软给的免费光盘的内容,配合了Virtual PC2007的虚拟系统。可在官网上并不是每个人都可以得到的,所以记录一下我的安装配置始末。希望对你有帮助少走弯路!
点这里了解什么是WRK(Windows Research Kernel)
点这里下载Windows Server 2003 SP1_iso
点这里下载WRK1.2
WRK1.2可在两种环境下运行:
X86(Windows Server 2003 SP1)
AMD64(Windows XP x64 Professional)
可以在运行上述操作系统的物理计算机上安装WRK,但是为了调试方便我们建议安装到虚拟机当中。我们这里就以VMware为例
1.首先在VMware中安装Windows Server 2003 SP1[这里省略……]
(新建虚拟机-选择Windows Server 2003 Standard Edition )
2.将WRK1.2当中的4个目录托到虚拟机的系统里面,如图
3.在虚拟机当中打开CMD,进入WRK目录。并执行命令
set path=d:/wrk/tools/x86;%path%
然后进入base/ntos目录编译WRK。如图
4.回车后编译器开始编译WRK,时间大约需要2分钟左右。编译成功后
内容在base/ntos/build/exe目录当中
5.将wrkx86.exe文件复制到windows/system32目录之下
6.处理硬件抽象层(在X86平台下WRK内核需要多处理器版本的硬件抽象层hal.dll的支持。在Windows中,HAL是一个独立的动态链接库。尽管Windows随带了多个主流机器的HAL,但是在系统安装的时候只有一个会被选中,并拷贝和改名为hal.dll……有点扯远了。我们看下HAL列表)
既然有这么多HAL我们如何判断当前正在运行哪个HAL呢
可以打开c:/windows/repair/setup.log 文件,然后搜索Hal.dll 如图
我们看到是Halaacpi.dll。大家可以根据自己的机器使用了哪一个HAL对照下面的列表进行操作
在我的虚拟机系统当中是 halaacpi.dll 那么我们就到
d:/wrk/WS03SP1HALS/x86/halmacpi 目录中将
halmacpi.dll 文件复制到 WINDOWS/system32目录下
另外还有2个多处理的HAL文件同样也在WS03SP1HALS/x86目录下,大家自己根据实际情况选择。
7.做好上述工作以后打开虚拟机系统的boot.ini文件(文件夹选项-取消【隐藏受保护的操作系统文件(推荐)】前面的勾号确定后,可在C:/下找到boot.ini文件。记得取消只读模式)
做如下修改:
最后启动操作系统的时候可以看到
那么剩下的事情就是在虚拟机上添加一个串行接口-命名管道-以及配置WINDBG的工作了。这里我想大家都比较熟悉了。
在虚拟机上调试WRK
1、关闭虚拟机,给虚拟机增添一个串口:单击VMware 的“VM”菜单,选择“Settings…”命令,在出现的对话框中选择“Add…”按钮,在接下来出现的Add Hardware Wizard 向导中依次选择增加Serial Port,串口类型为选择“Output to named pipe”,命名管道的设置可以采用VMware 提供的缺省值。
2、为了调试目标操作系统,必须设置WinDbg 的启动参数,为此可用创建一个新的WinDbg 快捷方式,其参数设置如下:
"D:\Program Files\Debugging Tools for Windows\windbg.exe" -b -k com:pipe,port=\\.\pipe\com_1,baud=115200,reconnect -y D:\Symbols\WindowsWRK;srv*D:\Symbols\WindowsWRK*http://msdl.microsoft.com/download/symbols -srcpath "E:\SourceFile\WRK1.2\base"
说明:象文件的路径需要与本机的一致。
3、为了对目标机进行调试,必须在目标机操作系统中增加新的启动选项。启动
虚拟机,编辑boot.ini 文件,增加一个具有如下参数的引导选项:
/kernel=wrkx86.exe /hal=halmacpi.dll /debug /debugport=com_1 /baudrate=115200
4、修改本机和虚拟机的COM1端口速率,将其原来的缺省速率9600调整到115200,这一步很重要,否则windbg就不能与虚拟机进行通信
5、现在开始就可以用windbg对虚拟机的WRK内核进行调试了,如下图所示。
说明:本文主要是记录整个过程,重点叙述了其中遇到的问题及解决方法,希望各位能够说说自己在调试WRK过程中遇到的问题,以及下一步如何去利用WRK。
参考资料:
1、《VMware Workstations6基本使用》
2、《WRK 实验环境设置》
查看断点调用堆栈
命令
==========
k
k命令显示的是一定数量的栈帧, 其中帧的数量是由.kframes命令来控制的, 默认值是256。
kp 5
显示调用栈中前5个函数以及他们的参数.
kb 5
显示调用栈中前五个函数以及他们的前三个参数.
kf 5
显示在调用栈中五个函数所使用的栈的大小.
每个栈帧所占的空间使用量的计算方法是: 将当前函数的栈基指针与在函数中调用的任何一个函数栈基指针相减.
举例:
手动构造栈的实践- 如何手工构造调用栈
============
首先用几幅图说明一下栈的特点, 帮助大家理解.
1. 栈向低地址增长.
2. 向栈中压入数据, 栈中的情况如图.
3. 有函数调用的栈中的情况.
注意, 手工构造栈的时候, 我们需要利用的是上面图中显示的一个模式:
在内存中的一系列的值是可以被识别出来的, 这些值表示当前站中的某个地址, 并且在这些值之后是一个可执行的地址.