我单步调试时遇到了一些引发异常的恶意软件。 IDA让我可以选择是否将异常传递给应用程序。这到底是怎么回事?什么时候我不想将异常传递给应用程序?

#1 楼

通常,恶意软件和/或混淆的代码(例如,解压缩存根)将执行以下操作:


设置异常处理程序。
引发异常。
/>查看异常处理程序是否捕获到异常。

如果异常处理程序未捕获到异常,则调试后的代码将知道已附加调试器并“吞噬”了异常,因此表明代码正在调试中。为了使调试器免于使用此类检测技术,在处理恶意软件和/或混淆的代码时,您始终希望将异常传递给应用程序。

评论


我从IDA看到的弹出窗口警告我可能会失去对应用程序的控制。您能否扩大答案以谈论可能发生的情况?我是否需要单步执行异常处理程序?

–user2142
13年6月12日在3:43

@ user2142这意味着,如果应用程序未正确处理异常,则可能会使应用程序崩溃。是的,如果您对它的处理方式感兴趣,则可能需要逐步进行。

– PSS
2013年6月12日在3:48



一个例外是一般规则,即分析师和/或调试器“导致”例外发生。例如,如果单步执行pushf指令,则将设置陷阱标志位。如果稍后弹出这些标志,则IDA可能会按照您描述的有关单步异常的内容发出警告。您不想将那个传递给应用程序。

–滚轴
2013年6月12日下午3:58

您并不总是希望传递该异常,因为除非存在调试器(例如CloseHandle(invalid)),否则可能不会生成该异常。在这种情况下,异常的存在就暴露了调试器(请参阅pferrie.host22.com/papers/unp2011.htm)。

–彼得·弗里
13年6月13日在0:12