sky258 发表于 2024-6-14 15:17:07

游戏崩溃后对dmp文件的分析

相关工具:WinDbg
ollydbg
要求:
有一定的逆向基础
游戏崩溃时会在客户端目录生成dmp文件(内存镜像文件)

1.
使用WinDbg 打开dmp文件



首次打开可能要稍微等待一下,因为他要下载一些符号文件
2.
在命令处输入.excr 快速定位崩溃位置

崩溃的模块,和一些寄存器信息
可以看到是lua这里崩溃了,大致应该是在访问了一个不存在的指针,导致崩溃。

3.
输入!analyze -v 让windbg 给我们分析下崩溃原因


返回结果
*******************************************************************************
*                                                                           *
*                        Exception Analysis                                 *
*                                                                           *
*******************************************************************************

*** WARNING: Unable to verify checksum for game.exe
*** WARNING: Unable to verify checksum for libcocos2d.dll
*** WARNING: Unable to verify checksum for OpenAL32.dll

KEY_VALUES_STRING: 1

    Key: AV.Fault
    Value: Read

    Key: Analysis.CPU.Sec
    Value: 0

    Key: Analysis.DebugAnalysisProvider.CPP
    Value: Create: 8007007e on DESKTOP-15R5MQL

    Key: Analysis.DebugData
    Value: CreateObject

    Key: Analysis.DebugModel
    Value: CreateObject

    Key: Analysis.Elapsed.Sec
    Value: 63

    Key: Analysis.Memory.CommitPeak.Mb
    Value: 169

    Key: Analysis.System
    Value: CreateObject

    Key: Timeline.Process.Start.DeltaSec
    Value: 1003


APPLICATION_VERIFIER_FLAGS:0

CONTEXT:(.ecxr)
eax=f8b9d2ec ebx=0ad501c8 ecx=1d18b38c edx=1d18ba60 esi=0ad501c8 edi=00000610
eip=622828ee esp=009eec80 ebp=0e6e19c8 iopl=0         nv up ei pl nz na pe nc
cs=0023ss=002bds=002bes=002bfs=0053gs=002b             efl=00210206
lua51!lua_yield+0x1a72e:
622828ee 8b07            mov   eax,dword ptr ds:002b:00000610=????????
Resetting default scope

EXCEPTION_RECORD:(.exr -1)
ExceptionAddress: 622828ee (lua51!lua_yield+0x0001a72e)
   ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
   Parameter: 00000000
   Parameter: 00000610
Attempt to read from address 00000610

PROCESS_NAME:game.exe

READ_ADDRESS:00000610

ERROR_CODE: (NTSTATUS) 0xc0000005 - 0x%p            0x%p                  %s

EXCEPTION_CODE_STR:c0000005

EXCEPTION_PARAMETER1:00000000

EXCEPTION_PARAMETER2:00000610

STACK_TEXT:
WARNING: Stack unwind information not available. Following frames may be wrong.
009eec88 62282b0f 0ad501c8 7edefed8 009eecfc lua51!lua_yield+0x1a72e
009eecbc 622832a9 0ad501c8 622baf1d 009eecf8 lua51!lua_yield+0x1a94f
009eed2c 756c2e6e 005d2261 00000000 00000000 lua51!luaL_traceback+0x169
009eedbc 76680b82 009eedc8 e24c4a02 00000001 shell32!CMergedFldrNamespace::GetDropFolder+0x7f
00000000 00000000 00000000 00000000 00000000 KERNELBASE!RaiseException+0x62


SYMBOL_NAME:lua51!lua_yield+1a72e

MODULE_NAME: lua51

IMAGE_NAME:lua51.dll

STACK_COMMAND:~0s ; .ecxr ; kb

FAILURE_BUCKET_ID:NULL_CLASS_PTR_READ_c0000005_lua51.dll!lua_yield

OS_VERSION:10.0.19041.1

BUILDLAB_STR:vb_release

OSPLATFORM_TYPE:x86

OSNAME:Windows 10

FAILURE_ID_HASH:{b7ee08a3-73c5-e01f-6723-47799b22f4eb}

Followup:   MachineOwner
---------
看下给出堆栈信息使用了lua的traceback函数,这时候肯定是会有lua报错的,我们可以到客户端的dbug窗口查看错误信息
4.定位到出错的位置打开ollydbg附加到进程 查看模块信息可执行模块, 条目 24 基址=62580000 大小=00066000 (417792.) 入口=625D87BA lua51.<ModuleEntryPoint> 名称=lua51 路径=D:\开发\Client\lua51.dll

ctrl+n 找一下lua_yield这个函数的起始地址

625881C0 >56                     push esi
然后625881C0 + 偏移地址 1a72e=625A28EE


ctrl+g定位到详细的位置



以上只是举一个简单的例子
我们查看堆栈信息的时候已经执行过了traceback,那么lua绝对会抛出错误信息,我们根据错误信息解决崩溃问题就可以了
如果没有错误信息,我们就要慢慢分析调试了...
页: [1]
查看完整版本: 游戏崩溃后对dmp文件的分析