![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
windbg
文章平均质量分 68
花熊
毕业于西安交通大学
展开
-
37.windbg-获取结构体大小(常用的两种方式)
两种方式:dt -v:详细输出。这会输出结构的总大小和字段数量这样的附加信息。当它和-y选项一起使用时,所有的符号都会被显示出来,即使他们没有任何关联的类型信息。0:000> dt -v _image_nt_headersOGame!_IMAGE_NT_HEADERSstruct _IMAGE_NT_HEADERS, 3 elements, 0xf8 bytes +0x000原创 2013-01-17 10:24:53 · 5276 阅读 · 0 评论 -
54.windbg-a、.dvalloc (直接写反汇编和new内存,实例:加入附加的printf)
a(Assemble)a 命令对指令助记符进行汇编,并将指令代码的结果放入内存。如果没有指定地址,汇编会从指令指针的当前值所指向的地址开始。要汇编新的指令,可以输入需要的助记符并按下ENTER。要结束汇编,直接按下ENTER.dvalloc.dvalloc 命令使得Windows在目标进程中分配附加的内存。加入附加的printf以下是原创 2013-07-05 16:38:07 · 2601 阅读 · 0 评论 -
55.windbg-!dh、!lmi(显示映像的头部)
!dh!dh 扩展显示指定映像的头部。语法!dh [Options] Address !dh -h参数Options 下面的选项之一:-f显示文件头。 0:000> !dh kernel32 -fFile Type: DLLFILE HEADER VALUES 14C machine (i386) 4 numb原创 2013-07-15 15:07:29 · 2344 阅读 · 0 评论 -
56.windbg-s、#(搜索字符串、地址、汇编)
s(Search Memory)s 命令搜索内存查找指定模板1. 寻找内存泄露的线索。比如知道当前内存泄漏的内容是一些固定的字符串,就可以在 DLL 区域搜索这些字符串出现的地址,然后再搜索这些地址用到什么代码中,找出这些 内存是在什么地方开始分配的。 2. 寻找错误代码的根源。比如知道当前程序返回了 0x80074015 这样的一个代码,但是不原创 2013-07-16 15:28:55 · 10871 阅读 · 0 评论 -
57.windbg-MASM vs C++表达式
在 MASM 表达式中,任何符号的数值都是它的内存地址。在 C++ 表达式中,变量的数值就是它的实际值,不是地址。数据结构没有数值;它们必须声明为实际结构再使用。函数名或者任何其它入口点的值是内存地址,当作为函数指针。没有 C++ 数据类型与之对应的符号(例如没有修饰的模块名)会导致语法错误。 0:000> .exprCurrent expression evaluator: MASM -原创 2013-07-23 14:35:51 · 9157 阅读 · 0 评论 -
58.windbg-Verbose Output模式
ctrl+alt+v能切换详细模式的打开和关闭打开详细模式后,一些显示命令会产生更详细的输出,发送给调试器的每个模块加载操作都会被显示出来并且操作系统每次加载驱动或都DLL也会提示Verbose mode ON.0:006> G*** Exit threadThread exited: 183c.1f50, code 0OUTPUT_PROCESS: *** exi原创 2013-10-07 19:22:20 · 3376 阅读 · 0 评论 -
59.windbg-MASM表达式语法
调试器能够识别两种表达式类型:MASM表达式和C++表达式。和C++的区别默认用MASM表达式最大的区别:在MSAM表达式中,所有符号都被当作地址对待,C++表达式和真实的C++代码中一样,符号被当作适当的数据类型有这样的规律:MASM的符号值X,取它的指针大小的数据(poi(X)),刚好为C++的符号值Y,即poi(X) ==Y比如char* g_char = "原创 2013-10-07 20:11:14 · 1773 阅读 · 0 评论 -
60.windbg----as、$u0(固定别名、自定义别名)
-------------------------------------------------------------------------------------固定别名($u0~$u9)有10个固定别名。他们是$u0, $u1, ..., $u9。他们的等价字符串可以是不包含ENTER键的任意字符串。使用r (Registers)命令为固定别明指定等价字符串。定义原创 2013-10-08 10:34:28 · 2404 阅读 · 0 评论 -
61.windbg-跳过初始断点(调试技巧)
ntdll!LdrpDoDebuggerBreak+0x2c:7757054e cc int 30:000> kvChildEBP RetAddr Args to Child 0030f3c8 77550e00 7ffdf000 7ffd3000 775a714c ntdll!LdrpDoDebuggerBreak+0x2c (原创 2013-10-09 14:54:26 · 3377 阅读 · 0 评论 -
53.windbg-C++表达式语法
调试器能够识别两种表达式类型:MASM表达式和C++表达式。和MASM的区别默认用MASM表达式最大的区别:在MSAM表达式中,所有符号都被当作地址对待,C++表达式和真实的C++代码中一样,符号被当作适当的数据类型有这样的规律:MASM的符号值X,取它的指针大小的数据(poi(X)),刚好为C++的符号值Y,即poi(X) ==Y比如char* g_char =原创 2013-07-05 15:47:36 · 1907 阅读 · 0 评论 -
52.windbg-Call Function调试技巧(调用函数)
.call 命令使得目标进程执行一个函数。语法.call [/v] Function( Arguments ) .call /c .call /C .call /s Prototype Function( Arguments )指定函数是被当前进程的当前线程调用的。只支持 cdecl、 stdcall、 fastcall和thiscall 调用约原创 2013-07-03 21:04:38 · 4070 阅读 · 0 评论 -
51.windbg---Gflags(辅助工具)
C:\Program Files\Debugging Tools for Windows (x86)>gflags -p /enable L2.bin /full /unalignedpath: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options l2.bin: page heap enab原创 2013-06-20 15:50:27 · 3589 阅读 · 0 评论 -
38.windbg-调试技巧(创建进程即断下、r修改控制条件跳转)
创建进程时断下用于测试未到入口函数就崩的exe0:000> sxe cpr0:000> sx ct - Create thread - ignore et - Exit thread - ignore cpr - Create process - break epr - Exit process - break ld - Load module - output原创 2013-01-17 11:28:14 · 2492 阅读 · 0 评论 -
39.windbg-CPU基础(dg)
1. 标志寄存器 DF(Direction flag) 方向标志,为1时使用字符串指令每次操作后递减变址寄存器(ESI和EDI),为0时递增.CF位可以由STC和CLC指令来设置和清除,DF位可由STD和CLD指令来设置和清除(ST:set,CL: clear)随意写段代码测试: __asm { pushad int 3 CLC STC C原创 2013-01-31 17:58:08 · 1756 阅读 · 0 评论 -
40.windbg-调试技巧(win7下设置本机调试模式)
操作比较简单:1.开启调试:2.重启电脑3.File--kernel Debug...--Local,点击确定如提示NT symbols are incorrect, please fix symbols,用.symfix+设置下,再.reload /f即可原创 2013-02-18 18:23:44 · 5789 阅读 · 0 评论 -
41.windbg-调试技巧(解决Type information missing error for)
今天用vc6时,发现有些函数用x显示不了:0:000> x ThisCall!Cat::*Type information missing error for Cat::Fun0歪招:用bm直接下断点:0:000> bm ThisCall!Cat::* 1: 00401090 @!"ThisCall!Cat::Func1" 2: 00401060 @!"ThisC原创 2013-05-13 15:53:30 · 1990 阅读 · 0 评论 -
42.windbg-调试技巧(定长、不定长参数thiscall平衡堆栈方式不同)
C++程序的成员函数默认使用的调用约定是thiscall,这种约定是把this指针放到ECX寄存器中.This调用协定也是要求被调用函数负责清理栈,因此不支持可变数时的参数,当我们在C++类中定义了可变数量参数的成员函数时,偏译器会自动改为使用C调用约定,当这种调用时,编译器会将所有参数压入栈中,再将this指针压入栈:关键两点:1.this时,是被调用函灵敏清理栈 2.如果可变参数,则使用C原创 2013-05-13 17:46:18 · 1327 阅读 · 0 评论 -
43.windbg-.expr、n(设置默认的表达式语法、默认的数字基础0x、0n、0t、0y)
.expr.expr 命令指定默认的表达式求值器0:000> .exprCurrent expression evaluator: MASM - Microsoft Assembler expressions0:000> .expr /s masmCurrent expression evaluator: MASM - Microsoft Assembler expression原创 2013-05-28 17:37:33 · 2893 阅读 · 0 评论 -
49.windbg----$$(注释说明符)和*(注释行说明符)和.echo
$$(注释说明符)如果命令开头出现两个美元符号( $$ ),则该行剩下的部分被当成注释,除非碰到分号,$$ 关键字使得后面的文本被忽略掉,直到行末或者碰到分号。分号结束注释;分号后的文本被解析为标准的命令如果命令开头带星号( * )字符,则行中剩下的部分被当成注释,即使中间有分号0:000> r eax; $$ some text; r ebx; * more text; r原创 2013-06-13 15:25:41 · 2417 阅读 · 0 评论 -
50.windbg-.foreach循环输入(windbg script)
.foreach.foreach 关键字分析一个或多个命令的输出并将该输出中每一个值作为另一个或多个命令的输入.foreach [Options] ( Variable { InCommands } ) { OutCommands } .foreach [Options] /s ( Variable "InString" ) { OutCommands }原创 2013-06-14 11:24:06 · 2364 阅读 · 0 评论 -
62.windbg-p、t、pa、ta(单步步过、单步步入)
p|t =startAddr count可以让目标程序从指定的startAddr开始指行,注意,如果指定地址跳过了调整栈的代码,栈就会失去平衡count指定要单步执行的次数,如t 2就是两次运行t0:000> t 2eax=99e265e1 ebx=7ffd3000 ecx=00000000 edx=01b00370 esi=0026fc88 edi=0026fc80eip=0原创 2013-10-10 14:47:04 · 5359 阅读 · 0 评论 -
63.windbg-r?(使得伪寄存器获得任意类型信息)
r?命令可以让伪寄存器自动获取所赋参数的类型(仅在指派伪寄存器时) 使得伪寄存器获得类型信息。可以使用任何类型如,我们知道@$peb的类型是_PEB:0:000> dt ntdll!*PEB* ntdll!_PEB ntdll!_PEB_LDR_DATA0:000> ? @$pebEvaluate expression: 2147344384原创 2013-10-21 13:10:57 · 1387 阅读 · 0 评论 -
64.windbg-!idt(内核)
!idt扩展显示指定的中断分配表(interrupt dispatch table (IDT))中的中断服务例程(interrupt service routine (ISR))-a 没有指定IDT时,会以简短的格式显示目标机上所有处理器的IDT。如果指定了-a,则显示所有IDT的ISR。 简短方式:kd> !idtDumping IDT:37: 806e6864原创 2014-03-02 21:36:56 · 1948 阅读 · 0 评论 -
75.windbg-.printf(打印字符串)
.printf(打印字符串)原创 2017-06-05 10:39:13 · 2137 阅读 · 0 评论 -
33.Windbg-VMware+windbg搭建双机调试(增加virtualKD)
虚拟机环境1.xp虚拟机用的是XP系统,找到XP系统打开系统盘(比如C盘),找到Boot.ini,去掉这个文件的只读属性,用记事本打开Boot.ini[boot loader]timeout=30default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS[operating systems]multi(0)disk(0)rdisk(0原创 2013-01-04 20:46:15 · 7601 阅读 · 0 评论 -
76.windbg-高效排错的一个小示例(windbg保留的上下文优化后的结果)
高效排错的一个小示例(优化后的结果)原创 2017-06-05 15:26:54 · 676 阅读 · 0 评论 -
16.driverbase-PAE-(虚拟地址转换成物理地址详细示例)
PAE是Physical Address Extension的缩写,即物理地址扩展。简单来说,就是把IA-32处理器的寻址能力从原来的4GB扩展到64GB。寻址4GB空间,要求物理地址的宽度为32位。类似的,要寻址64GB空间,那么物理地址的宽度就是36位。因为这个原因,PAE又被称为PAE-36bit。一般电脑都可以轻松看出是不是使用了PAE,最简单是看系统属性:如果不启用PAE原创 2014-03-08 16:02:35 · 2583 阅读 · 0 评论 -
77.windbg-!drvobj、.devstack(驱动对象,设备栈,AttachedDevice)
!drvobj、.devstack(驱动对象,设备栈)演示原创 2017-08-10 11:58:08 · 2156 阅读 · 0 评论 -
31.windbg-怎么让windbg随进程加载自动启动(映像劫持技术)
1.在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options下,建一个项,比如DNF,就叫DNF.exe,2.再在右边建一个 子项叫Debugger 类型REG_SZ,填上windbg的地址,3.再用windbg -I(大写)设置为默认调试器,之后就可以直接原创 2012-08-30 21:59:33 · 4477 阅读 · 0 评论 -
73.windbg-调试UnhandleExceptionHandler
代码如下:LONG __stdcall _UnhandledExceptionFilter(_EXCEPTION_POINTERS* ExceptionInfo){ MessageBox(0,NULL,NULL,0); return EXCEPTION_EXECUTE_HANDLER;}int main(){ SetUnhandledExceptionFilter(&_Un...原创 2017-06-04 14:20:41 · 1451 阅读 · 0 评论 -
78.windbg-symstore 创建符号存储
windows调试工具集提供了symstore工具,这个工具可以扫描文件夹,收集所有可执行模块及其相应的符号,然后将它们组织成一种特殊的结构,运行在调试器中的符号客户端可以识别到这种结构,这些符号文件是根据它们的名字以及在字符串RSDS后面的GUID来组织的,二进制文件则是根据它们的名字以及编译时间戳来建立索引由于存在两种类型的符号,因此这个工具可以生成两个符号库,公有和私有:SymStore 事...原创 2018-06-03 17:19:36 · 1040 阅读 · 0 评论 -
74.windbg-wt(运行并统计函数的调用)
wt(运行并统计函数的调用)原创 2017-06-04 21:14:55 · 1602 阅读 · 0 评论 -
17.windbg-!cs、~~[TID](经典死锁)
经典死锁原创 2012-05-16 13:15:14 · 17173 阅读 · 2 评论 -
34.windbg-k*实例分析(查看调用栈分析)
#include "stdafx.h"int fun0(int i){ return i;};int fun1(int i){ return fun0(i);}int _tmain(int argc, _TCHAR* argv[]){ fun1(10); return 0;}代码如上我们在test!fun1下个断点,g运行,断下来后:原创 2013-01-07 15:18:59 · 4476 阅读 · 0 评论 -
65.windbg-!process显示进程(内核)
!process 0 0 显示进程列表:kd> !process 0 0**** NT ACTIVE PROCESS DUMP ****PROCESS 825b7830 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000 DirBase: 02b40020 ObjectTable: e1003e00 H原创 2014-03-02 22:34:27 · 6319 阅读 · 0 评论 -
66.windbg-.process切换进程(内核)
.process.process 命令指定要用作进程上下文的进程(Set Process Context).process显示当前进程的EPROCESS,这里显示当前进程为test.exekd> .processImplicit process is now 821f5da0kd> ? @$procEvaluate expression: -2111873632 =原创 2014-03-02 22:55:02 · 8816 阅读 · 0 评论 -
67.windbg-!thread、.thread(内核)
!thread扩展显示目标系统中线程包括ETHREAD块在内的摘要信息。该命令只能在内核模式调试下使用!thread [-p] [-t] [Address [Flags]] -p 显示拥有该线程的进程的摘要信息。 -t 包含这个选项时,Address是线程ID,而不是线程地址。 Address 指定目标机上线程的16进制地址。如果Address为-1或省略,则表示当前线程。 Fl原创 2014-03-02 23:14:59 · 5936 阅读 · 0 评论 -
68.windbg-.formats(转换成各种进制)
.formats 命令在当前线程和进程上下文下对一个表达式或符号进行求值,并以多种数字格式显示出来。0:002> .formats 000ad3a0Evaluate expression: Hex: 000ad3a0 Decimal: 709536 Octal: 00002551640 Binary: 00000000 00001010 11010011 101原创 2014-03-05 23:45:40 · 1755 阅读 · 0 评论 -
69.windbg-.browse(打开一个新的command 窗口)
.browse r eax.browse 将会显示新的命令浏览窗口和运行给出的命令原创 2014-04-08 13:30:04 · 1541 阅读 · 0 评论 -
70.windbg---!pool
kd> !pool 0x84885000Pool page 84885000 region is Nonpaged pool84885000 is not a valid small pool allocation, checking large pool...unable to get pool big page table - either wrong symbols or poo原创 2014-07-18 19:38:28 · 2273 阅读 · 0 评论