以下实例来自AWD

代码:

[cpp] view plaincopy
  1. /*++
  2. Copyright (c) Advanced Windows Debugging (ISBN 0321374460) from Addison-Wesley Professional.  All rights reserved.
  3. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  4. KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  5. IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  6. PURPOSE.
  7. --*/
  8. #include "stdafx.h"
  9. #include <windows.h>
  10. #include <stdio.h>
  11. #include <conio.h>
  12. VOID SimulateMemoryCorruption ( ) ;
  13. class CAppInfo
  14. {
  15. public:
  16. CAppInfo(LPWSTR wszAppName, LPWSTR wszVersion)
  17. {
  18. m_wszAppName=wszAppName;
  19. m_wszVersion=wszVersion;
  20. }
  21. VOID PrintAppInfo()
  22. {
  23. wprintf(L"\nFull application Name: %s\n", m_wszAppName);
  24. wprintf(L"Version: %s\n", m_wszVersion);
  25. }
  26. private:
  27. LPWSTR m_wszAppName ;
  28. LPWSTR m_wszVersion ;
  29. } ;
  30. CAppInfo* g_AppInfo ;
  31. int __cdecl wmain (int argc, WCHAR* args[])
  32. {
  33. wint_t iChar = 0 ;
  34. g_AppInfo = new CAppInfo(L"Memory Corruption Sample", L"1.0" );
  35. if(!g_AppInfo)
  36. {
  37. return 1;
  38. }
  39. wprintf(L"Press: \n");
  40. wprintf(L"    1    To display application information\n");
  41. wprintf(L"    2    To simulated memory corruption\n");
  42. wprintf(L"    3    To exit\n\n\n>");
  43. while((iChar=_getwche())!='3')
  44. {
  45. switch(iChar)
  46. {
  47. case '1':
  48. g_AppInfo->PrintAppInfo();
  49. break;
  50. case '2':
  51. SimulateMemoryCorruption();
  52. wprintf(L"\nMemory Corruption completed\n");
  53. break;
  54. default:
  55. wprintf(L"\nInvalid option\n");
  56. }
  57. wprintf(L"\n\n> ");
  58. }
  59. return 0;
  60. }
  61. VOID SimulateMemoryCorruption ( )
  62. {
  63. char* pszWrite="Corrupt";
  64. BYTE* p=(BYTE*) g_AppInfo;
  65. CopyMemory(p, pszWrite, strlen(pszWrite));
  66. }

编译,生成Release,运行,选1再选2再选1,程序崩溃,打开Dump:

[cpp] view plaincopy
  1. 0:000> lm
  2. start    end        module name
  3. 00400000 00406000   test1      (deferred)
  4. 62c20000 62c29000   lpk        (deferred)
  5. 73fa0000 7400b000   usp10      (deferred)
  6. 76300000 7631d000   imm32      (deferred)
  7. 76d70000 76d92000   apphelp    (deferred)
  8. 77bd0000 77bd8000   version    (deferred)
  9. 77d10000 77da0000   user32     (deferred)
  10. 77da0000 77e49000   advapi32   (deferred)
  11. 77e50000 77ee3000   rpcrt4     (deferred)
  12. 77ef0000 77f39000   gdi32      (deferred)
  13. 77fc0000 77fd1000   secur32    (deferred)
  14. 78520000 785c3000   msvcr90    (private pdb symbols)  c:\mysymbol\msvcr90.i386.pdb\3ADD2E755BC041BC9149BFBE7C33387C1\msvcr90.i386.pdb
  15. 7c800000 7c91e000   kernel32   (deferred)
  16. 7c920000 7c9b6000   ntdll      (pdb symbols)          c:\mysymbol\ntdll.pdb\CEFC0863B1F84130A11E0F54180CD21A2\ntdll.pdb

加载符号文件:

