gpt4 book ai didi

assembly - 在没有源代码的情况下对Windows应用程序进行调试/故障排除

转载 作者:行者123 更新时间:2023-12-02 02:57:56 24 4
gpt4 key购买 nike

几天前,我在工作中遇到了这个问题,我想知道有没有一种方法可以比从Microsoft那里提取更多的数据。有很多这样的情况,我想探索一下,作为Windows开发人员,获取大多数信息的最佳/最佳方式就是这种情况。我将描述这种情况:

1)办公应用程序在进行某些设置的打印时,涉及cmyk颜色空间,引发对话框错误,描述不正确。“文件%s无法打开,因为它已被其他应用程序锁定”。它既不提供文件名,也不提供事件查看器。打印被中止。

2)在使用“ procmon”时,当涉及的进程(如Office应用,后台处理程序,splwow64.exe)调用api“ CreatefileMapping”时,我们在几个文件上发现“文件锁定错误”(是的是64位系统,应用是32位)。

3)当不涉及splwow64时,问题就不存在,这意味着在64位操作系统上使用64位应用程序。

我想知道在这种情况下哪些工具对获取更多信息有用。这包括在windbg中使用MS符号,并在需要时进行调试程序集。基本上,我需要锁定的文件名,该文件名显示为%s和问题的根源。

谢谢,
考希克

最佳答案

没有源代码和没有符号的调试很困难。所采用的方法因您可以观察到的情况和可以做出的假设而有很大不同。以下内容听起来很符合您的情况。

与32位版本不同的是64位文件访问

由于64位版本有效,因此请查看文件访问的区别。您可以将Process Monitor日志导出为CSV,并编写一个分析文件访问的工具。您的分析工具可能应该


总结对整个文件的单个文件访问具有不同偏移量的多个文件读取访问。
忽略读取顺序,因为顺序似乎不太重要。
首先忽略DLL


也许您甚至可以在Excel本身中执行此操作。

捕获文件访问呼叫

首先,我认为使用Process Monitor已经是一个好方法。您不了解应用程序就知道它在做什么,所以这将是我的首选。

当然,很难缩小问题文件的范围。如有必要,您需要仔细阅读所有内容,例如在批处理文件的帮助下,找到一个命令行工具,该工具可以帮助找到已打开文件的应用程序。在这种情况下,请查看SysInternals Handle。它是一个命令行实用程序,您可以为其指定文件名。基本上,它是Process Explorer的DOS版本(请参见下文)。

读取文件和写入文件通常是通过API调用完成的,因此API Monitor是另一种选择。筛选所有可疑的文件访问方法(ReadFile,ReadFileEx,LockFile,LockFileEx,WriteFile,WriteFileEx等)。

在WinDbg中,也可以通过设置断点来实现,但是您可能经常碰到它们,因此处理它们可能需要一些自动化。您可以为bp命令指定命令字符串。

好运

可能用作%s格式字符串的参数的文件名位于内存中的某个位置。


在应用程序显示消息时进行故障转储
使用SysInternals Strings实用程序转储转储的所有字符串。
通过将其通过管道传输到C:\命令直接为D:\find等输出的过滤器,或者将其重定向到文本文件以供以后分析


这仍然会留下很多文件,因此查找罪魁祸首并不比以前的方法容易得多。再次,使用其他工具缩小列表范围,例如handle


在应用程序显示消息时进行故障转储
在WinDbg中打开转储
转储您在堆栈中找到的某些地址的字符串。由于NTFS中的文件名是Unicode,因此du <address>在这里应该可以正常工作。


这肯定需要更多有关内部内容的知识,例如在哪里找到好的指针等

分析第一次机会异常

如果应用程序依赖异常,则可以通过检查首次机会异常来获得一些见识。但是,如果应用程序进行了良好的前提条件检查,则异常情况将更少,从而降低了获取有用内容的机会。

如果情况重现,则可以


使用Image File Execution Options将WinDbg设置为该进程的调试器。
使用.logopen /t /u c:\firstchanceexceptions.log打开日志文件
让所有异常都使用sxe -c ".exr -1;k;g" *转储。该命令中的g将立即继续,以便应用程序(希望)不会超时。
继续执行g
应用程序终止时,使用.logclose关闭日志文件
查看日志文件中有趣的异常/有趣的调用堆栈
重现错误,但这次在有趣的异常上停止
查看方法参数和内存是否找到文件名(再次使用du <address>


查找属于消息框的应用程序

如果您无法确定哪个应用程序显示错误消息,例如由于邮件标题错误,请执行以下操作:


下载SysInternals Process Explorer并运行它。
将十字线从工具栏拖动到窗口上方。
现在,Process Explorer突出显示拥有窗口的可执行文件


查找锁定应用程序(如果已打印文件名)

如果对话框显示文件名,而不仅仅是“%s”:


也使用Process Explorer
使用查找/查找句柄或DLL或按Ctrl + F
键入文件名或部分文件名

关于assembly - 在没有源代码的情况下对Windows应用程序进行调试/故障排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23960372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com