我了解在x86上,INT 1用于单步执行,INT 3用于设置断点,而其他一些中断(对于Linux通常为0x80,对于Windows为0x2E)用于系统调用。

如果某个恶意软件钩住了中断描述符表(IDT)并替换了自己的INT 1INT 3处理程序,这些处理程序执行类似于系统调用的功能,那么我该如何使用调试器来跟踪其执行?还是我坚持使用静态分析工具?

评论

一种解决方法是修补样本,以便将挂钩删除或移至不会干扰调试的中断。出于好奇,您知道在Windows上是否有任何公开的示例可以执行此操作吗?

如果代码没有将钩子用于类似系统调用的功能,则删除钩子非常容易。将它们移到另一个中断似乎应该起作用。现在的问题是代码非常紧凑,因此修改很烦人。 :/不,对不起,我不知道任何公开可用的示例。

可以肯定的是,这也确实会干扰内核级别的调试器,对吧?

这是一种“冰雹玛丽”方法,但是如果您在Linux中进行此操作,则可以使用自定义IDT重新编译内核,并使用新的映射重建调试器。如果您经常遇到此类样本,这可能是值得的。

@amccormack:但是,如果该恶意软件依赖于这些中断向量中存在的内核功能,它会停止工作吗?我希望您必须非常小心地进行内核修改...

#1 楼

我建议将其作为解决方案http://accessroot.com/arteam/site/download.php?view.185,因为我在一个crackmes中遇到了类似的问题。我所做的是为SoftICE编写了自己的挂钩,以绕过int 3和int 1的ring0挂钩。这可能对您的问题很有用。有趣的部分是“ SoftICE来解救”。

评论


请引用链接中的相关部分,而不是在此处给出链接。

– 0xC0000022L♦
13年4月1日,下午1:34