存档

文章标签 ‘WinDbg’

使用Windbg寻找高CPU占用线程

2012年2月17日 没有评论

在一个任务中使用多线程编程,程序运行一段时间后就占满了CPU,严重拖慢系统运行速度。这里所说的高CPU,意思就是一个线程占用了一个CPU的大部分运行时间,如果是单核的CPU,表现为CPU占用近100%;相应的双核的话一个线程会占到50%的CPU。
我的电脑是双核四线程的CPU,所以当一个线程死循环的时候会占用掉25%的CPU时间。具体表现为:运行程序的最开始表现正常,随后会看到CPU占用上升至25%、50%、75%等。在这样的情况下我用Windbg Attach到目标进程,并通过!runaway[......]

继续阅读

分类: 逆向调试 标签: , , ,

一些Windbg命令

2011年10月16日 2 条评论

不是很多,以后再补充和完善。下面的命令是实际分析过程中比较常用的一些命令,抽出来做一个备忘。
vertarget
输出调试目标所在操作系统的信息
.lastevent
输出最后一个调试事件所在的进程、线程等简单信息
r [eax / eax = 1 / ZF]
显示所有寄存器、指定寄存器、修改制定寄存器、显示eFlags标志位
$name
伪寄存器,如$ip, $peb等,代表调试目标一些特殊结构。如果用在表达式中前面加上@
u / uf FunctionName
反汇编 / 反汇编整个函数
k[......]

继续阅读

分类: 逆向调试 标签:

Windbg事后调试

2011年10月14日 没有评论

dump文件生成
如果需要使用Windbg生成dump文件,可以使用.dump命令,该命令可以接/m或/f来生成minidump和fulldump,/m后面还可以接更多的命令控制,如/f控制生成内存dump,通常使用.dump /mf来生成dump,这样的minidump比fulldump包含更多的调试信息。
dump句柄信息
在minidump中如果要把句柄信息业dump出来(如句柄泄漏调试可能需要用到!handle命令),则需要加上/h参数,如.dump /mfh
事后调试器设置
事后调试器[......]

继续阅读

分类: 逆向调试 标签: , ,

句柄泄漏调试经验

2011年10月12日 5 条评论

句柄泄漏检测-简单
在调试之前首先确定是不是真的发生了句柄泄漏,简单的检测方法是通过任务管理器来查看进程的句柄数是不是居高不下,任务管理器默认不显示句柄数,要查看进程的句柄数需要先切换到进程选项卡,然后单击“查看”菜单,选择“选择列”,然后勾选“句柄数”。
句柄泄漏检测-更多信息
任务管理器只能简单检测句柄数,如果要获得更详细的信息,可以使用Process Explorer(官方下载地址为http://technet.microsoft.com/en-us/sysinternals/bb8966[......]

继续阅读

分类: 逆向调试 标签: , , ,

Windows SEH汇编版

2011年5月17日 没有评论

SEH,即Structured Exception Handling,中文为结构化异常处理。是Windows操作系统提供给程序设计者的强有力的处理程序错误或异常的武器。Ring3下fs:[0]指向TEB(Thread Environment Block)结构,打开WinDbg,查看_TEB结构:

nt!_TEB
+0×000 NtTib : _NT_TIB
+0x01c EnvironmentPointer : Ptr32 Void
+0×020 Cli[......]

继续阅读

分类: Win32 ASM 标签: , , ,

调试与反调试(二)——BeingDebugged

2011年4月21日 2 条评论

如果进程处于被调试状态,那么PEB里面的BeingDebugged标志会置位,《调试与反调试(一)——IsDebuggerPresent》中的IsDebuggerPresent就是这么实现的~不信?可以看网上流传的Windows 2000源代码,在“\win2k\private\windows\base\client\debug.c”里面可以看到,就是这么实现的:

BOOL
APIENTRY
IsDebuggerPresent(
VOID
)
 
/*[......]

继续阅读

PAGE_FAULT_IN_NONPAGED_AREA蓝屏问题

2011年2月26日 15 条评论

今天奇迹般的遇到了这个问题,蓝屏了无数次,代号为PAGE_FAULT_IN_NONPAGED_AREA。从名字来看像是在非分页内存中发生了缺页错误。
不是很明白,于是用WinDbg调试,在驱动卸载函数中调用IoDeleteSymbolicLink出了问题。IoDeleteSymbolicLink只有一个参数,于是原因可以锁定到这个符号链接上面。于是将鼠标移到UNICODE_STRING变量上,提示Buffer为“……memory read error at address 0x…&#[......]

继续阅读

微软未公开结构体是这样找到的

2011年2月16日 没有评论

对于刚入门Ring0的人往往对微软未公开结构感到好奇。既然连微软都没有在成型的文档中发布这些结构的组成,那么为什么网上还有那么多不成文档的网页记载着这些结构体呢?
也许有人会想到WRK。但是,WRK仅仅是执行体这一部分,而且,早在WRK发行之前那些结构体就被别人公布了。
其实这是通过微软的调试利器WinDbg来实现的(WinDbg的使用这里不再啰嗦)。这里需要下载到Windows系统的符号表,可以去微软的网站打包下载,也可以通过WinDbg来按需临时下载。有了符号表之后,通过WinDbg的dt命[......]

继续阅读

WinDBG调试断点命令详解

2010年12月23日 4 条评论

WinDBG 提供了多种设断点的命令:bp, bu, bm, ba。
bp命令是在某个地址下断点,可以bp 0x7783FEB,也可以bp MyApp!SomeFunction。对于后者,WinDBG会自动找到MyApp!SomeFunction 对应的地址并设置断点。 但是使用bp的问题在于:1)当代码修改之后,函数地址改变,该断点仍然保持在相同位置,不一定继续有效; 2)WinDBG 不会把bp断点保存工作空间中。所以,我比较喜欢用bu命令。
bu命令是针对某个符号下断点。 比如bu MyA[......]

继续阅读

WinDbg+VMware之kernel debugger failed initialization

2010年12月17日 没有评论

很遗憾在启动WinDbg的时候总是提示kernel debugger failed initialization。说是Failed to open \\.\pipe\com_1.系统找不到指定文件。说明串口打不开。
网上找了好久,发现可能存在很多原因:
首先,你要把物理机的COM1串口的波特率设置为115200,其他的默认。其次,你需要启动VMWare。我弄了好久都发现解决不了问题。
后来,我泪流满面了……我的虚拟机在正常的XP下,忘了进入Debug Mode,各种悲[......]

继续阅读