首页
社区
课程
招聘
7
[原创]抛砖引玉—硬件断点的检测和反检测
发表于: 2013-11-22 00:04 40352

[原创]抛砖引玉—硬件断点的检测和反检测

2013-11-22 00:04
40352

硬件断点的检测和反检测

1、硬件断点设置的方法
     有矛必有盾,有盾必有矛,说硬件断点的检测和反检测之前我们先来谈谈硬件断点设置的常规方法
方法1:
     采用SetThreadContext直接设置指定线程的调试寄存器,由于这种方法简单实用,深受广大人民群众喜爱,具体怎么搞,附件代码中的SetHwBreakPoint函数有详细的code。
方法2:
     采用SEH或者VEH等异常处理技术设置硬件断点,原理是自己搞个SEH或者VEH,然后自己触发一个异常(比如除0),跳到自己的异常处理函数中,这里只说SEH的异常处理函数结构:SEHHandler proc C _pstExceptionRecord:DWORD, _pstSEH:DWORD, _pstContext:DWORD, _pDispatcherContext:DWORD。第3个参数_pstContext就是异常线程的所有调试器结构指针,聪明的朋友肯定就知道该怎么搞了。不清楚的朋友可以去看看SEH实现的过程。

2、硬件断点的检测方法
方法1的检测方法:
    GetThreadContext就是SetThreadContext的盾,把调试寄存器取过来送纪委检查检查就知道有没有人在干坏事了。
方法2的检测方法:
     其实同样是用方法2设置硬件断点的手段,只不过在SEH的异常处理函数中用_pstContext取调试寄存器送纪委就是了,当然用SEH只能检测当前线程的,要检测整个程序的还是用VEH好,方法类似。我附件里的SEHCheckHardPoint和SEHHandler就是一个简单的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
;名称:SEHCheckHardPoint
;功能:构建一个SEH,检测硬件断点
;参数:无
;返回:无
SEHCheckHardPoint proc
 
    assume  fs:nothing
    push    offset SEHTest_Ret                      ;压入安全代码的地址
    push    ebp                                     ;保存ebp
    push    SEHHandler                              ;压入SEH回调函数
    push    fs:[0]                                  ;保存原SEH
    mov     fs:[0], esp                             ;设置当前SEH
     
    xor     eax, eax
    mov     DWORD ptr [eax], 1                      ;人为的产生一个异常 
     
    SEHTest_Ret:
    pop     fs:[0]                                  ;恢复原SEH
    add     esp, 12                                 ;平衡堆栈
     
    ret
SEHCheckHardPoint endp
 
 
;名称:SEHHandler
;功能:SEH的异常处理函数,为cdecl调用
;参数:_pstExceptionRecord = 异常信息结构指针
;参数:_pstSEH = SEH结构指针
;参数:_pstContext = 发生异常线程的寄存器结构指针
;参数:_pDispatcherContext
;返回:无
SEHHandler proc C _pstExceptionRecord:DWORD, _pstSEH:DWORD, _pstContext:DWORD, _pDispatcherContext:DWORD
     
    pushad
     
    mov     ebx, _pstSEH
    mov     eax, [ebx + 8]
    mov     esi, _pstContext
    assume  esi:ptr CONTEXT
    mov     [esi].regEbp, eax                       ;恢复ebp
    mov     eax, [ebx + 12]
    mov     [esi].regEip, eax
     
    invoke  VK_PrintfMsg, CTXT("Dr0 = 0x%X"), [esi].iDr0    ;显示Dr0的值,如果不是0,说明被设硬件断点了
    assume  esi:nothing
    popad
     
    mov     eax, ExceptionContinueExecution
     
    ret
SEHHandler endp
1
2
3
4
5
6
7
8
9
10
11
12
7C92EAEC >  8B4C24 04       mov ecx,dword ptr ss:[esp+0x4]             
7C92EAF0    8B1C24          mov ebx,dword ptr ss:[esp]              
7C92EAF3    51              push ecx                                ; pContext
7C92EAF4    53              push ebx                                ; 压入pExceptionRecord
7C92EAF5    E8 C78C0200     call ntdll.7C9577C1                     ; 调用RtlDispatchException
7C92EAFA    0AC0            or al,al                                ; 判断返回是否为0,即是否调用成功
7C92EAFC    74 0C           je short ntdll.7C92EB0A                 ;失败则跳
7C92EAFE    5B              pop ebx
7C92EAFF    59              pop ecx
7C92EB00    6A 00           push 0x0
7C92EB02    51              push ecx
7C92EB03    E8 11EBFFFF     call ntdll.ZwContinue                   ; 调用RtlDispatchException成功则继续ZwContinue执行异常原来的代码

[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

上传的附件:
收藏
点赞 7
支持
分享
赞赏记录
参与人
雪币
留言
时间
心游尘世外
为你点赞~
2024-5-31 06:58
QinBeast
为你点赞~
2024-5-31 06:48
飘零丶
为你点赞~
2024-5-31 01:18
shinratensei
为你点赞~
2024-5-29 01:00
PLEBFE
为你点赞~
2023-3-5 04:16
Re_Upper
为你点赞~
2023-1-3 00:20
会简单的
为你点赞~
2022-4-12 21:27
最新回复 (12)
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
学习了。
2013-11-22 03:54
0
雪    币: 42
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
标记下。内核层也可行吗?
2013-11-22 12:05
0
雪    币: 659
活跃值: (499)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
4
内核层理论上应该是可以的,只是Hook函数不一样,还需要多处理一些东西,但是内核中搞SEH不是很稳定。
PS大家对这个主题不大感兴趣。
2013-11-24 23:01
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
谢谢分享,来看看
2013-11-24 23:18
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
6
2013-11-25 01:37
0
雪    币: 659
活跃值: (499)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=cvcvxk;1242123]一起扔板砖吧。

http://bbs.pediy.com/showthread.php?t=181833[/QUOTE]
我是引出玉了,哈哈
2013-11-25 09:14
0
雪    币: 248
活跃值: (1141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
注:RtlDispatchException这里我用的是硬编码,不同的电脑上可能会有不同,测试代码的朋友注意修正

如何修正呢?
2013-11-26 13:08
0
雪    币: 1600
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
标记下,需要在过来看
2013-12-13 14:30
0
雪    币: 77
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
国标 到此一游
2014-1-16 15:11
0
雪    币: 75
活跃值: (150)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
膜拜大牛唉   如果有C++的写法就好了 我就不用翻译了 哈哈
2014-8-16 02:06
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
内连
_asm
{
mov eax,dr0
mov value,eax
}
switch(value)
{
按情况分支就行了,主要检测dr0
}
2014-8-16 02:32
0
雪    币: 70
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
include D:\codes\Inc\VikiInc.inc
楼主请问这个文件在哪里
2019-1-22 17:04
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册