《天书夜读:从汇编语言到windows内核编程》四 windows内核调试环境搭建
1) 基础篇是讲理论的,先跳过去,看不到代码运行的效果要去记代码是一个痛苦的事情。这里先跳入探索篇。其实今天的确也很痛苦,这作者对驱动开发的编译与调试环境介绍得太模糊了,我是各种尝试,对这个环境的搭建还是不够理想,这里稍微做下笔记。
2)概念:普通运用程序开发在R3,而内核开发在R0,R0是最高特权等级。内核空间不同于普通的程序代码空间,独享4GB寻址过程,内核空间被所有的运用程序共享,一旦内存程序崩溃,系统将崩溃,导致蓝屏或者重启。
3) 开发与调试方案:基于上述的概念,调试内核程序是一个很要小心的事情。为了避免造成不必要的麻烦,采用的是虚拟机调试。搭建一个虚拟机,将虚拟机系统作为一个客户端运行程序,利用管道技术,使用windbg来调试整个系统。下面主要记录下搭建这么一个调试环境的过程,在摸索期间,也看到有的教程在本物理机安装驱动并且用DebugView查看内核级程序的输出信息,初步了解这只是一个输出功能,而不能算一个调试手段,暂时无视之。
4) 下载WDK内核开发开发包,我下载的是7600版本(已经集成了windbg,安装的时候选择完全安装)。下载VMware,我的是9.02。然后再下载一个xp镜像,你要用win7就下载win7。
5)安装虚拟机,安装WDK。接下来是创建管道,以及把虚拟机设置成调试模式启动:
a)打开WMware,不启动虚拟机电源开关,打开虚拟机设置,选择“添加”按钮,在出现的“添加硬件”向导中选择“串行端口”,点击“继续”,选择“输出到命名管道”,点击“完成”。此时在虚拟机设置选项卡可以看到添加了一个串行端口。
b)观察添加的串行端口是“串行端口2”还是“串行端口1”,一般网上都没提这点,而我虚拟机有点怪,是“串行端口2”,这里要注意,需要修改右侧“使用命名管道”项:把名称改为对于数值,串口2就改成“\\.\pipe\com_2”,第二项不动,第三项改为“另一端为运行程序”,再把下面的I/O模式给勾上。

c) 启动虚拟机,进入系统盘,找到boot.ini,去掉只读属性,打开,添加调试启动模式:
“multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /debug /debugport=com2 /baudrate=115200”

d) 右键“我的电脑”,进入设备管理器,选择COM端口:

要注意:这里的COM与刚刚虚拟机上建立的串行端口要对应,我是串行端口2,则这里选择COM2。
双击它,在“端口设置”选项卡中,将“每秒位数”设置为“115200”。
e)重启虚拟机,可以看到调戏启动项出来了,选择它进入系统:

f)回到物理机,建立任意目录,我是“C:\symbols”,开打windbg,打开“文件”->“符号文件路径”,输入如下串:“SRV*你设置的符号路径*http://msdl.microsoft.com/download/symbols”

