windbg命令学习4

4.查看调用栈

k命令:显示的是一定数量的栈帧, 其中帧的数量是由.kframes命令来控制的, 默认值是256。

  我们如何来判断函数的栈指针,参数地址和局部变量地址呢? 举一个简单的windbg的kv命令输出:
ChildEBP RetAddr  Args to Child              
03b1f9c4 0032549e 00e1b5f0 00e259f8 7c900059
  如上所示,ebp是栈的指针,其中ebp+4保存的是函数返回地址,因此ebp+8(00e1b5f0 )开始就是函数的参数. 结合上面的栈地址图,由于栈是从高到低压栈,所以不可能往高位扩展(那样会破坏上层堆栈),因此局部变量只能是向低位扩展,所以通常ebp-4就是低一个局部变量地址. 由于是在往低位扩展,所以当局部变量过多或者函数层数过多时,会出现堆栈溢出.

堆栈溢出
     首先说下windows默认的堆栈大小,在用户层一个线程默认堆栈大小是1M,程序可以设置. 驱动中默认是13K左右,具体记不清了.那么如何判断堆栈溢出呢? windbg有一个非常有用的命令kf -n ,其中n是要显示的frame数.

注释:堆栈桢基址,函数返回地址,第一个参数,第二个参数

kp 5

显示调用栈中前5个函数以及他们的参数.

kb 5

显示调用栈中前五个函数以及他们的前三个参数.

kf 5

显示在调用栈中五个函数所使用的栈的大小.

每个栈帧所占的空间使用量的计算方法是: 将当前函数的栈基指针与在函数中调用的任何一个函数栈基指针相减.

举例:

手动构造栈的实践- 如何手工构造调用栈

栈基本概念

    首先说一下栈的结构,栈是从高地址开始压栈的. 如下图,函数中存在函数调用,首先是Frame1压栈,然后是Frame2压栈.其调用关系是Frame1调用Frame2. 对于参数的压栈windows默认的stdcall,cdell都是从右边参数开始压栈.而delph所试用的passcall是从左开始压栈. 因此,加入存在一个函数fun(int p1, int p2);

首先用几幅图说明一下栈的特点, 帮助大家理解.

1. 栈向低地址增长.

2. 向栈中压入数据, 栈中的情况如图.

3. 有函数调用的栈中的情况.

注意, 手工构造栈的时候, 我们需要利用的是上面图中显示的一个模式:

在内存中的一系列的值是可以被识别出来的, 这些值表示当前站中的某个地址, 并且在这些值之后是一个可执行的地址.

时间: 2024-10-07 14:03:57

windbg命令学习4的相关文章

windbg命令学习2

一.windbg查看内存命令: 当我们在调试器中分析问题时, 经常需要查看不同内存块的内容以分析产生的原因, 并且在随后验证所做出的假设是否正确. 由于各个对象的状态都是保存在内存中的, 因此内存的内容也就相当于对象的状态. d命令最常见的格式就是根据指定的类型信息来显示存储在某地址中的数据. 调试器并不会去猜测这个地址上存储的是什么数据, 因为在大多数情况下猜测都是错误的. 所以需要用户显式地制定按照何种格式来解析数据. 命令格式如下: 语法:d [type][address range] /

linux五大搜索命令学习

五大搜索命令学习 分别解释locate,find,which,whereis,grep 五大linux搜索命令 locate 解释:由man手册可以看出,locate查找就是根据文件名进行查找,只是依赖于updatedb命令.该命令更新linux中的查找数据库/var/lib/locatedb 这个数据库中含有本地所有文件信息.Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件.为了避免这种情况,可以在使用 locate之前,先使用update

基础命令学习总结

基础命令总结: 1.获取帮助命令: help man info 2.日期时间命令: date hwclock cal 3.系统管理命令: shutdown halt reboot poweroff bash tty 4.文件管理命令: cd type file echo which  whereis whatis dirname basename makewhatis mkdir pwd      touch 基础命令学习总结,布布扣,bubuko.com

windbg命令详解

DLL 该扩展仅在内核模式下使用,即使它是在Ext.dll中的. Windows NT 4.0 Ext.dll Windows 2000 Ext.dll Windows XP和之后 Ext.dll 注释 如果不提供参数,调试器会列出所有进程,以及时间和优先级统计.这和使用!process @#Process 0 作为CommandString值一样. To terminate execution at any point, press CTRL+BREAK (in WinDbg) or CTRL

Git命令学习之旅——日志和穿梭版本号

在总结了git命令的基础之后,接下来我们看一下基础的一些进阶内容:删除撤销命令.日志查看命令等 既然有加入文件的功能,那么相相应的肯定有移除文件的功能,命令例如以下:git rm [文件名称] 在输入命令之后,例如以下图所看到的: 提示已经删除了"c.txt"文件.这个时候再用git status查看一下状态,例如以下图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JB

Java命令学习系列(7):Javap(转)

原文出处: Hollis(@Hollis_Chuang) javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码. 一般情况下,很少有人使用javap对class文件进行反编译,因为有很多成熟的反编译工具可以使用,比如jad.但是,javap还可以查看java编译器为我们生成的字节码.通过它,可以对照源代码和字节码,从而了解很多编译器内部的工作. 实例 javap命令分解一个class文件,它根据options来决定到底输出什么.如果没有使用options,那么

linux shell 命令学习(5) xxd- make a hexdump or do the reverse.

对于标准输入或者给定的文件,显示其16进制的内容.也可以反过来进行转换. ? 1 2 3 xxd -h[elp] xxd [options] [infile [outfile]] xxd -r[evert] [options] [infile [outfile]] 如果没有指定输入文件, 则采用标准输入. -b: 以2进制格式进行输出 ? 1 2 3 4 [[email protected] src]$ xxd -b train.ini 0000000: 01011011 01110100 01

Linux命令学习之—每天发一个命令—mkdir

Linux命令学习之-每天发一个命令-mkdir mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 1.命令格式: mkdir [选项] 目录... 2.命令功能: 通过 mkdir 命令可以实现在指定位置创建以 DirName(指定的文件名)命名的文件夹或目录.要创建文件夹或目录的用户必须对所创建的文件夹的父文件夹具有写权限.并且,所创建的文件夹(目录)不能与其父目录(即父文件夹)中的文件名重名,即同一个目录下不能

sqlplus 命令学习

sqlplus 命令学习 $ sqlplus  / as sysdba SQL> help index 可以输入sqlplus 命令 Enter Help [topic] for help. @             COPY         PAUSE                    SHUTDOWN @@            DEFINE       PRINT                    SPOOL /             DEL          PROMPT