c – 在没有源代码的情况下调试绕过BSOD

c – 在没有源代码的情况下调试绕过BSOD,第1张

概述你好,祝你好运. 需要一点帮助: 情况: 我有一个模糊的DirectX 9应用程序(名称和应用程序的详细信息与问题无关),导致所有nvidia卡(GeForce 8400GS及以上)的蓝屏死机,因为某些驱动程序版本.我认为问题是由DirectX 9调用或触发驱动程序错误的标志间接引起的. 目标: 我想通过编写代理dll来追踪有问题的标记/函数调用(为了好玩,这不是我的工作/作业)并绕过错误条件.我 你好,祝你好运.

需要一点帮助:

情况:
我有一个模糊的DirectX 9应用程序(名称和应用程序的详细信息与问题无关),导致所有nvIDia卡(GeForce 8400GS及以上)的蓝屏死机,因为某些驱动程序版本.我认为问题是由DirectX 9调用或触发驱动程序错误的标志间接引起的.

目标:
我想通过编写代理dll来追踪有问题的标记/函数调用(为了好玩,这不是我的工作/作业)并绕过错误条件.我已经有一个完成的代理dll,它为IDirect3D9,IDirect3DDevice9,IDirect3DVertexBuffer9和IDirect3dindexBuffer9提供包装器,并提供Direct3D调用的基本日志记录/跟踪.但是,我无法确定导致崩溃的功能.

问题:

>没有可用的源代码或技术支持.没有任何帮助,没有其他人会解决问题.
>内核生成的内存转储没有帮助 – 显然在nv4_disp.dll中发生了访问冲突,但我无法使用stacktrace转到IDirect3DDevice9方法调用,而且有可能异步发生错误.
>(主要问题)由于大量的Direct3D9Device方法调用,我无法将它们可靠地记录到文件或网络中:

>即使没有刷新,登录到文件也会导致显着减速,因此系统BSOD会丢失日志的所有最后内容.
>通过网络登录(使用UDP和WINSOck的sendto)也会导致显着的减速,并且不能异步完成(异步数据包在BSOD上丢失),即使同步发送,数据包(崩溃周围的数据包)有时也会丢失.
>当应用程序通过记录例程“减慢”时,BSOD不太可能发生,这使得跟踪它变得更难.

题:
我通常不会编写驱动程序,也不会进行这种级别的调试,所以我觉得我缺少一些重要的东西,比使用自定义日志记录机制编写IDirect3DDevice9代理dll有更简单的方法来追踪问题.它是什么?诊断/处理/修复问题的标准方法是什么(没有源代码,COM接口方法触发BSOD)?

MinIDump分析(WinDBG):