g)关闭windbg,找到windbg路径,建立一个快捷方式,剪切到桌面,修改它的属性,在原来的目标串后面添加如下命令行参数:
“-b -k com:port=\\.\pipe\com_2,baud=115200,pipe”
注意:“\\.\pipe\com_2”为管道名称,自行对应修改
6)到这,虚拟机和windbg的配置就完成了,接下来build一个驱动来调试一下:
a)建立任意目录作为工程目录,我的是“D:\mydriver”
b)新建一个记事本为你,输入如下C代码:
#include <ntddk.h>
//提供一个Unload函数值是为了让这个程序能动态卸载,方便调试
VOID DriverUnload(PDRIVER_OBJECT driver)
{
//打印一句话
DbgPrint("first: Our driver is unloading...\r\n");
}
//DriverEntry,入口函数。相当于main
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
__asm ;
//这里只输出一句话
DbgPrint("first: Hello,my salary!");
//设置一个卸载函数,便于这个函数的退出
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
修改此文件名为first.c,具体意义不必理会,值注意一句话,这里的“__asm int 3”为中断指令,为了调试时用。
c)新建记事本文件,输入如下语句:
#下边这行指定生成驱动名字DDK_HelloWorld.sys
TARGETNAME=first
#下边这行指定生成文件的类型DRIVER指驱动
TARGETTYPE=DRIVER
#下边这行指定生成驱动所在的路径\SYS\DDK_HelloWorld.sys
TARGETPATH=SYS
#下边这行指定相关头文件所在目录路径
INCLUDES=$(BASEDIR)\inc;\
$(BASEDIR)\inc\wxp;\
##上边必空一行D:\WINDDK\3790.1830 等价$(BASEDIR)
#下边这行指定驱动源代码*.cpp或者*.c
SOURCES=first.c
修改此文件名为Sources(没有文件后缀名)。上面的赋值注意变通,主要有驱动名字,以及源代码文件的指定
d)新建记事本文件,输入如下语句:
# 此文件 一般情况下只有一行 并且不需要修改 不能有前导空格 !INCLUDE $(NTMAKEENV)\makefile.def
修改此文件名为makefile(没有文件后缀名)。这个文件估计也是给nmake使用的
e)准备工作完成,从开始菜单进入WDK的“Build Environment”->“windows xp”,这里将看到两个选项,一个是“x86 Checked Build Environment”,另一个是“x86 Free Build Environment”,前者相当于VC的debug,后者相当于release。选择前者。进入命令行模式
f)使用cd命令进入工程目录,开始build驱动项目,我的是“D:\mydriver”
d: cd mydriver build
g)build完成后将看到输出:

这里看到了一个错误,提示在21行。其实这个不是错误,只是一个警告,可以看到提示:编译了3个文件,生成了一个可执行文件。可以在右下角查看View Warnings,因为这个不是马上就会弹出警告信息的,如果看到是灰色的,可以先点击上面那一个选项:Check New

可以看到下图:

可见,这里的确是Warning(两个Warning = 一个error?我汗颜),既然是这样,那么就先不管它,要我现在看也不知道是什么警告。
到工程目录的sys\i386下,可以看到生成了2个文件,first.sys就是生成的驱动文件
7) 编译结束了,剩下的就是试着调试,打开虚拟机,选择调试启动项启动它(这里会卡一会,因为等待调试程序连接,不用管,直接切到物理机上来)。
8)使用桌面的快捷方式打开windbg,打开以后将看到:

命名管道已经打开,正在等待连接。
9)当连接上以后将看到:

这个窗口,最上面的是代码区,左下角是命令行输入已经对应输出窗口,右边是虚拟机目前的寄存器状态,这些窗口可以在view菜单项设置是否开启,我已经对他们排过版了。
10)现在可以看到,输出了一条自动中断指令int 3,回到虚拟机会发现整个系统已经被中断,鼠标按键完全没有反应。在命令行输入指令“g”让虚拟机继续跑动,在物理机将刚刚编译完成的first.sys驱动文件,以及驱动安装软件InstDrv.exe(这个软件之前没提,网上应该有很多资源下载)复制到虚拟机桌面,打开InstDrv.exe安装驱动并运行:

运行以后发现虚拟机再次假死,这是因为驱动文件代码中的int 3中断起了作用,回到物理机,发现:

输出了一个中断指令,这时可以在view选项卡选择Dissassemby开启反汇编窗口查看一下情况:

一切,之前熟悉的身影都冒出来了。
11)现在可以一路按F10单步运行下去,这里和C类似,F8和F11是步入,F11步出,F7运行到游标处。到这里初步的调试环境搭建,以及调试效果就出来了,以下是单步到驱动程序退出,然后回到虚拟机中卸载驱动后的输出状况:

以及:

