求助,如何让windbg下断点在初始断点之前,更早的断下来

查看: 1015|回复: 0
求助,如何让windbg在初始断点之前,更早的断下来呢
阅读权限10
各位大牛好,今天在看windows内核原理与实现时,看到了内存管理器那里,所以准备windbg调试下MmInitSystem,看下它在内核加载时,阶段0初始化的具体过程,
& && &可是调试时,每次都无法在阶段0断点下来(bu nt!MmInitSystem),通过图片的参数可以看到,这里断下来后,已经是阶段1的内存管理器初始化了,
MmInitSystem.PNG (98.38 KB, 下载次数: 0)
13:50 上传
然后又准备在KiSystemStartUp处拦截系统,使其断下来,可是每次都是断到nt!RtlpBreakWithStatusInstruction这个地方
1.PNG (105.51 KB, 下载次数: 0)
13:51 上传
& & 通过windbg也可以看到,该函数是在nt!ExpInitializeExecutive+0x349(0x806baf50)处被调用的,通过代码往上看,可以发现,MmInitSystem是在nt!ExpInitializeExecutive+0x29e(0x806abe4e)处被调用的,也就是说MmInitSystem的调用地址比初始断点地址的地址更早,先执行的阶段0初始化,然后执行的初始断点,所以无法断下来,请问各位大牛有没有什么办法,让windbg更早的断下来啊,
& & 之前问了一个朋友,说是通过KdInitSystem,可以让windbg更早的断下来,可是bu nt!KdInitSystem后,根本无法拦截住初始断点,而且通过参数可以看到,就算KdInitSystem被执行,也是略过了阶段0,断到了阶段1
KdInitSystem.PNG (106.81 KB, 下载次数: 0)
13:51 上传
&&现在能用的办法都用了,不知道各位大牛,还有没有其他办法,先在这里谢过了。。。
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分!
活动推荐 /1
为促进论坛学习交流、相互分享经验心得,吾爱破解论坛将于近期筹备举行“吾爱破解第四届视频动画教程大赛”!
免责声明:吾爱破解论坛所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
( 沪ICP备号 )
Powered by Discuz! X3.2
Comsenz Inc.4222人阅读
首先说说应用层的调试吧.当我们在调试windows可执行程序的时候,通过将PE文件头中的ImageBase和AddressOfEntryPoint相加,从而得出第一条指令的地址.针对这个地址下断之后目标程序就中断在了了入口处.但是这个方法在驱动调试的时候却有心无力.这是因为可执行程序都是首先被加载到各自的私有地址空间,他们不会有地址冲突.然而驱动程序运行在内核里面,所有的驱动程序共享一个地址空间.所以需要重新设定基地址.
1.利用bu命令下延迟断点.
之前提到过,bu可以针对符号下断点.这里是用bu下延迟断点的意义在于即使目标驱动没有被加载,windbg也允许我们针对符号设置断点.当新加载驱动程序后,windbg就会检查驱动程序中是否包含了设置了延迟断点的函数.如果找到了,就把断点替换为地址形式,然后再设置断点.笔者的测试驱动程序为TestDriver.sys.
0: kd& .sympath
Symbol search path is: E:\Symbol\windbg SE:\Code\Vc_code\Ring3Ring0\Driver\objchk_wxp_x86\i386
Expanded Symbol search path is: e:\symbol\e:\code\vc_code\ring3ring0\driver\objchk_wxp_x86\i386
0: kd& .srcpath
Source search path is: E:\Code\Vc_code\Ring3Ring0\Driver
在VMware客户机里,安装驱动后,敲下 net start TestDevice之后,系统理所应当的被断下来了.
Breakpoint 0 hit
TestDriver!DriverEntry:
f8c4ee10 8bff
假如我们调试的驱动并不是以DriverEntry作为入口函数,bu针对符号下断也就没有了意义.但是我们可以使用模块加偏移的方式下断.假设TestDriver的入口函数的偏移为0xFB4.直接bu TestDriver+0xFB4即可.
2.在系统调用DriverEntry之前下断.
现在来看看我们的程序,中断在了DriverEntry之中.我们能不能在进入DriverEntry之前下断.首先我们dv和esp看一下当前的栈
pDriverObject = 0x81f346e8
pRegistryPath = 0x &\REGISTRY\MACHINE\SYSTEM\ControlSet001\Services\TestDevice&
status = 0n8
1: kd& r esp
esp=f8af9c88
1: kd& dd f8af9c88 L8
f346e8 00000
dv命令只显示了参数,还是用esp靠谱一点,至少给出了我们返回地址0x.接下来该ln命令登场了
(80581d0a)
nt!IopLoadDriver+0x66d
nt!IopLoadUnloadDriver
返回地址位于nt!IopLoadDriver+0x66d处,直接反汇编一下吧,看看再哪里调用了DriverEntry
0: kd& bu TestDriver!DriverEntry
) (TestDriver!DriverEntry)
1: kd& u nt!IopLoadDriver+0x660
nt!IopLoadDriver+0x660:
edi,dword ptr [ebp-80h]
8058236d ffb570ffffff
dword ptr [ebp-90h]
dword ptr [edi+2Ch]
b8d68ffffff
ecx,dword ptr [ebp-98h]
dword ptr [ebp-54h],eax
dword ptr [ecx],eax
0x处是nt!IopLoadDriver+0x66d.前面的call指令占了3个字节.所以我们下断在nt!IopLoadDriver+0x66a就能在进入DriverEntry之前中断下来.
3.使用事件异常
先来看看系统中提供了哪些事件异常吧.直接sx下
ct - Create thread - ignore
et - Exit thread - ignore
cpr - Create process - ignore
epr - Exit process - ignore
ld - Load module - output
ud - Unload module - ignore
ser - System error - ignore
ibp - Initial breakpoint - break
iml - Initial module load - ignore
out - Debuggee output - output
这里我们要设置一下Load module事件为break, sxe -set enable & & & &sxd - set disable & & & & & & & sxi -set ignore & & & & & sxn -set output
1: kd& sxe ld
ct - Create thread - ignore
et - Exit thread - ignore
cpr - Create process - ignore
epr - Exit process - ignore
ld - Load module - break
ud - Unload module - ignore
ser - System error - ignore
ibp - Initial breakpoint - break
iml - Initial module load - ignore
out - Debuggee output - output
加载我们的驱动吧,在load module的时候系统中断
然后我们找到模块基址,并在入口处下断即可.
1: kd& lm n
module name
f8b9c000 f8b9d100
WMILIB.SYS
f8b9e000 f8b9f580
intelide intelide.sys
dmload.sys
vmmouse.sys
swenum.sys
f8bba000 f8bbbf00
Fs_Rec.SYS
f8bbe000 f8bbf080
RDPCDD.sys
ParVdm.SYS
f8bfc000 f8bfde00
vmmemctl vmmemctl.sys
f8c4e000 f8c4f300
TestDriver TestDriver.sys
解析一下pe文件
1: kd& !dh -a f8c4e000
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
14C machine (i386)
6 number of sections
5077C38E time date stamp Fri Oct 12 15:15:26 2012
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
102 characteristics
Executable
32 bit word machine
OPTIONAL HEADER VALUES
10B magic #
9.00 linker version
C00 size of code
280 size of initialized data
0 size of uninitialized data
FB4 address of entry point
480 base of code
----- new -----
然后bp TestDriver+0xFB4即可让系统中断在我们驱动程序的入口处.
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:179397次
积分:2273
积分:2273
排名:第6783名
原创:50篇
转载:34篇
评论:36条
(7)(1)(1)(9)(2)(4)(7)(3)(12)(14)(18)(5)(1)WinDbg调试教程
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
WinDbg[1].入门.3.基本调试操作
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口求助,如何让windbg在初始断点之前,更早的断下来_百度知道
求助,如何让windbg在初始断点之前,更早的断下来
提问者采纳
  windbg命令  bp+address&#47,清理所有的断点。 bc *,但是这个地址所在的模块可以没有被加载,但是这个地址所在的模块必须已经被加载  bu+address&#47,断点对于软件调试来说是非常重要的。 bc 1: 列出所有已经加载的断点和地址  bc,与bd左右相反。  bd  断点是认为加上的: 使一个断点无效: 使一个断点有效,这一篇主要介绍使用windbg调试软件时。  bl。  ba,程序执行到一个语句之前暂停下来的地方: 内存访问断点,如何加断点: 清理断点。  be,清理1号断点,即延迟加载的模块;符号地址
