|  |  |  |  |  |  | 
					            
						            
							            
								            |  | 
	《软件调试》的示例程序帖子发起人: skyworth   发起时间: 2008-07-01 22:17 下午   回复: 22
 
	 
		
			| 
					
						|         | 
						      
						        | 帖子排序: |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-01, 22:17 下午 |  
											| 
													 skyworth 
 
   注册: 2008-06-07
 发 贴: 55
 |  |  
											| 
													
														|   | 
																
																	| 一开始执行的是自己编译的程序,发现无法按分支单步执行,而是老老实实的按高级语言的单步执行。以为是编译器的原因,检查生成的汇编代码,没发现什么可以的地方。后下载了随书附带的示例程序,调试的过程中,发现依然有问题。检查EFLAGS寄存器的值,发现TF位已经置1。查阅Intel手册,发现处理器的DEBUGCTRL_MSR为0x1D9,与例子相同。我的处理器为PE2160。这下就彻底糊涂了。 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-03, 00:00 上午 |  
											| 
													 skyworth 
 
   注册: 2008-06-07
 发 贴: 55
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 检查了一下ZwSystemDebugControl的返回值,为-1073741822,返回负值,应该是调用失败了。 
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-03, 22:42 下午 |  
											| 
													 skyworth 
 
   注册: 2008-06-07
 发 贴: 55
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 貌似这个API在Windows Server 2003 SP2之后就不可用了,ft 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-03, 23:29 下午 |  
											| 
													 格蠹老雷 
 
   注册: 2005-12-19
 发 贴: 1,303
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 这应该就是根源,建议你在XP系统上做一下。如果一定要在Windows Server 2003 SP2或者更高的版本上做,那么需要有一个驱动来访问MSR寄存器。这样的小驱动程序很多。 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-04, 00:15 上午 |  
											| 
													 skyworth 
 
   注册: 2008-06-07
 发 贴: 55
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 呵呵,关键是我的机器上一直就没有Windows XP的,看上去只有写驱动这一个办法了,网上下的东西,呵呵,如果不是确信安全,一般不敢运行,更何况是内核级别的东西。只好自己写一个试试看吧。以前写过很简单linux下的驱动的,Windows下的应该不是太难。只是希望别偏太远,最后弄成了驱动开发学习就不好了^_^. 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-22, 18:40 下午 |  
											| 
													 shl 
 
   注册: 2008-07-10
 发 贴: 14
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 是处理器的问题,我的是PE2140,同样记录不到任何东西 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-22, 18:41 下午 |  
											| 
													 shl 
 
   注册: 2008-07-10
 发 贴: 14
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-24, 22:21 下午 |  
											| 
													 格蠹老雷 
 
   注册: 2005-12-19
 发 贴: 1,303
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| LBR是P6(Pentium Pro)就开始支持的功能。你能描述一下具体的现象么,在什么环境下,怎么记录不到?关于BTS,可以通过IA32_MISC_ENABLE MSR寄存器(地址为416-十进制)来检查是否支持,如果位11为0则支持,为1则不支持。 以我现在用的笔记本为例,其CPU是P6系统的奔腾M,因此支持LBR。 lkd> !lbr.lbrAccess LBR (Last Branch Recording) registers of IA-32 CPU.
 Version 1.0.0.2 by Raymond
 MSR_DEBUGCTLB=1
 LBR bit is cleared now.
 MSR_LASTBRANCH_TOS=3
 MSR_LASTBRANCH_3: [804ff190] nt!WRMSR+0
 MSR_LASTBRANCH_3: [8065ef6e] nt!KdpSysWriteMsr+1c
 MSR_LASTBRANCH_2: [8065ef5e] nt!KdpSysWriteMsr+c
 MSR_LASTBRANCH_2: [805374da] nt!_SEH_prolog+3a
 MSR_LASTBRANCH_1: [805374a0] nt!_SEH_prolog+0
 MSR_LASTBRANCH_1: [8065ef59] nt!KdpSysWriteMsr+7
 MSR_LASTBRANCH_0: [8065ef52] nt!KdpSysWriteMsr+0
 MSR_LASTBRANCH_0: [8060d364] nt!NtSystemDebugControl+356
 MSR_LASTBRANCH_7: [8060d356] nt!NtSystemDebugControl+348
 MSR_LASTBRANCH_7: [8060d0c3] nt!NtSystemDebugControl+b5
 MSR_LASTBRANCH_6: [8060d0b6] nt!NtSystemDebugControl+a8
 MSR_LASTBRANCH_6: [8060d0a1] nt!NtSystemDebugControl+93
 MSR_LASTBRANCH_5: [8060d09c] nt!NtSystemDebugControl+8e
 MSR_LASTBRANCH_5: [8060d08d] nt!NtSystemDebugControl+7f
 MSR_LASTBRANCH_4: [8060d089] nt!NtSystemDebugControl+7b
 MSR_LASTBRANCH_4: [8060d082] nt!NtSystemDebugControl+74
 LBR bit is set now.
 使用本地内核调试,然后执行 !cpuinfo命令就可以读到CPU的系列号: lkd> !cpuinfoCP  F/M/S Manufacturer  MHz PRCB Signature    MSR 8B Signature Features
 0  6,13,8 GenuineIntel 1862 0000002000000000  0000002000000000 a0033fff
 其中的的6是系列6,13是型号,8是Stepping(版本) 使用version命令可以显示操作系统和WinDBG的详细版本号 lkd> versionWindows XP Kernel Version 2600 (Service Pack 2) UP Free x86 compatible
 Product: WinNt, suite: TerminalServer SingleUserTS
 Built by: 2600.xpsp_sp2_qfe.070227-2300
 Kernel base = 0x804d7000 PsLoadedModuleList = 0x805535a0
 Debug session time: Thu Jul 24 22:22:47.229 2008 (GMT+8)
 System Uptime: 0 days 1:46:45.299
 Local KD
 Microsoft (R) Windows Debugger Version 6.9.0003.113 X86Copyright (c) Microsoft Corporation. All rights reserved.
 command line: '"C:\windbgbeta\windbg.exe" '  Debugger Process 0x1740 dbgeng:  image 6.9.0003.113, built Fri Mar 21 04:29:34 2008
 [path: C:\windbgbeta\dbgeng.dll]
 dbghelp: image 6.9.0003.113, built Fri Mar 21 04:28:43 2008
 [path: C:\windbgbeta\dbghelp.dll]
 DIA version: 21024
 Extension DLL search Path:
   
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-25, 17:31 下午 |  
											| 
													 shl 
 
   注册: 2008-07-10
 发 贴: 14
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 我的是PE2140,我是在驱动中实现了LBR。0x1D9中写 ( 1 << 0) | ( 1 << 1 ),在1号中断中实现记录信息,可以记录得到,但,现在的问题是,开启LBR+BTF后,只记录OD调试的程序的分支,并不是像我理解的“记录所有程序的分支”,请问,为何?我做了一个小录象,记录了我这一诡异现象。如果方便,请作者能过目,帮我解答一二,谢谢。 
 另外,BTS是什么都记录不到,通过检测IA32_MISC_ENABLE MSR位是支持的,在往0x600中写0xC0[( 1 << 6) | ( 1 << 7),TR和BTS位],写入成功的话,应该是开始记录所有信息的,对么?
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-26, 09:53 上午 |  
											| 
													 格蠹老雷 
 
   注册: 2005-12-19
 发 贴: 1,303
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| SHL,关于记录到的分支,LBR只能记录最近几次的分支,因为CPU“最近”就是执行你的调试程序,所以你看到的内容就是那样。这是正常的,你观察我上面给出的例子,记录的也是CPU执行WinDBG的本地内核调试任务(NtSystemDebugControl和WRMSR)时的动作。 LBR能记录的分支次数较少,这也是它的最大局限。
 对于第二个问题,BTS寄存器的地址和设置方法是与CPU型号有关的。你应该先用CPUID命令检查CPU型号,然后根据型号采取动作,就像清单5-5那样。
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-26, 12:34 下午 |  
											| 
													 shl 
 
   注册: 2008-07-10
 发 贴: 14
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| to:Raymond 
 不好意思,可能是我没描述清楚
 首先,我是用中断的方式,每次取一个值,这样来循环取,可以取到一个程序的所有分支,突破了LBR的"局限"
 
 但是,当我开启驱动之后,需要用OD打开一个程序,并且单步一下或者是运行,驱动才开始记录.而且,他只记录OD打开的这个程序的所有分支,而,通过双击运行这样就不开始记录.
 
 不知道我的问题描述清楚了没有.谢谢
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-26, 17:22 下午 |  
											| 
													 格蠹老雷 
 
   注册: 2005-12-19
 发 贴: 1,303
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 还是不太清楚你的想法。在一个多任务的操作系统中,CPU在很多个任务和中断处理函数间忙碌。你怎么能保证读LBR的前一刹那就是在执行你用OD(OlleyDbg??)跟踪的程序呢? 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-27, 09:08 上午 |  
											| 
													 shl 
 
   注册: 2008-07-10
 发 贴: 14
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 不是我的想法,是我这里的现象 我觉得很诡异
 
 现象:开启LBR之后,记录不到任何数据,当OllyDBG跟踪某个程序的时候,它才开始记录数据,并且,只记录这个被跟踪的程序的分支
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-31, 19:05 下午 |  
											| 
													 forgot 
 
   注册: 2008-07-31
 发 贴: 1
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 跑这里来问了啊, BTF开启之后TF被视为是 Single Step On Branches,不是分支指令就不会 int1。 To Raymond:    所谓突破限制是指,hook 所有处理器的 int1 isr ,可以在中断里重新设置TF,然后根据 fs 判断进程记录一次LBR。 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2008-07-31, 20:28 下午 |  
											| 
													 王宇 
 
  
   注册: 2007-05-08
 发 贴: 306
 | 
													
														| Re: 关于《软件调试》4.3.4 按分支单步执行。 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| WOW... 
 forgot 是 No.8 Man 等的那位吗?
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
		
			|  | 
						
							| 
									
										| 总页数 1 第 2 页  [共有 23 条记录] | 1 2 > |  |  |  
		
			| 高端调试 » 图书 » 《软件调试》的示例程序 » Re: 关于《软件调试》4.3.4 按分支单步执行。 |  |  
 |  |  |  |