《天书夜读:从汇编语言到windows内核编程》四 windows内核调试环境搭建的更多相关文章
- 《天书夜读:从汇编语言到windows内核编程》五 WDM驱动开发环境搭建
(原书)所有内核空间共享,DriverEntery是内核程序入口,在内核程序被加载时,这个函数被调用,加载入的进程为system进程,xp下它的pid是4.内核程序的编写有一定的规则: 不能调用win ...
- [内核编程] Windebug双机调试环境搭建
Windebug双机调试环境搭建 开始进行内核编程/驱动编程的调试工作是非常烦人的,由于程序运行与内核层不受操作系统的管控,所以容易引起主机蓝屏和崩溃是常有的事.这也就使得内核程序的调试成了一大 ...
- Windows下Lua+Redis 断点调试环境搭建==Linux下类似
Lua+Redis 断点调试环境搭建 windows环境,使用Redis,写lua脚本头疼的问题之一不能对脚本断点调试,google加上自己的摸索,终于搞定. 1.下载ZeroBraneStudio, ...
- Android内核漏洞利用技术实战:环境搭建&栈溢出实战
前言 Android的内核采用的是 Linux 内核,所以在Android内核中进行漏洞利用其实和在 一般的 x86平台下的 linux 内核中进行利用差不多.主要区别在于 Android 下使用的是 ...
- 《天书夜读:从汇编语言到windows内核编程》八 文件操作与注册表操作
1)Windows运用程序的文件与注册表操作进入R0层之后,都有对应的内核函数实现.在windows内核中,无论打开的是文件.注册表或者设备,都需要使用InitializeObjectAttribut ...
- 《天书夜读:从汇编语言到windows内核编程》六 驱动、设备、与请求
1)跳入到基础篇的内核编程第7章,驱动入口函数DriverEnter的返回值决定驱动程序是否加载成功,当打算反汇编阅读驱动内核程序时,可寻找该位置. 2)DRIVER_OBJECT下的派遣函数(分发函 ...
- windows平台CodeBlocks MinGW C++11开发环境搭建
前言: 本文是以单独下载codeblock编辑器跟MinGW编译器这种方式进行安装,下载带MinGW编译器的codeblocks版本安装配置方式跟这个类似. 一: 下载并安装MinGW 这个参考我写的 ...
- windows下基于sublime text3的nodejs环境搭建
第一步:先安装sublime text3.详细教程可自行百度,这边不具体介绍了. 第二步.安装nodejs插件,有两种方式 第一种方式:直接下载https://github.com/tanepiper ...
- HDP2.0.6+hadoop2.2.0+eclipse(windows和linux下)调试环境搭建
花了好几天,搭建好windows和linux下连接HDP集群的调试环境,在此记录一下 hadoop2.2.0的版本比hadoop0.x和hadoop1.x结构变化很大,没有eclipse-hadoop ...
随机推荐
- JAVA提高一:静态导入、可变参数、增强型for循环、装拆箱
国庆假期已结束,假期8天,全部在家带娃,体会到了妻子的不容易,需要好好努力来多赚钱了,言归正传.10月份开始进去JAVA 高级语法知识学习,本节复习学习的为:静态导入.可变参数.增强型for循环.装拆 ...
- Java web JavaScript DOM 编程
JavaScript DOM 编程 (1).DOM概述及分类 (2).DOM结构模型:XML DOM 和 HTML DOM 关系? (3).结点,结点树,结点属性与方法? 1.DOM是什么? d ...
- IDL 字符串
1.创建字符串 字符串和字符串数组通过赋值或函数方式来创建.在IDL字符串用" "或' '括起来表示. IDL> s1="abcdef" IDL> ...
- WPF 中模拟键盘和鼠标操作
转载:http://www.cnblogs.com/sixty/archive/2009/08/09/1542210.html 更多经典文章:http://www.qqpjzb.cn/65015.ht ...
- linux 下查找图片文件方法
通常是通过文件后缀名查找图片文件,如果没有文件后缀的图片或者伪造的图片文件,则这种判定方法将达不到要求.我们可以根据读取文件头进行图片文件类型的判定. 比较流行的图片文件类型有:jpg png bmp ...
- 转:stringstream的用法
[本文来自]http://www.builder.com.cn/2003/0304/83250.shtmlhttp://www.cppblog.com/alantop/archive/2007/07/ ...
- 第一篇bolg
仅以此篇谨记自己,以后加油
- HttpComponents 发送post get 请求
1.场景描述 使用Apache开源组织中的HttpComponents,完成对http服务器的访问功能. 2.HttpComponents项目的介绍 HttpComponents项目就是专门设计来简化 ...
- Windows7搭建Wamp环境
wamp:Windows + Apache + MySQL + PHP 首先,在D盘根目录下新建目录wamp,wamp下建目录www和bin,www目录作为网站文件入口目录,bin下建目录Apache ...
- LeetCode 371. Sum of Two Integers (两数之和)
Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Exam ...