内核调试工具笔记

http://bbs.pediy.com/thread-201125.htm 转



小白真诚分享不是装逼,大神勿喷!同是小白人,多赞多快乐!
作者:精灵(^_^)/淘气鬼
Windows调试员工具包自带有4个不同的调试器
?微软控制台调试器:cdb.exe          用于调试用户模式的应用程序运行于基本的控
?NT符号调试器   NTSD.exe          命令行制台
?微软内核调试器    KD.exe          用于系统内核调试
?微软windows 内核调试 Windbg.exe   窗口类型系统内核调试

配置CDB.exe
1.建立调试环境
2.获取必要的符号文件

调试环境由三个环境变量组成
① _NT_SOURCE_PATH  目标二进制源代码文件路径
② _NT_SYBOL_PATH   符号文件目录根节点路径
③ _NT_DEBUG_LOG_FILE_OPEN 指定用于记录调试会话框日志文件
符号文件由两部分组成
① 共有符号信息:包含应用程序的函数名、地址、每个局部变量的描述,复合数据类型
② 私有符号信息:表述类似于局部变量的程序元素,是源代码执行到机器指令映射更加方便,容易
文件符号路径:
   SRV*C:\Symbols*http://msdl.microsoft.com/download/sysbols
CDB.exe调试用户模式应用程序方式
① CDB.exe启动应用程序               例如:cdb.exe FileName.exe
② 将CDB.exe附加至已经运行的进程里cdb.exe -p ProcessID /cdb.exe -pn FileName.exe 
③ CDB.exe针对某个进程进行非入侵式调试     cdb.exe -pv -p ProcessID
                                             Cdb.exe -pv -pn FileName.exe

以下命令均在windbg下执行
调试命令行解释及示例:
bl                列举已存在的断点
bc breakpoint      删除指定断点
bp  FunctionName 在指定的函数起点中设置断点
bp               当前的地址(EIP值)下断点

示例:           依次执行以下命令
bp               现在当前位置下断点
bp WriteFile       给WriteFile函数起点下断点
bl               得到如下结果
bc 0,1            删除ID为0 ,1断点
bl               得到空列表结果

-g 忽略程序的入口断点     
-G 忽略程序的终点
CTRL B 组合件 再ENTER 紧急逃生出口,有效阻止系统崩溃
g 执行到下一个断点
t 执行下一条指令,单步步入F8/F11(相当于OD的F7)
p 执行到下一条指令,单步步过 F10(相当于OD的F8)
gu 执行到当前函数结束并返回到上一函数处
q 退出
检查符号命令
x module!symbol     报告指定符号的地址
x*!                列举当前加载的所有模块
x module!*          列举指定模块所有的符号及其地址
x module!symbol*    列举所有与”arg”通配符过滤器匹配的符号
例如:依次输入以下命令行
0:000> x*!          列举当前加载的所有模块
start             end                 module name
00000000`00400000 00000000`00417000   image00000000_00400000   (deferred)             
00000000`74a60000 00000000`74a68000   wow64cpu   (deferred)             
00000000`74a70000 00000000`74acc000   wow64win   (deferred)             
00000000`74ad0000 00000000`74b0f000   wow64      (deferred)             
00000000`76f30000 00000000`770d9000   ntdll      (export symbols)       C:\Windows\SYSTEM32\ntdll.dll
00000000`77110000 00000000`77290000   ntdll32    (deferred)

0:000> x ntdll*!
00000000`76f311f0 ntdll!RtlWalkHeap (<no parameter info>)
00000000`76f313a0 ntdll!RtlpEnsureBufferSize (<no parameter info>)
00000000`76f318a0 ntdll!RtlDeleteAce (<no parameter info>)
00000000`76f31b24 ntdll!vsnwprintf_s (<no parameter info>)
00000000`76f31c00 ntdll!RtlCreateActivationContext (<no parameter info>)
00000000`76f31ec0 ntdll!isalpha (<no parameter info>)
00000000`76f31ef0 ntdll!ultoa (<no parameter info>)
…………

0:000> x ntdll!RtlWalkHeap           报告指定符号的地址
00000000`76f311f0 ntdll!RtlWalkHeap (<no parameter info>)

