我分析了一块恶意软件,但遇到了以下问题:恶意软件的主线程产生了一些线程。生成第一个线程后,主线程跳转到不存在的内存空间以引起异常。调试器(我使用ollydbg v1.10)崩溃。

因此,我不知道如何在主线程导致崩溃之前执行第一个线程。有没有一种优雅的方法可以绕过该反调试技巧?有人可以帮我吗?

最好的问候,

评论

为什么不禁用该jmp?

Ollydbg绝对不会在引发异常时崩溃,也许使用更新的版本(撰写本文时为2.01)会有所帮助?您确定调试器崩溃,而不是有关异常的警报吗?

#1 楼

问题是缺少一些有关调试过程和您所看到的说明的背景信息。我将尝试提供一些潜在客户,并在我进行详细说明之前等待更多信息的编辑。

在调试器检测到时无法退出

由于OP当询问有关异常的信息时,我将假定他正面临基于异常的反调试技术,但值得注意的是,这也可能是任何其他类型的反调试问题,并且该异常只是恶意软件的调试检测的体现

例如,您可能会遇到反调试技巧,就像调用IsDebuggerPresent并跳转到某个固定的无效地址一样简单。或者更复杂的地址计算,其中包括与调试相关的标志,以隐藏其反调试性质。在这种情况下,您应该追溯导致异常跳转的原因(是否存在条件跳转?是基于动态值计算出的地址吗?)。

反调试技术的例外情况

许多恶意软件样本和打包程序都将异常作为其反调试技巧的一部分,以阻止分析。您可能正面临着类似的问题。

异常反调试技术背后的基本思想是利用调试工具(或使用该工具的人员做出的决定)的副作用来改变执行流。有几种方法可以做到这一点,经典的方法是设置一个异常处理程序(针对本地线程或在进程级别),然后在将执行返回到原始EIP或对其进行完全更改之前,在异常处理程序中实现逻辑的重要部分。

要检查您是否遇到了反调试异常技巧,通常最好将Olly配置为自动将遇到的所有异常传递给已调试程序。使用ollydbg2,您可以通过打开“选项”对话框(Alt + O),导航到“调试/异常”选项卡,勾选“也忽略以下自定义异常或范围”,然后单击“添加当前”来完成此操作。专门针对内存异常,您只需在“执行以下操作后忽略(忽略(传递给已调试的程序)”下方的信息中勾选“内存访问冲突”即可。

请确保您使用的是基于异常的反调试adove提示,并向您更新问题以包括更多详细信息,我将以克服您正在处理的问题的细节的方式来更新我的答案。

打破并发假设

尽管通过调试破坏并发性假设的过程来调试该技术不是很普遍,但是恶意软件可以将其用作检测调试的一种方式。例如,通过发出创建威胁系统调用,您还使OS调度程序有机会切换上下文,并且可能需要新创建的线程在进程的上下文中更改某些内容(全局值是最简单的),然后主线程才能继续执行。我不确定这是100%生成的,并且可能需要恶意软件进行其他设置(Sleep(0)是常见做法)。