[cpp] view plaincopy
  1. 0:000> .sympath+ D:\Project1\test1\Release
  2. Symbol search path is: C:\WINDOWS\Symbols;SRV*c:\mysymbol* http://msdl.microsoft.com/download/symbols ;D:\Project1\test1\Release
  3. WARNING: Whitespace at end of path element
  4. 0:000> .reload /f
  5. ..............
  6. Loading unloaded module list
  7. .........
  8. 0:000> lm
  9. start    end        module name
  10. 00400000 00406000   test1      (private pdb symbols)  D:\Project1\test1\Release\test1.pdb
  11. 62c20000 62c29000   lpk        (pdb symbols)          C:\WINDOWS\Symbols\dll\lpk.pdb
  12. 73fa0000 7400b000   usp10      (pdb symbols)          c:\mysymbol\usp10.pdb\D4BA2952809F469BB6D1D3AF6B956E6B1\usp10.pdb
  13. 76300000 7631d000   imm32      (pdb symbols)          C:\WINDOWS\Symbols\dll\imm32.pdb
  14. 76d70000 76d92000   apphelp    (pdb symbols)          C:\WINDOWS\Symbols\dll\apphelp.pdb
  15. 77bd0000 77bd8000   version    (pdb symbols)          C:\WINDOWS\Symbols\dll\version.pdb
  16. 77d10000 77da0000   user32     (pdb symbols)          C:\WINDOWS\Symbols\dll\user32.pdb
  17. 77da0000 77e49000   advapi32   (pdb symbols)          c:\mysymbol\advapi32.pdb\F759D3F1C6614313B07C84BC33F02E4D2\advapi32.pdb
  18. 77e50000 77ee3000   rpcrt4     (pdb symbols)          c:\mysymbol\rpcrt4.pdb\1A465C67828242F28A8C70E3B9D5C4772\rpcrt4.pdb
  19. 77ef0000 77f39000   gdi32      (pdb symbols)          c:\mysymbol\gdi32.pdb\372C0F0E08FB456EAB7B4CB2B53E27952\gdi32.pdb
  20. 77fc0000 77fd1000   secur32    (pdb symbols)          c:\mysymbol\secur32.pdb\7867B3F28B5C41CE847895E3FC013DC52\secur32.pdb
  21. 78520000 785c3000   msvcr90    (private pdb symbols)  c:\mysymbol\msvcr90.i386.pdb\3ADD2E755BC041BC9149BFBE7C33387C1\msvcr90.i386.pdb
  22. 7c800000 7c91e000   kernel32   (pdb symbols)          c:\mysymbol\kernel32.pdb\072FF0EB54D24DFAAE9D13885486EE092\kernel32.pdb
  23. 7c920000 7c9b6000   ntdll      (pdb symbols)          c:\mysymbol\ntdll.pdb\CEFC0863B1F84130A11E0F54180CD21A2\ntdll.pdb

查看堆栈:

[cpp] view plaincopy
  1. 0:000> kb
  2. ChildEBP RetAddr  Args to Child
  3. 0012ff20 78556215 785b73c8 004020f4 00000000 msvcr90!_woutput_l+0x94c [f:\dd\vctools\crt_bld\self_x86\crt\src\output.c @ 1624]
  4. 0012ff64 004010ba 004020f4 72726f43 00403380 msvcr90!wprintf+0x73 [f:\dd\vctools\crt_bld\self_x86\crt\src\wprintf.c @ 63]
  5. 0012ff7c 00401252 00000001 00392940 00392998 test1!wmain+0xba [d:\project1\test1\test1\test1.cpp @ 58]
  6. 0012ffc0 7c817077 00300031 0032002d 7ffdc000 test1!__tmainCRTStartup+0x10f [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 583]
  7. 0012fff0 00000000 0040139a 00000000 78746341 kernel32!BaseProcessStart+0x23

看下58行代码,使用了   g_AppInfo->PrintAppInfo();

我们猜测,g_AppInfo的两个成员无效,因为wprintf调用的就是它们

找到g_AppInfo,列出它的成员:

