第50章 反调试技术
本文最后更新于:2022年5月27日 下午
有经验的代码逆向分析人员通过调试能够轻松把握程序的代码执行流程与数据结构。这种调试行为使程序的“秘密” 一览无遗,这显然是程序开发人员不愿看到的结果,所以发展出了针对程序调试的“反调试”技术。’代码逆向分析人员也要学习“反调试”技术,主要基于以下2个原因:
(1)掌握各种反调试技术的工作原理后可以有效规避。
(2)学习反调试技术的过程中会学习大量高级逆向分析技术。
本章将向各位介绍一些具有代表性的反调试技术,使大家了解其工作原理,并学习如何规避。
50.1 反调试技术
反调试技术属于高级逆向分析技术范畴,它涵盖了我们前面学过的各种技术,当然也有一些新增的知识。各位可以通过本章温故知新,另外,反调试技术也在不断发展,我们必须坚持学习新知识、新技术。
50.1.1 依赖性
反调试技术对调试器与OS有着很强的依赖性(Dependency)。也就是说,有些反调试技术仅能在特定版本OS下正常工作,而且不同种类调试器应用的反调试技术也略有不同。
本章介绍的大部分技术可以正常应用在Windows XP SP3 ( 32位)与Windows 7(32位)操作系统下。调试某个应用了反调试技术的文件时,要充分考虑它对调试器和OS的依赖性。
50.1.2 多种反调试技术
反调试技术多种多样,日新月异。本章只讲解最具代表性的、应用范围最广的技术,同时也会介绍一些应用在各种PE保护器中的高级反调试技术
50.2 反调试破解技术
反调试技术给逆向分析人员下了个“套”,阻止他们调试程序。而反调试破解技术(Anti-Anti-Debugging) 则用来解除程序中的 “套”,规避反调试技术。简言之,反调试破解技术就是逆向分析人员用来破解反调试技术的技术。
国外的逆向分析技术论坛中经常出现“反调试破解技术” 一词,该术语较长,且语感不佳,我在后面的讲解中将使用“破解方法”、“规避方法”等词汇。
50.3 反调试技术的分类
反调试技术多种多样,分类标准也五花八门。若分类得当,学习和理解就会非常容易。我从逆向分析人员的立场岀发,根据破解方法将反调试技术大致分为静态与动态两组,这两组内又可以细分出许多更小的组别。
调试运用了静态技术的程序文件时,只要在开始破解1次即可解除全部反调试限制。而运用动态技术的程序则要一边调试(遇到反调试代码时)一边破解。显然,破解应用了动态反调试技术的程序要困难得多。表50-1对各组别相关特征给出了详细说明,供各位参考。
50.3.1 静态反调试技术
静态反调试技术主要用来探测调试器,若探测到,则使程序无法正常运行。所以在调试器中打开应用了静态反调试技术的文件时,文件将无法正常运行(RUN )。但破解了文件中应用的静态反调试技术后,调试器就可以正常运行该程序文件了(参考图50-1)。
50.3.2 动态反调试技术
破解了程序文件的静态反调试技术后,并不能解决所有问题。若想了解程序的工作原理,还需要借助调试器中的跟踪技术来掌握程序代码与数据。但如果程序文件中应用了动态反调试技术,则很难再使用调试器中的跟踪技术,因为动态反调试技术会扰乱调试器跟踪的功能,使我们无法查看程序中的代码与数据(参考图50-2)。
调试器中,运行命令用来运行被调试进程,而跟踪命令则用来逐条运行被调试者内部指令,并允许用户实时查看寄存器、内存(栈)等。跟踪类似于逐行调试,跟踪 过程中,调试器与被调试进程相互往来大量调试事件。动态反调试技术就巧妙运用这些事件与调试器的工作原理来实现反调试。
后面会详细讲解各组别中具有代表性的一些技术。