主线程导致异常 - 如何绕过它?

逆向工程 ollydbg 反调试
2021-06-26 11:10:51

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

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

最好的祝福,

1个回答

问题是缺少有关调试过程和您所看到的说明的一些背景信息。我会尝试提供一些线索,在我继续并详细说明其中任何一个之前,我正在等待更多信息的编辑。

调试器检测时模糊退出

由于 OP 询问异常,我将假设他面临基于异常的反调试技术,但值得注意的是,这也可能是任何其他类型的反调试的问题,并且异常只是恶意软件调试的表现- 检测处理。

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

作为反调试技术的例外

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

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

要检查您是否遇到反调试异常技巧,通常最好将 Olly 配置为自动将您遇到的所有异常传递给被调试程序。使用 ollydbg2,您可以通过打开选项对话框 (Alt+O),导航到调试/异常选项卡,勾选“也忽略以下自定义异常或范围”并点击“添加当前”来实现。特别是对于内存异常,您可以简单地勾选“忽略(传递到调试程序)以下异常”下的“内存访问冲突”

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

打破并发假设

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