程序中包含很多的信息来帮助程序运行的正确,这也提供了反调试的一个基础,比如进程环境块(PEB)线程环境块(TEB)等。在实际的反调试的中存在几种情况:
一、使用系统API函数
最常见的就是IsDebuggerPresent,通过查询进程环境块(PEB)中的IsDebugged标志,判断程序是否被调试
二、干扰调试器的功能
1、TLS回调函数
TLS运行在main函数执行之前,会先执行TLS_CALLBACK函数,在函数开启或结束,线程或进程创建,结束之前都会调用TLS回调函数。简单的方式可以在main函数执行前调用IsDebuggerPresent函数检查它是否正在被调试。TLS在PE文件中image-TLS-Directory中表现,一个程序可以注册多个TLS回调函数。
调试TLS回调函数的时候,可以在OllyDbg中选择Options->Debugging Options->Events,然后设置System break-point作为第一个暂停的位置,这样就可以让OllyDbg在TLS回调执行前暂停。
解决方法:定位PE文件中,把TLS回调函数的指针全部改为0即可。(去除重定向表也差不多)
2.利用中断
因为调试器使用INT 3来设置软件断点,所以一种反调试技术就是在合法代码段中插入0xCC(INT 3)欺骗调试器,使其认为这些0xCC机器码是自己设置的断点。
参考:看雪论坛
网友评论