关于Dump

Dump文件(或称为转储文件)是程序在运行时创建的文件,通常用于保存内存中的数据、程序状态或错误信息。这些文件有助于开发人员调试和分析程序的行为,尤其是在程序崩溃或出现异常时。

如何生成Dump文件

  1. 首先需要下载微软开发的 procdump,它是一个exe文件,官方地址:https://docs.microsoft.com/en-us/sysinternals/downloads/procdump
  2. 以管理员方式进入cmd——windows图标,右键选择:Windows PowerShell(admin)
  3. 进入procdump.exe 所在的文件路径,输入procdump.exe -ma -i
procdump.exe -u                     # 关闭dump文件

开启软件崩溃弹窗

  1. 打开注册表: win+R,在运行窗口输入:gpedit.msc
  2. 路径:User Configuration ->Administrative Templates ->windows Components ->Windows Error Reporting
  3. 找到“Disable Windows Error Reporting”属性,右键选中“Edit”,选择Enable->Apply->OK 即可
  4. 打开注册表:win+R,在运行窗口输入 regedit.exe
  5. 路径:Computer->HKEY_LOCAL_MACHINE->SOFTWARE->Microsoft->Windows-> Windows Error Reporting
  6. 新增加”Disabled”和“DontShowUI”两个选项(New->DWORD(32-bit)Value)
  7. 配置Windows Dump: 我的电脑->右键 属性->系统属性->高级->启动和故障恢复->设置->系统失败->勾选将实践写入日志->勾选自动重新启动->选择自动内存转储->dump目录设置成“%SystemRoot%\MEMORY.DMP”

Dump文件分析

这里我们常用的是IDA 与windbg这两个工具

将dmp文件拖入windbg

!analyze –v                         # 查看那个程序搞的死机、蓝屏重启
!process                            # 确定哪个程序引起的第1点挂掉
kv                                  # 显示调用堆栈
!thread                             # 查看当前线程信息
.cls                                # 清屏
FAULTING_IP:
example.exe!SomeFunction+15
00000001`00401515 488b4108        mov     rax,qword ptr [rcx+8]

EXCEPTION_RECORD:  (ntdll!_CxxFrameHandler3+0x3)
ExceptionCode: c0000005 (Access Violation)
ExceptionAddress: 00000001`00401515 (example.exe!SomeFunction+0x15)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 00000000
Parameter[1]: 00000000

Call Stack:
00 00000000`0012f5b0 00000001`00401515 example.exe!SomeFunction+0x15
01 00000000`0012f5b8 00000001`0040177e example.exe!main+0x9a
02 00000000`0012f5c0 00000001`0040184a example.exe!__tmainCRTStartup+0x10e
03 00000000`0012f5c8 00000000`76f614a4 kernel32.dll!BaseThreadInitThunk+0x14
04 00000000`0012f5d0 00000000`77d47727 ntdll.dll!RtlUserThreadStart+0x21

在堆栈跟踪中,SomeFunction 是崩溃发生的函数,而 main 是调用 SomeFunction 的地方。通过堆栈跟踪,你可以看到导致崩溃的函数调用链。

此外,如果是库函数出的问题,我们我们还需要确定库的基地址,这里就需要借用其他工具来协助分析

我们可用objdump查看libim的基地址,输入objdump –x impath 可以查找ImageBase

接着打开IDEAPRO 64位,file里open或者直接拉入xx.DLL

IDA 常用操作
g                                   # 跳转到出错地址
F5                                  # 可进入伪汇编

通过ImageBase可定位到出错附近

接着结合源码,分析解释下汇编(需要一定的汇编基础)可以定位和推断崩溃原因

results matching ""

    No results matching ""