首页
社区
课程
招聘
[原创]五花八门的反调试
发表于: 2019-7-16 15:46 14303

[原创]五花八门的反调试

2019-7-16 15:46
14303

IsDebuggerPresent查询进程环境块(PEB)中的IsDebugged标志。如果进程没有运行在调试器环境中,函数返回0;如果调试附加了进程,函数返回一个非零值。

CheckRemoteDebuggerPresent不仅可以查询系统其他进程是否被调试,而且还可以通过传递自己的进程句柄来判断自己是否被调试。

我们在编写程序的时候,经常会涉及到错误处理问题。我们用的最多的应该就是GetLastError()这个函数了。恶意代码可以使用异常来检查调试器。调试器捕获异常后,并不会立即将处理权返回被调试进程处理,大多数利用异常的反调试技术往往据此来检测调试器。

同样还可以使用CloseHandle、CloseWindow产生异常,使得错误码改变

下面是调试器在注册表中的一个常用位置。

32位系统:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug


64位系统:HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug


如果该这册表的键值被修改为OllyDbg,则恶意代码就可能确定它正在被调试。

比较简单的FindWindow函数会搜索顶级窗口的类名和窗口名称然后匹配指定的字符串。


EnumWindows函数枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数。

GetForegroundWindow获取一个前台窗口的句柄。

查找进程信息和枚举进程的思路大致是一样的,遍历进程比较字符串。


调试器设置软件断点的基本机制利用INT 3临时替换运行程序中的一条指令,然后当程序运行到这条指令时,调用调试异常处理例程。INT 3指令的机器码是0xCC,因此无论何时,使用调试器设置一个断点,它都会插入一个0xCC来修改代码。恶意代码常用的一种反调试技术是在它的代码中查找机器码0xCC,来扫描调试器对它代码的INT 3修改。repne scasb指令用于在一段数据缓冲区中搜索一个字节。EDI需指向缓冲区地址,AL则包含要找的字节,ECX设为缓冲区的长度。当ECX=0或找到该字节时,比较停止。

在OllyDbg的寄存器窗口我们可以看到DR0、DR1、DR2、DR3、DR6和DR7这几个寄存器。

DR0、Dr1、Dr2、Dr3用于设置硬件断点,DR4、DR5由系统保留。  DR6、DR7用于记录Dr0-Dr3中断点的相关属性。如果没有硬件断点,那么DR0、DR1、DR2、DR3这4个寄存器的值都为0。

我们知道机器运行的速度,远远比我们分析代码的速度快得多,利用这个差异性我们找到了用时钟检测来探测调试器存在的方法。记录一段操作前后的时间戳,然后比较这两个时间戳,如果存在滞后,则可以认为存在调试器。

较常用的时钟检测方法是利用rdtsc指令(操作码0x0F31),它返回至系统重新启动以来的时钟数,并且将其作为一个64位的值存入EDX:EAX中。恶意代码运行两次rdtsc指令,然后比较两次读取之间的差值。

explorer.exe创建进程的时候会把STARTUPINFO结构中的值设为0,然而不是explorer.exe创建进程的时候会忽略这个结构中的值,也就是结构中的值不为0。所以可以利用STARTUPINFO来判断程序是否在被调试。



[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2019-7-18 20:35 被一谷米粒编辑 ,原因:
收藏
免费 12
支持
分享
最新回复 (23)
雪    币: 977
活跃值: (435)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
感觉大佬最近很高产啊 厉害厉害
2019-7-16 16:00
0
雪    币: 161
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
涨姿势了
2019-7-16 16:13
0
雪    币: 14539
活跃值: (17553)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
4
mark,lz辛苦了,正好能用到,就是还没说怎么绕过这些反调试
2019-7-16 16:18
0
雪    币: 1927
活跃值: (49)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
5
大哥辛苦总结了
2019-7-16 16:25
0
雪    币: 34
活跃值: (101)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
哈哈,有意思。
2019-7-17 00:00
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢分享,留个mark
2019-7-17 02:10
0
雪    币: 9
活跃值: (379)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
666
2019-7-17 08:32
0
雪    币: 764
活跃值: (994)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
9
谢谢分享,留个mark
2019-7-17 09:32
0
雪    币: 57
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
感谢大佬分享
2019-7-17 10:39
0
雪    币: 6
活跃值: (1151)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
反调试确实又是一门值得研究的艺术
2019-7-17 11:05
0
雪    币: 1887
活跃值: (360)
能力值: ( LV8,RANK:121 )
在线值:
发帖
回帖
粉丝
12
源码留一下?
2019-7-17 11:10
0
雪    币: 4313
活跃值: (1534)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
13
kalikaikai 源码留一下?
非常抱歉,这个代码我没有保存的。
2019-7-17 12:56
0
雪    币: 288
活跃值: (89)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
fs寄存器里还有很多方法没列举出来
2019-7-17 15:02
0
雪    币: 1887
活跃值: (360)
能力值: ( LV8,RANK:121 )
在线值:
发帖
回帖
粉丝
15
一谷米粒 非常抱歉,这个代码我没有保存的。
https://bbs.pediy.com/thread-225740.htm  这篇更全 还有代码
2019-7-17 17:59
0
雪    币: 10284
活跃值: (2774)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
16
2.3和3.5的图贴错咯,望更正
2019-7-18 19:29
0
雪    币: 4313
活跃值: (1534)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
17
minorory 2.3和3.5的图贴错咯,望更正
感谢,图2.3已更正,3.5的图没问题哦
2019-7-18 20:36
0
雪    币: 168
活跃值: (265)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
谢谢分享,留个mark
2019-7-21 18:58
0
雪    币: 441
活跃值: (1060)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
19
mark 一下
2019-7-22 10:55
0
雪    币: 1128
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
mark
2019-7-22 14:47
0
雪    币: 217
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
调试与反调试正是在互相的反抗中互相提高
2020-10-26 22:55
0
雪    币: 2604
活跃值: (231)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
private const int ERROR_IRS_DEBUGCHECK = 0x0D000721;

        public static bool IsDebugged()
        {
            _ = SetLastError(ERROR_IRS_DEBUGCHECK);
            OutputDebugString("Hi, Debugger!");
            return GetLastError() == ERROR_IRS_DEBUGCHECK;
        }

无论有没有被调试都返回true,求教

2021-2-21 04:22
0
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
23
星雪鸢尾 private const int ERROR_IRS_DEBUGCHECK = 0x0D000721; ...
因为该方法仅适用于 vista 之前的系统
2021-2-21 04:32
0
雪    币: 2604
活跃值: (231)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
Sprite雪碧 因为该方法仅适用于 vista 之前的系统
原来是这样,谢谢指教
2021-2-21 06:58
0
游客
登录 | 注册 方可回帖
返回
//