在address指令处加断点,程序会断住,当访问这个内存地址时(一般是数据);符号地址
在address指令处加断点
其他类似问题
windbg的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁laokaddk 的BLOG
用户名:laokaddk
文章数:983
评论数:88
访问量:1449637
注册日期:
阅读量:4240
阅读量:2303
阅读量:3169
[匿名]51cto游客:
51CTO推荐博文
1252人学习
1715人学习
2610人学习
&& 条件断点(condition breakpoint)的是指在上面3种基本断点停下来后,执行一些自定义的判断。
& 在基本断点命令后加上自定义调试命令,可以让调试器在断点触发停下来后,执行调试器命令。每个命令之间用分号分割。
语法格式如:
0:000&&bp&Address&"j&(Condition)&'OptionalCommands';&'gc'&"
0:000&&bp&Address&".if&(Condition)&{OptionalCommands}&.else&{gc}"
这两条是等价的.
更好理解.&
0:000&&bp&`mysource.cpp:143`&"j&(poi(MyVar)&0n20)&'';&'gc'&"&0:000&&bp&`mysource.cpp:143`&".if&(poi(MyVar)&0n20)&{}&.else&{gc}"
若MyVar大于20则不stop,
否则stop下来进行调试.
MyVar符号表示符号所在的内存地址,而不是符号的数值,相当于C语言中的 &操作符的作用。Windbg命令poi的作用是取这个地址上的值,相当于C语言中的*操作符.因此这里取得MyVar的值.
伪寄存器,帮助保存调试的中间信息
考虑这样的情况,如果要记录某一个函数被执行了多少次,应该怎么做?简单的做法就是修改代码,在对应的函数入口做记录。可是,如果要记录的函数是系统API呢?
设置寄存器&& 条件断点
当eax内的值为0xa3时断点Sop. 没问题,Hah.
0:000&&bp&mydriver!myFunction&"j&@eax&=&0xa3&&'';'gc'"&0:000&&bp&mydriver!myFunction&".if&@eax&=&0xa3&&{}&.else&{gc}"
但以下就不一定了,当eax中人值为0xc0004321时,
不一定会断下来.
原因是内核态时,MASM会对EAX中的值进行符号扩展.
那么0xc0004321&&会变成0xFFFFFFFFc0004321&&
这样当然断不下来啦。
0:000&&bp&mydriver!myFunction&"j&@eax&=&0xc0004321&&'';'gc'"&0:000&&bp&mydriver!myFunction&".if&@eax&=&0xc0004321&&{}&.else&{gc}"
如何处理呢?看看下面就知道了.
0:000&&bp&mydriver!myFunction&"j&(@eax&&&0x0`ffffffff)&=&0x0`c0004321&&'';'gc'"&0:000&&bp&mydriver!myFunction&".if&(@eax&&&0x0`ffffffff)&=&0x0`c0004321&&{}&.else&{gc}"
爽吧,高位清0!
下面的命令可以统计VirtualAllocEx被执行了多少次:
bp /1 /c @$csp @$g
bp kernel32!VirtualAllocEx "r
\"function executes: %d times \",@$t0;.g"
这里用到的$t0就是Windbg提供的伪寄存器。可以用来存储中间信息。这里用它来存储函数执行的次数。r命令可以用来查看,修改寄存器(CPU寄存器和Windbg的伪寄存器都有效)的值。随便挑一个繁忙的进程,用这个命令设定断点后观察:
0:009& bp kernel32!VirtualAllocEx "r
\"function executes: %d times \",@$t0;.g"0:009& gfunction executes: 1 timesfunction executes: 2 times function executes: 3 times function executes: 4 times…
& 哈哈,这确实是一个好方法.
了这篇文章
类别:未分类┆阅读(0)┆评论(0)}

我要回帖

更多关于 windbg 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信