[cpp] view plaincopy
  1. 0:000> x test1!*g_*
  2. 00403374 test1!g_AppInfo = 0x00395b10
  3. 004022f0 test1!_load_config_used = struct IMAGE_LOAD_CONFIG_DIRECTORY32_2
  4. 00402098 test1!_imp___amsg_exit = <no type information>
  5. 004014fa test1!_amsg_exit = <no type information>
  6. 0:000> dt CAppInfo 0x00395b10
  7. test1!CAppInfo
  8. +0x000 m_wszAppName     : 0x72726f43  "--- memory read error at address 0x72726f43 ---"
  9. +0x004 m_wszVersion     : 0x00747075  "???"

注意,这里dt要用CAppInfo告诉它解析的地址类型

那我们再来看看这两个局变量的内容:

[cpp] view plaincopy
  1. 0:000> dt CAppInfo 0x00395b10
  2. test1!CAppInfo
  3. +0x000 m_wszAppName     : 0x72726f43  "--- memory read error at address 0x72726f43 ---"
  4. +0x004 m_wszVersion     : 0x00747075  "???"
  5. 0:000> !address 0x72726f43
  6. 62c29000 : 62c29000 - 11377000
  7. Type     00000000
  8. Protect  00000001 PAGE_NOACCESS
  9. State    00010000 MEM_FREE
  10. Usage    RegionUsageFree
  11. 0:000> !address 0x00747075
  12. 005f0000 : 005f0000 - 001be000
  13. Type     00020000 MEM_PRIVATE
  14. Protect  00000004 PAGE_READWRITE
  15. State    00001000 MEM_COMMIT
  16. Usage    RegionUsageIsVAD

我们发现第一个变量竟然是不可访问的,找到问题了,

[cpp] view plaincopy
  1. 0:000> dc 0x00395b10
  2. 00395b10  72726f43 00747075 00020201 000801c2  Corrupt.........
  3. 00395b20  6c75460a 7061206c 63696c70 6f697461  .Full applicatio
  4. 00395b30  614e206e 203a656d 64657465 4320790a  n Name: eted.y C
  5. 00395b40  7572726f 6f697470 6153206e 656c706d  orruption Sample
  6. 00395b50  0000000a 00000000 00000000 00000000  ................
  7. 00395b60  00000000 00000000 00000000 00000000  ................
  8. 00395b70  00000000 00000000 00000000 00000000  ................
  9. 00395b80  00000000 00000000 00000000 00000000  ................

原来第一个变量竟然成了字符串Corrupt,查看代码,我们发现在按2时,程序强行把字符串"Corrupt"写入了

一些的指导性的建议和策略:

1通过命令dc将指针的内存内容转储出来,dc可以将内存内容以双字形式转储出来,如果在输出中看到有任何的字符串,那么可以通过命令da或du把字符串转储出来

2通过!address收集关于内存的信息,!address可以告诉你内存的类型(如私有内存),保护级别(读取和写入),状态(已提交或保留)和用途(栈或堆)

3.通过dds命令将内存转储为双字或者符号,这有助于将内存和特定的类型关联起来,

4.通过dpp命令对指针解引用,并且以双字形式转储出内存的内容,如果有任何一个双字匹配某个符号,那么这个符号也会被显示,如果在指针指向的内存中包含了一个虚函数表,那么

这种技术是非常有用的

5.通过dpa和dpu将指针指向的内存分别显示为ASII格式和Unicode格式

6.如果内存的内容是个很小的数值(4的值数)那么它可能是一个句柄,可以通过!handle来转储这个句柄的信息.

