debug常用命令解析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

debug常用命令解析

1.!address eax查看对应内存页的属性

2.vertarget 显示当前进程的大致信息

3.!peb 显示process Environment Block

4.lmvm 可以查看任意一个dll的详细信息

例如:0:026 lmvm msvcrt (deferred)表示察看msvcrt.dll的信息,但是没有加载 symbol可以通过.reload命令来加载

5.reload /!sym 加载符号文件

6.lmf 列出当前进程中加载的所有dll文件和对应的路径

0:018> lmf

7.r 命令显示和修改寄存器上的值

r命令显示和修改寄存器上的值

0:018> r 显示寄存器的值

0:018> r eax=0 修改了寄存器,把eax的值修改为0x0

8.d命令显示esp寄存器指向的内存

如下

0:018>d esp

用dd命令直接指定054efc14地址

0:018>dd 054efc14

注意:第二个d表示DWORD格式,此外还有db(byte),du(Unicode),dc(char)等等。

数据查看指令 d{a|b|c|d|D|f|p|q|u|w|W}

d{b|c|d|D|f|p|q}分别是显示:

byte&ASCII,

double-word&ASCII,double-word,double-precision,float,pointer-sized,quad-word 数据;

DA用于显示ASCII,DU用于显示UNICODE;

BYB,BYD,显示binary和Byte及binary和DWORD

补充一个DV,用于查看本地变量用的

9.e命令可以用来修改内存地址

跟d命令一样,e命令后面也可以跟类型后缀,比如ed命

令表示用DWORD的方式修改。下面的命令把054efc14地址上的值修改为11112222。

0:018>ed 054efc14 11112222

修改后可以用dd命令来查看内存。

0:018>dd 0543fc14 L4 L4参数指定内存区间的长度为4个DWORD,这样输出只有1行,

而不是8行了。

10.s 命令用来搜索内存具体见help文档

11.!runaway 可以显示每一个线程的cpu消耗

0:018> !runaway 结果如下:

0:83c 0 days 0:00:00.406

13:bd4 0 days 0:00:00.046

10:ac8 0 days 0:00:00.046

24:4f4 0 days 0:00:00.031

上面输出的第一列是线程的编号和线程ID,后一列对应的是该线程在用户态模式中的

总的繁忙时间。

在该命令加上f参数,还可以看到内核态的繁忙时间,当进程内存占用率比较高的时候 ,通过该命令可以方便的找到对应的繁忙线程。

12.~ 命令是用来切换目标线程

0:018> ~ 可以显示线程的信息

0:018> ~0s把当前的线程切换到0号线程,也就是主线程,切换后提示符会变为0:000.

13.~* 命令列出当前进程中的所有线程的详细信息

14.~*kb命令列出所有线程的堆栈

15.k 命令用来显示当前线程的堆栈,如下

0:018> k

跟d命令一样,k后面也可以跟很多后缀,比如kb kp,kn,kv,kl等,这些后缀控制了 显示的格式和信息。

栈指令k[b|p|P|v]

这四条指令显示的内容类似,但是每个指令都有特色,KB显示三个参数,Kp显示所有的参数,但需要Full Symbols或Private PDBSymbols支持。KP与Kp相似,只是KP将参数换行显示了。Kv用于显示FPO和调用约定,KD,用于显示Stack的Dump,在跟踪栈时比较有用。

这些指令区分大小。

16.u命令把指定地址上的代码翻译成汇编输出

0:018> u 7739d023

USER32!NtUserWaitMessage:

7739d023 b84a120000 mov eax,0x124a

7739d028 ba0003fe7f mov edx,0x7ffe0300

7739d02d ff12 call dword ptr [edx]

7739d02f c3 ret

如果符号文件加载正确,可以用uf命令直接反汇编整个函数,比如uf USER32! NtUserWaitMessage

17.x 查找符号的二进制地址如下

0:018> x msvcr!printf

77bd27c2 msvcrt!printf =

上面的命令找到了printf函数的入口地址在77bd27c2

0:001> x ntdll!GlobalCounter

7c99f72c ntdll!GlobalCounter =

上面的命令表示ntdll!GlobalCounter这个变量保存的地址是7c99f72c。

注意:符号对应的是变量和变量所在的地址,不是变量的值,上面只是找到GlobalCounter 这个变量的值是7c99f72,要找到变量的值,需要用d命令读取内存地址来获取。

X命令还支持通配符,比如x ntdll !*命令列出ntdll模块中的所有的符号,以及对应的二进制地址。

18.dds 打印内存地址上的二进制值

同时自动搜索二进制值对应的符号。

比如要看看当前**中保存了那些函数地址,就可以检查ebp指向的内存

0:018>dds ebp

0013ed98 0013ee24

0013ed9c 75ecb30f BROWSEUI!BrowserProtectedThreadProc+0x44

0013eda0 00163820

0013eda4 0013ee50

0013eda8 00163820

0013edac 00000000

0013edb0 0013ee10

0013edb4 75ece83a BROWSEUI!__delayLoadHelper2+0x23a

0013edb8 00000005

0013edbc 0013edcc

0013edc0 0013ee50

0013edc4 00163820

0013edc8 00000000

0013edcc 00000024

0013edd0 75f36d2c BROWSEUI!_DELAY_IMPORT_DESCRIPTOR_SHELL32

0013edd4 75f3a184 BROWSEUI!_imp__SHGetInstanceExplorer

0013edd8 75f36e80 BROWSEUI!_sz_SHELL32

0013eddc 00000001

0013ede0 75f3726a BROWSEUI! urlmon_NULL_THUNK_DATA_DLN+0x116

0013ede4 7c8d0000 SHELL32!_imp__RegCloseKey (SHELL32+0x0)

0013ede8 7c925b34 SHELL32!SHGetInstanceExplorer

这里dds命令从ebp指向的内存地址0013ed98开始打印,第一列是内存地址的值,第二列是地址上对应的二进制数据,第三列是二进制对应的符号。上面的命令自动找到了75ecb390f对应的符号是BROWSEUI!BrowserProtectedThreadProc +0x44.

相关文档
最新文档