Loading User SymbolsLoading unloaded module List...........Unable to load image nv4_disp.dll,Win32 error 0n2*** WARNING: Unable to verify timestamp for nv4_disp.dll*** ERROR: Module load completed but symbols Could not be loaded for nv4_disp.dll********************************************************************************                                                                             **                        BUGcheck Analysis                                    **                                                                             ********************************************************************************Use !analyze -v to get detailed deBUGging information.BUGCheck 1000008E,{c0000005,bd0a2fd0,b0562b40,0}Probably caused by : nv4_disp.dll ( nv4_disp+90fd0 )Followup: MachineOwner---------0: kd> !analyze -v********************************************************************************                                                                             **                        BUGcheck Analysis                                    **                                                                             ********************************************************************************KERNEL_MODE_EXCEPTION_NOT_HANDLED_M (1000008e)This is a very common BUGcheck.  Usually the exception address pinpointsthe driver/function that caused the problem.  Always note this addressas well as the link date of the driver/image that contains this address.Some common problems are exception code 0x80000003.  This means a hardcoded breakpoint or assertion was hit,but this system was booted/NODEBUG.  This is not supposed to happen as developers should never havehardcoded breakpoints in retail code,but ...If this happens,make sure a deBUGger gets connected,and thesystem is booted /DEBUG.  This will let us see why this breakpoint ishappening.Arguments:Arg1: c0000005,The exception code that was not handledArg2: bd0a2fd0,The address that the exception occurred atArg3: b0562b40,Trap FrameArg4: 00000000DeBUGging Details:------------------EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at "0x%08lx" referenced memory at "0x%08lx". The memory Could not be "%s".FAulTING_IP: nv4_disp+90fd0bd0a2fd0 39b8f8000000    cmp     DWord ptr [eax+0F8h],ediTRAP_FRAME:  b0562b40 -- (.trap 0xffffffffb0562b40)ErrCode = 00000000eax=00000808 ebx=e37f8200 ecx=e4ae1c68 edx=e37f8328 esi=e37f8400 edi=00000000eip=bd0a2fd0 esp=b0562bb4 ebp=e37e09c0 iopl=0         nv up ei pl nz na po nccs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010202nv4_disp+0x90fd0:bd0a2fd0 39b8f8000000    cmp     DWord ptr [eax+0F8h],edi ds:0023:00000900=????????resetting default scopeCUSTOMER_CRASH_COUNT:  3DEFAulT_BUCKET_ID:  DRIVER_FAulTBUGCHECK_STR:  0x8ELAST_CONTRol_TRANSFER:  from bd0a2e33 to bd0a2fd0STACK_TEXT:  WARNING: Stack unwind information not available. Following frames may be wrong.b0562bc4 bd0a2e33 e37f8200 e37f8200 e4ae1c68 nv4_disp+0x90fd0b0562c3c bf8edd6b b0562cfc e2601714 e4ae1c58 nv4_disp+0x90e33b0562c74 bd009530 b0562cfc bf8ede06 e2601714 win32k!WatchdogDdDestroySurface+0x38b0562d30 bd00b3a4 e2601008 e4ae1c58 b0562d50 dxg!vDddisableSurfaceObject+0x294b0562d54 8054161c e2601008 00000001 0012c518 dxg!DxDdDestroySurface+0x42b0562d54 7c90e4f4 e2601008 00000001 0012c518 nt!KiFastCallEntry+0xfc0012c518 00000000 00000000 00000000 00000000 0x7c90e4f4STACK_COMMAND:  kbFolLOWUP_IP: nv4_disp+90fd0bd0a2fd0 39b8f8000000    cmp     DWord ptr [eax+0F8h],ediSYMBol_STACK_INDEX:  0SYMBol_name:  nv4_disp+90fd0FolLOWUP_name:  MachineOwnerMODulE_name: nv4_dispIMAGE_name:  nv4_disp.dllDEBUG_FLR_IMAGE_TIMESTAMP:  4e390d56FAILURE_BUCKET_ID:  0x8E_nv4_disp+90fd0BUCKET_ID:  0x8E_nv4_disp+90fd0Followup: MachineOwner
解决方法
nv4_disp+90fd0bd0a2fd0 39b8f8000000    cmp     DWord ptr [eax+0F8h],edi

这是重要的部分.看看这个,最有可能的是eax无效,因此试图访问无效的内存地址.

您需要做的是将nv4_disp.dll加载到IDA(您可以获得免费版本),检查IDA加载nv4_disp的图像库并点击“g”到转到地址,尝试将90fd0添加到IDA正在使用的图像库中,它应该直接指向违规指令(取决于部分结构).

从这里您可以分析控制流程,以及如何设置和使用eax.如果你有一个好的内核级调试器,你可以在这个地址上设置一个断点并试着让它命中.

分析这个函数,你应该试着找出函数的功能,eax在那一点上指向的是什么,它实际指向的是什么,以及为什么.这是困难的部分,是逆向工程的难点和技巧的重要组成部分.

总结

以上是内存溢出为你收集整理的c – 在没有源代码的情况下调试/绕过BSOD全部内容,希望文章能够帮你解决c – 在没有源代码的情况下调试/绕过BSOD所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1220651.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存