windbg-内存破坏实例分析相关推荐

  1. linux kernel内存映射实例分析

    作者:JHJ(jianghuijun211@gmail.com) 日期:2012/08/24 欢迎转载,请注明出处 引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm cortex ...

  2. [内存管理] linux kernel内存映射实例分析

    作者:JHJ(jianghuijun211@gmail.com ) 日期:2012/08/24 欢迎转载,请注明出处 引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm corte ...

  3. OutOfMemoryError/OOM/内存溢出异常实例分析--堆内存溢出

    Java堆内存溢出 只要不断创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象, 那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常,代码如下: import ...

  4. 操作系统笔记——Linux系统实例分析、Windows系统实例分析

    文章目录 传送门 Linux进程管理 Linux进程组成 Linux进程链表 Linux进程控制 用户进程创建与撤销 0,1,2号进程 Linux进程切换 Linux进程调度 内核同步 Linux储存 ...

  5. linux内存实际占用分析

    作者: 黄永兵/译 出处:51CTO.com 阅读提示:本文是为那些经常疑惑的人准备的,"为什么一个简单的KDE文本编辑器要占用25M内存?"导致大多数人认为许多Linux应用程序 ...

  6. linux中非法内存,Linux下数组非法访问导致内存破坏 —— 引发segmentation fault的原因...

    2012-02-05 wcdj 1, 调试时必需的栈知识 2, 数组非法访问导致内存破坏 调试时必需的栈知识 栈(stack)是程序存放数据的内存区域之一,其特征是LIFO(Last In First ...

  7. RPC-原理及RPC实例分析

    还有就是:RPC支持的BIO,NIO的理解 (1)BIO: Blocking IO;同步阻塞: (2)NIO:Non-Blocking IO, 同步非阻塞; 参考:IO多路复用,同步,异步,阻塞和非阻 ...

  8. c 初始化char**_CC++|指针详述及实例分析

    指针是C语言中的精华,也是一把双刃剑,关系到安全和效率. 1 系统内存布局 2 存储变量的内存地址 3 指针定义:变量,地址,类型(宽度) 4 指针声明 5 &与*运算符 6 定义指针与解引用 ...

  9. Android 内存泄漏问题分析 指南

    内存异常的情况: 我们看到一直在上涨~ 内存正常的情况: 内存有涨有跌,这样才说明内存能够被回收. Mat 工具的使用: 使用mat 打开hprof文件,查看你认为可能泄露的类的引用. 如果是java ...

最新文章

  1. Python学习入门基础教程(learning Python)--6.3 Python的list切片高级
  2. HTTP 错误 500.21 - Internal Server Error PageHandlerFactory-Integrated
  3. 金山词霸2012不能在PDF中取词 解决办法
  4. ML之Validation:机器学习中模型验证方法的简介、代码实现、案例应用之详细攻略
  5. (加强版)大数加减乘除,一文彻底搞定
  6. 数据结构与算法总结——背包问题与组和问题
  7. 信用评分卡—信贷准入A卡(逻辑回归)
  8. mysql简单部署_安装部署Mysql实例(最简单快速噢)
  9. 度小满面试题20190923
  10. conda创建和使用python的虚拟环境
  11. 作业四:个人项目-小学四则运算之JAVA版
  12. 2019 Flutter 心愿单
  13. rk3399 调试一款新的摄像头驱动
  14. html求相关系数,关于pearson相关系数的意义
  15. Ubuntu深度学习环境配置(2):Ubuntu18.04安装N卡驱动+anaconda3
  16. beacon帧主要结构
  17. 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?
  18. centos审计服务audit导致使centos服务器不能登录,部署的应用不能运行和访问。
  19. Altium Designer19 多层板设计教程
  20. android底层优化什么意思,华为所谓的“优化”到底是什么意思 看完这段你就明白...

热门文章

  1. 执行ios命令_MEDUZA:一款针对iOS应用程序的通用SSL解绑工具
  2. Logistic回归模型原理
  3. 机器学习 - 随机森林手动10 折交叉验证
  4. 深度综述|基因与疾病关系研究的百年进展
  5. Mac插件分享——AE插件、PS插件、FCPX插件【持续更新中】
  6. 洛谷 数论入门相关题目--2022.01.22
  7. 5g上行速率怎么提升_揭秘联发科5G独家技术,攻克上行覆盖和终端功耗两大技术难题...
  8. ADB投屏_最强开源投屏神器,跨平台电脑控制+文件传输——scrcpy
  9. STM32H743+CubeMX-ADC+DMA采样四路AD
  10. Vue第一部分(2): 数据的渲染