- 博客(29)
- 资源 (38)
- 收藏
- 关注
原创 29.windbg-!heap(堆状态)
以下以windbg启动calc为调试结果:!heap!heap 扩展显示堆使用信息,控制堆管理器中的断点,检测泄露的堆块,搜索堆块或者显示页堆(page heap)信息。!heap -h列出当前进程的所有堆:0:000> !heap -hIndex Address Name Debugging options enabled 1: 000a0000
2012-05-31 17:14:15 15122
原创 28.windbg-堆的手工分析
大多数(并不是所有)高层的内存管理器都使用了Windows堆管理器,而堆管理器又会使用虚拟内存管理器:下图给出了在Windows中支持的内存管理器以及它们之间的关系: 当进程启动时,堆管理器将自动创建一个新堆,叫做默认的进程堆,但是new/delete运算符以及malloc/free等API仍使用CRT堆来满足它们的内存需求,有些进程还会创建一些额外的堆(通过HeapCreate)以将
2012-05-31 11:56:05 4888
原创 27.windbg-内存破坏实例分析
以下实例来自AWD代码:/*++Copyright (c) Advanced Windows Debugging (ISBN 0321374460) from Addison-Wesley Professional. All rights reserved. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRA
2012-05-25 15:00:44 4526
原创 26.windbg-sx、ld(设置异常处理、设置模块加载时断下)
1.sxsx* 命令用来控制被调试的程序发生某个异常或特定事件时,调试器要采取的动作sx 命令显示当前进程的异常列表和所有非异常的事件列表,并且显示调试器遇到每个异常和事件时的行为。sxr 命令将所有异常和事件过滤器的状态重设为默认值。命令被清除、中断和继续选项被重设为默认值,等等。sx这个命令的输出信息可以分为三个部分:第一部分是事件处理与相应处理模式的交互,第二部分是标准的...
2012-05-24 15:01:12 7132
原创 25.windbg-!gle、g(错误码、g系列)
!gle!gle 扩展显示当前线程的最后一个错误码。这个太好记了,getlasterror取首字母:0:002> !gleLastErrorValue: (Win32) 0 (0) - LastStatusValue: (NTSTATUS) 0 - STATUS_WAIT_0-all 显示目标系统中每个用户模式线程的最终错误。如果在用户模式下省略该参数,调试器显示当前线程的最
2012-05-23 17:10:41 3011
原创 24.windbg-bp、 bm、 bu、 bl、 bc、 ba(断点、硬件断点)
以下以skinhgy为例,windbg附加运行1.bp 命令是在某个地址下断点, 可以 bp 0x7783FEB 也可以 bp MyApp!SomeFunction 。 对于后者,WinDBG 会自动找到MyApp!SomeFunction 对应的地址并设置断点。 但是使用bp的问题在于:1)当代码修改之后,函数地址改变,该断点仍然保持在相同位置,不一定继续有效; 2)Wi
2012-05-23 14:59:46 14369
原创 23.windbg-dv(显示局部变量)
以下以自己的控件库skinhgy为例,windbg启动1.dv(display Local variable)dv 命令显示当前作用域的所有局部变量的名字和值。 0:000> x Simple1Demo!CSimple1DemoApp::InitInstance00640080 Simple1Demo!CSimple1DemoApp::InitInstance (void)
2012-05-23 11:50:36 8688
原创 22.windbg-ln、伪寄存器(Pseudo-Register Syntax)、自定义伪寄存器
1.lnln 命令显示给定地址处的或者最近的符号。ln表示list near,ln命令将尽可能地给出与特定地址相关的符号,如果没有符号能够精确地与这个地址匹配,那么调试器将通过指针算法对靠近这地址的符号进行运逄,并返回运算结果符号0:000> ln 01012475(01012475) calc!WinMainCRTStartup | (0101263c) cal
2012-05-22 16:41:22 3222
原创 21.windbg-.lastevent、!analyze(dump分析、异常错误码查询)
以下不经说明都以calc强制附加windbg1.lastevent.lastevent 命令显示最近一次发生的异常或事件。1.lastevent.lastevent 命令显示最近一次发生的异常或事件。0:000> .lasteventLast event: 1534.f4c: Break instruction exception - code 80000003 (first ch
2012-05-22 12:03:52 14017
原创 20.windbg-.dump(转储文件)
1.dump.dump 命令创建一个用户模式或内核模式崩溃转储文件。程序崩溃(crash)的时候, 为了以后能够调试分析问题, 可以使用WinDBG要把当时程序内存空间数据都保存下来,生成的文件称为dump 文件。 步骤:1) 打开WinDBG并将之Attach 到crash的程序进程2) 输入产生dump 文件的命令直接用.dump -?可以看到它的简单说明:0:000>
2012-05-21 15:24:20 11577
原创 19.windbg-.symfix、.srcPath、.srcnoisy、log文件(符号文件、源文件、log文件)
1.symfix.symfix命令自动将符号路径设置来指向Microsoft 符号存储。比如,我原来设置的symbol file path为:那么使用了.symfix之后:0:000> .symfixNo downstream store given, using C:\Program Files\Debugging Tools for Windows (x86)\sym
2012-05-20 12:30:08 5167
原创 3.asm-汇编的补码和负数互换
经常用到JMP指令,如何算一个负数的补码呢,研究了下calc,直接输入负数,再转换成16进制或二进制,它们显示的就是补码了:比如:-100,转成16进制就成了9C(当然要选字节类型),那从9C再转回十进制就成了156了,那怎么么把9C转成-100呢,用负数的补码定义的逆运算吧,9C先转为二进制:10011100,再减1,为10011011,再NOT取反:1100100,再换成10进制就是1
2012-05-18 12:07:55 1540
原创 4.ring0-API拦截方法一:PE简介
自己的知识分享文章,整理到博客上 ---------hgy notes.一.PE简介PE全名Portable Executable File Format(可移植的执行体),是目前window主流可执行文件格式, 是一种通用于所有window平台和所有CPU上的文件格式二.PE文件的定义PE文件的类型定义集中在WinNT.h这个类中,打开WinNT.h,再搜索Image Forma
2012-05-17 17:23:11 3437 1
原创 18.windbg-临界区leak案例
示例代码:#include "windows.h"#include #include CRITICAL_SECTION g_cs;DWORD WINAPI ThreadProc1(LPVOID lpParameter){ EnterCriticalSection(&g_cs); printf("thread1\n"); return 0;}DWORD WINAPI Th
2012-05-16 14:44:05 2563 1
原创 16.windbg-.cxr、.frame、dt(查找设置设备上下文、切换局部上下文、查找结构体)
这里使用一个debug程序:.frame.frame命令指定使用哪个局部上下文(作用域)来解析局部变量,或者显示当前的局部上下文帧序号(frame number)是堆栈帧在堆栈回溯中的位置。可以使用k (Display Stack Backtrace)命令或者Calls 窗口查看堆栈回溯。第一行 (当前帧) 的帧序号是0。后面的行分别是1、2、3等等。0:000> kn # Ch
2012-05-15 14:27:13 9009
原创 15.windbg-dds、dps、dqs、PE文件解析
以下默认windbg加载calc程序1.d*sdds、dps和dqs命令显示给定范围内存的内容,它们是把内存区域转储出来,并把内存中每个元素都视为一个符号对其进行解析,dds是四字节视为一个符号,dqs是每8字节视为一个符号,dps是根据当前处理器架构来选择最合适的长度比如要看看当前stack 中保存了哪些函数地址,就可以检查ebp 指向的内存0:000> dds ebp000
2012-05-14 17:33:27 7542
原创 14.windbg-k、u、x(堆栈查看、汇编查看、函数查找)
kk*命令显示给定线程的调用堆栈,以及其他相关信息~0 k表示打印0号线程的调用堆栈,直接用k表示打印当前线程的调用堆栈0:002> ~0kChildEBP RetAddr 0007fddc 77d191be ntdll!KiFastSystemCallRet0007fdfc 010021b0 USER32!NtUserGetMessage+0xc0007ff1c 010125e9...
2012-05-14 16:15:06 25035 1
原创 13.windbg-!runaway、~、|(控制进程、线程切换)
!runaway!runaway命令显示每个线程消费的时间Bit 0 (0x1) 让调试器显示每个线程消耗的用户模式时间(user time),默认不加就是0x1Bit 1 (0x2) 显示每个线程消耗的内核时间(kernel time)。 Bit 2 (0x4) 显示每个线程从创建开始经历了多少时间。 就是三者的组合:1 2 3 4 5 6 70:002> !runaway Us
2012-05-14 13:44:26 8225
原创 12.windbg-!address、!vadump、!vprot(读取内存状态)
!address!address 扩展显示目标进程或目标机使用的内存信息这个学习起来比较简单:我们直接使用!address -?就可以找到它的使用说明:0:000> !address -?!address - prints information on the entire address space!address -?
2012-05-14 11:13:15 12102 2
原创 11.windbg-d、e 读写内存
以下所有例子都以CALC程序为示例----hgy413 notes.1 dd*命令显示给定范围内存的内容。d, da, db, dc, dd, dD, df, dp, dq, du, dw, dW, dyb, dyd (Display Memory)如果省略掉Range ,命令将会从上一条内存查看命令结束的位置开始。这使得可以连续的进行内存查看。d这种显示的格式和最近一次d*命
2012-05-13 17:33:22 7881
原创 10.windbg-r
以下的所有示例都是加载calc程序1 lmflmf可以列出当前进程中加载的所有DLL文件和对应的路径给个例子:0:001> lmfstart end module name01000000 0101f000 calc C:\WINDOWS\system32\calc.exe10000000 100b0000 safemon C:\P
2012-05-13 16:35:06 2501
原创 3.ring0-__STDCALL inline HOOK 和 __declspec(naked) inline HOOK区别
两者差别1.__STDCALL inline HOOK是针对整个函数的hook,好处是变量清楚,坏处时肯定只能在函数头hookNTSTATUS __stdcallNewNtQueryDirectoryFile( IN HANDLE FileHandle, IN HANDLE Event OPTIONAL, ....... )
2012-05-13 15:58:07 4509
原创 9.windbg-!sym、.reload、!chksym
以下示例以windbg加载calc.exe为例:1.!sym!sym扩展控制显示详细的符号加载和符号提示。.!sym :不带参数表示显示当前的详细符号加载和符号提示的设置状态给个示例:0:001> !sym!sym - noisy mode - symbol prompts on其实细心点可以看出sym的四种状态了,noisy/quiet -prompts/promp
2012-05-12 22:17:28 9229
原创 2.OD-C++的虚函数表遍历
结合OD学习下虚函数表,加深印象对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。 在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了 这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候
2012-05-11 19:25:10 2579
原创 0.c++-static_cast、reinterpret_cast、dynamic_cast、等转换
static_cast:可以实现C++中内置基本数据类型之间的相互转换。如果涉及到类的话,static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数class A{};class B:public A{};class C{};int main(){ A* a=new A; B* b; C* c; b=static_cast(a); // 编译不会报错,
2012-05-10 19:36:16 1578
原创 0.c++-显式打印、改变lib库加载顺序(/verbose:lib)
今天编译了下代码:提示以下错误,因为nafxcw.lib是MFC的,所以必须首先被编译1>正在链接…1>nafxcw.lib(afxmem.obj) : error LNK2005: “void * __cdecl operator new(unsigned int)” (??2@YAPAXI@Z) 已经在 LIBCMT.lib(new.obj) 中定义测试下,在Link–>cmd中加
2012-05-10 19:35:09 1552 1
原创 8.windbg-vertarget、lm
1.g可以让目标程序继续执行,ctrl+break可以挂起正在运行的目标程序回到调试模式 2.vertargetvertarget 命令显示目标机的Microsoft Windows操作系统版本给个示例:0:011> vertargetWindows XP Version 2600 (Service Pack 3) MP (4 procs) Free x86 compati
2012-05-09 21:42:28 16374 1
原创 5月学习计划
1.学习COM,掌握基础2.继续巩固汇编,对win32汇编了解进一步加深3.平均每天抽一小时学习cocoa,4.主要目标是能把windbg掌握。 5.7:看完COM深入内幕前四章,代码重新写过,5.8看完COM深入内幕5-7章,代码重新写过,5.9看完COM深入内幕8-9章,代码重新写过,开始windbg命令小结,继续X86汇编温习.5.10重写了COM的聚合,继续
2012-05-06 18:46:05 1325
debug.exe在win7-64下模拟
2015-08-25
SetStretchBltMode测试
2011-09-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人