0:000>  x ntdll!RtlWalkHeap*        列举所有与”arg”通配符过滤器匹配的符号
00000000`76f311f0 ntdll!RtlWalkHeap (<no parameter info>)

lm                列举所有已加载的所有模块
!lmi*              扩展命令接收以模块名或者基地址为参数 以显示模块的相关信息
lm v               同上
dt                 显示类型命令               
例如:依次输入以下命令行
0:000> lm          列举所有已加载的所有模块
start             end                 module name
00000000`00400000 00000000`00417000   image00000000_00400000   (deferred)             
00000000`74a60000 00000000`74a68000   wow64cpu   (deferred)             
00000000`74a70000 00000000`74acc000   wow64win   (deferred)             
00000000`74ad0000 00000000`74b0f000   wow64      (deferred)             
00000000`76f30000 00000000`770d9000   ntdll      (export symbols)       C:\Windows\SYSTEM32\ntdll.dll
00000000`77110000 00000000`77290000   ntdll32    (deferred)             
0:000> !lmi*       扩展命令接收以模块名或者基地址为参数 以显示模块的相关信息
No export lmi* found
0:000> lm ntdll
Unknown option ‘d‘
start             end                 module name
00000000`76f30000 00000000`770d9000   ntdll    ntdll.dll    Sat Nov 20 21:11:21 2010 (4CE7C8F9)
0:000> lm v       扩展命令接收以模块名或者基地址为参数 以显示模块的相关信息
start             end                 module name
00000000`00400000 00000000`00417000   image00000000_00400000   (deferred)             
    Image path: image00000000`00400000
    Image name: image00000000`00400000
    Timestamp:        Sun Apr 05 19:54:38 2015 (5521227E)
    CheckSum:         00000000
    ImageSize:        00017000
    Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4
00000000`74a60000 00000000`74a68000   wow64cpu   (deferred)             
    Image path: C:\Windows\SYSTEM32\wow64cpu.dll
    Image name: wow64cpu.dll
    Timestamp:        Tue Aug 21 02:48:10 2012 (5032866A)
    CheckSum:         000048A0
    ImageSize:        00008000
    File version:     6.1.7601.17932
    Product version:  6.1.7601.17932
    File flags:       0 (Mask 3F)
    File OS:          40004 NT Win32
    File type:        2.0 Dll

反汇编命令
u                 反汇编当前地址开始的8条指令
u address          反汇编指定地址开始的8条指令
u start end          反汇编从指定地址到另一个指定地址的指令
例如:依次输入以下命令行
0:000> u
ntdll!CsrSetPriorityClass+0x40:
00000000`76fdcb60 cc              int     3
00000000`76fdcb61 eb00       jmp     ntdll!CsrSetPriorityClass+0x43 (00000000`76fdcb63)
00000000`76fdcb63 4883c438        add     rsp,38h
00000000`76fdcb67 c3              ret
00000000`76fdcb68 90              nop
00000000`76fdcb69 90              nop
00000000`76fdcb6a 90              nop
00000000`76fdcb6b 90              nop
0:000> u 74a70000  反汇编指定地址开始的8条指令,74a70000是wow64win的基址
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Windows\SYSTEM32\wow64win.dll - (出现这个,是因为我还没配置文件符号表路径)(配置方式:文件==》文件符号表路径==》输入:srv*c:\symbolslocal*http://msdl.microsoft.com/download/symbols;D:\Symbols   c:\symbolslocal文件符号暂存地方;http://msdl.microsoft.com/download/symbols  微软文件符号表服务器;D:\Symbols 文件符号表自行解压的地方(在不联网的时候可以自行匹配文件符号))
wow64win:
00000000`74a70000 4d5a            pop     r10
00000000`74a70002 90              nop
00000000`74a70003 0003            add     byte ptr [rbx],al
00000000`74a70005 0000            add     byte ptr [rax],al
00000000`74a70007 000400          add     byte ptr [rax+rax],al
00000000`74a7000a 0000            add     byte ptr [rax],al
00000000`74a7000c ff              ???
00000000`74a7000d ff00            inc     dword ptr [rax]

0:000> u 74a70000 74a7000a         反汇编从指定地址到另一个指定地址的指令
wow64win:
00000000`74a70000 4d5a            pop     r10
00000000`74a70002 90              nop
00000000`74a70003 0003            add     byte ptr [rbx],al
00000000`74a70005 0000            add     byte ptr [rax],al
00000000`74a70007 000400          add     byte ptr [rax+rax],al
00000000`74a7000a 0000            add     byte ptr [rax],al

数据显示命令
db addressRange    显示16进制数据及ASCII字节值(默认数据为128个字节)
dw addressRange   显示16进制及ASCII字值
dd addressRange    显示16进制及ASCII码双字
dps addressRange   显示和解析指针表
dg start end        显示给定地址范围的段描述符
.formats   XXXX  将一个数列出他的相关进制的表示
r                 显示当前所有通用寄存器的各寄存器的当前值

0:000> db 74a70000  显示pe DOS头文件 16进制数据及ASCII字节值(默认数据为128个字节)
00000000`74a70000  4d 5a 90 00 03 00 00 00-04 00 00 00 ff ff 00 00  MZ..............
00000000`74a70010  b8 00 00 00 00 00 00 00-40 00 00 00 00 00 00 00  [email protected]
00000000`74a70020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00000000`74a70030  00 00 00 00 00 00 00 00-00 00 00 00 f0 00 00 00  ................
00000000`74a70040  0e 1f ba 0e 00 b4 09 cd-21 b8 01 4c cd 21 54 68  ........!..L.!Th
00000000`74a70050  69 73 20 70 72 6f 67 72-61 6d 20 63 61 6e 6e 6f  is program canno
00000000`74a70060  74 20 62 65 20 72 75 6e-20 69 6e 20 44 4f 53 20  t be run in DOS 
00000000`74a70070  6d 6f 64 65 2e 0d 0d 0a-24 00 00 00 00 00 00 00  mode....$.......

0:000> dw 74a70000  显示16进制及word 类型ASCII字值
00000000`74a70000  5a4d 0090 0003 0000 0004 0000 ffff 0000
00000000`74a70010  00b8 0000 0000 0000 0040 0000 0000 0000
00000000`74a70020  0000 0000 0000 0000 0000 0000 0000 0000
00000000`74a70030  0000 0000 0000 0000 0000 0000 00f0 0000
00000000`74a70040  1f0e 0eba b400 cd09 b821 4c01 21cd 6854
00000000`74a70050  7369 7020 6f72 7267 6d61 6320 6e61 6f6e
00000000`74a70060  2074 6562 7220 6e75 6920 206e 4f44 2053
00000000`74a70070  6f6d 6564 0d2e 0a0d 0024 0000 0000 0000

0:000> dd 74a70000  显示16进制及ASCII码双字
00000000`74a70000  00905a4d 00000003 00000004 0000ffff
00000000`74a70010  000000b8 00000000 00000040 00000000
00000000`74a70020  00000000 00000000 00000000 00000000
00000000`74a70030  00000000 00000000 00000000 000000f0
00000000`74a70040  0eba1f0e cd09b400 4c01b821 685421cd
00000000`74a70050  70207369 72676f72 63206d61 6f6e6e61
00000000`74a70060  65622074 6e757220 206e6920 20534f44
00000000`74a70070  65646f6d 0a0d0d2e 00000024 00000000

0:000> dps 76fdcb60 76fdcb6b 显示和解析76fdcb60 到76fdcb6b范围内的指针表
00000000`76fdcb60  c338c483`4800ebcc
00000000`76fdcb68  90909090`90909090

0:000> .formats 516adcf  实现数据进制转换
Evaluate expression:
  Hex:     00000000`0516adcf
  Decimal: 85372367
  Octal:   0000000000000505526717
  Binary:  00000000 00000000 00000000 00000000 00000101 00010110 10101101 11001111
  Chars:   ........
  Time:    Fri Sep 15 10:32:47 1972
  Float:   low 7.08489e-036 high 0
  Double:  4.21796e-316

使用内核调试器的4中调试方法 
      
?双机调试 (通过连接双主机进行调试)
    这种方式使用道具多,损耗大,恢复慢,但调试真实,执行命令完整。
?本地内核调试
    损耗小,但内核执行命令少
?分析崩溃转储
    只是分析系统崩溃时系统机制转存当前内存的信息,系统分析常用的技能
?虚拟机调试
    在物理机上安装虚拟机,以实现双机调试功能,解决了双机调试道具多,损耗大,恢复慢的问题。虚拟机调试现在已经成为最长用的调试方式,所以一下将详细介绍在虚拟机调试

调试命令

CTRL+C        取消调试器命令
以下三个命令结合起来 实现恢复目标系统正常,并退出调试
bc *
g
CTRL+B  ENTER

lm n            LoadModule 列举已加载模指令 n为列举数量 如果单纯的lm 则列举全                                         部已加载的模块
!process 0 0      !process Process Flag    显示指定进程的详细 Flag为5位大小的值,0显示最少,31最多  Process 可以是基址
.process address   切换到指定地址所属的进程为当前进程
!peb            扩展命令
例如:依次输入以下命令行
0:000> lm n
start             end                 module name
00000000`00400000 00000000`00417000   image00000000_00400000 image00000000`00400000
00000000`74a60000 00000000`74a68000   wow64cpu wow64cpu.dll
00000000`74a70000 00000000`74acc000   wow64win wow64win.dll
00000000`74ad0000 00000000`74b0f000   wow64    wow64.dll   
00000000`76f30000 00000000`770d9000   ntdll    ntdll.dll   
00000000`77110000 00000000`77290000   ntdll32  ntdll32.dll 
因为配置符号表,上述几个暂时无法实例,请见谅!
           敬请期待下一期精灵(^_^)/淘气鬼 成长笔记讲解,谢谢!!

时间: 2024-11-12 23:15:37

内核调试工具笔记的相关文章

C++windows内核编程笔记day07_day08,可视化建菜单、加速键使用、绘图等

可视化操作创建的菜单,加载到窗口. 方法1:注册时指定菜单 wce.lpszMenuName=MAKEINTRESOURCE(IDR_MENUMAIN);//数字形式的资源ID转换为字符串形式的资源 方法2: //创建窗口时加载菜单资源 HMENU menumain= LoadMenu(g_hinstance,MAKEINTRESOURCE(IDR_MENUMAIN)); menumain 传入 CreateWindowEx();//倒数第三个参数 窗口指定小图标: 1.注册时指定 wce.hI

C++windows内核编程笔记day09_day10,对话框和窗口基本控件等的使用

//设置字体颜色 SetTextColor(hdc,RGB(255,0,0)); //窗口背景 //wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); //wce.hbrBackground=CreateSolidBrush(RGB(0,0,255)); //设置字体背景 SetBkColor(hdc,RGB(0,0,200)); //设置字体背景模式 SetBkMode(hdc,TRANSPARENT);//字体背景透明 //创建字体,成功返回字体,失败返回

Linux 2.6 内核阅读笔记 信号

2014年8月3日 信号处理程序调用过程 当一个进程接收到一个信号时,需要暂停进程执行转去执行专门的信号处理函数(如果定义了这个信号的专门处理函数的话),然后再继续执行进程代码. 所有的信号处理都是通过内核函数do_signal进行的,do_signal如果发现需要处理的信号,并且这个信号有专门的处理函数,就需要调用这个用户态的函数,这是通过handle_signal来处理的.执行信号处理函数是非常复杂的任务,因为在用户态和内核态来回切换需要特别谨慎地处理栈里的内容,在当前进程恢复"正常&quo

Linux 2.6 内核阅读笔记 中断和异常

2014年7月24日 中断门.陷阱门及中断门 中断是可以禁止的,可以通过告诉PIC停止对某个中断的发布.被禁止的中断是不会丢失的,在解除禁止后又会发送到CPU上. 禁止中断和屏蔽(mask)中断的不同之处是屏蔽是忽略掉某个中断,而禁止相当于延迟发送. Intel提供了三种类型的中断描述符:任务门.中断门及陷阱门描述.linux使用与inten稍有不同的细分分类和术语,把他们进行如下分类: 中断门:用户态进程不能访问的一个intel中断门(DPL为0),所有的linux中断处理程序都通过中断门在内

Linux 2.6 内核阅读笔记 内存管理

2014年7月29日 buddy分配算法 内核需要为分配一组连续的页框提供一种健壮.高效的分配策略.分配连续的页框必须解决内存管理中的外碎片(external fragmentation).频繁的请求和释放不同大小的一组连续页框,必然导致分配页框的块分算来许多小块的空闲页框无法被一次性大量分配使用. linux内核采用著名的伙伴系统算法来解决外碎片问题.该算法的核心思想是把所有的空闲页框分成11个链块表.每个链块表的大小分别为1,2,4,8,16,32,64,128,256,512和1024个连

CodeIgniter3 内核学习笔记四@Benchmark.php

自动启用的系统基准测试类,位于core/Benchmark.php 用于计算两个标记点之间的时间差,基准测试总是在框架被调用的那一刻开始,在输出类向浏览器发送最终的视图之前结束. 这样可以显示出整个系统执行的精确时间 Benchmark.php CodeIgniter3 内核学习笔记四@Benchmark.php

C++windows内核编程笔记day11 win32静态库和动态库的使用

windows库程序: 静态库: 源代码被链接到调用的程序或动态库,被调用时,代码最少有1份,文件后缀.LIB 动态库: 函数被程序或其他动态库调用,被调用时,代码只有1份,文件后缀.DLL 静态库(C语言): 创建时,选择文本类型文件,输入Clib.c,设置输出路径 ../lib/Clib.lib int Clib_add(int a,int b) { return a+b; } 同一上工作区,建立控制台程序(.c文件)调用静态库: #include<STDIO.H> #pragma com

C++windows内核编程笔记day13 进程、线程与信号量

Windows进程 进程是一个容器,包含程序执行需要的代码.数据.资源等信息, windows进程的特点: 每个进程都有自己的ID号 每个进程都有自己的地址空间,进程之间无法访问对方的地址空间. 每个进程都有自己的安全属性 每个进程至少包含一个线程. 获取和释放环境信息 GetEnvironmentStrings FreeEnvironmentStrings 获取或设置 本程序的环境变量 GetEnvironmentVariable SetEnvironmentVariable 示例: char

C++windows内核编程笔记day14 其他线程同步技术

线程同步技术: 原子锁 临界区(段) 互斥 事件 信号量(线程示例时已经使用过) 可等候定时器 使用范围:原子锁<临界区<互斥 效率:    原子锁>临界区(用户态)>互斥(内核态) 一般用临界区. //等候多个信号 DWORD WaitForMultipleObjects( DWORD nCount,             // number of handles in array CONST HANDLE *lpHandles,  // object-handle array