《天书夜读:从汇编语言到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 ...
随机推荐
- webpack html
调用了原模板 修改路径 使html放在JS外面 可以传递参数 多个html指定对应chunks 除了某些模块其余的都被引入
- C#一款比较美观的验证码
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System. ...
- Linux Redis集群搭建与集群客户端实现(Python)
硬件环境 本文适用的硬件环境如下 Linux版本:CentOS release 6.7 (Final) Redis版本: Redis已经成功安装,安装路径为/home/idata/yangfan/lo ...
- cocos2dx - 在MFC中使用cocos2dx
本节主要讲一下如何在MFC窗口中使用cocos2dx 在做比较复杂的游戏,有时需要通过一些工具来编辑生成关卡或者特效,技能等的配置文件.为了方便配置,需要可以通过修改参数直观得到显示的效果.这就需要将 ...
- 重学C语言---04字符串和格式化输入/输出
1.程序示例 //talkback.c一个能为你提供一些信息的对话框 #include <stdio.h> #include <string.h> //提供strlen函数原型 ...
- VB6文件操作自定义函数合集之一
'--与文件及文件夹操作相关的函数 '--必须引用FSO的ACTIVE OBJECT Dim strList As String '--列表串,返回文件列表 '================ '-- ...
- Android Stuido 提高开发效率的插件
好久没有更新博客了,最近搞个listview搞得半死不活的,心累~~ 今天带来的是Android Studio插件的整理,全是我已经安装使用的,写这篇博文的目的也是因为我怕我自己给忘记怎么用(尴尬) ...
- Web Fragment在项目中的使用
Web Fragment 是什么 - 它是在 servlet 3.0开始支持的,可以把一个dy web项目拆分为多个项目,解耦合,使其在项目中开发效率提高,下面我演示简单的项目创建过程 用eclips ...
- Java 线程基本知识
线程 线程和进程 进程 : 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程 : 线程是进程中的一个执行单元(执行路径 ...
- Linux入门(14)——Ubuntu常用快捷键
打开终端:ctrl + alt + T 左右分屏:ctrl + win + 箭头左或者箭头右 显示桌面:Ctrl + win + D 切换工作区:ctrl + alt + 箭头左或者箭头右 新建文件夹 ...