首页
社区
课程
招聘
[原创]反硬件断点检测附源码
2023-1-18 01:48 10439

[原创]反硬件断点检测附源码

2023-1-18 01:48
10439

反硬件断点检测

关于硬件断点检测:https://bbs.kanxue.com/thread-181720.htm

话不多说上代码

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
namespace VEHShut
{
 
    byte* func = NULL;
    int BeckupHardwareBP[5] = { 0 };
    int cAddrRtlDispatchException = NULL;
 
 
 
    class hooks
    {
    public:
        CONTEXT backUpcontext;
        PCONTEXT SetContext;
        hooks(PCONTEXT context)
        {
            backUpcontext = *context;
        }
        ~hooks()noexcept
        {
            SetContext->Dr0 = backUpcontext.Dr0;
            SetContext->Dr1 = backUpcontext.Dr1;
            SetContext->Dr2 = backUpcontext.Dr2;
            SetContext->Dr3 = backUpcontext.Dr3;
            SetContext->Dr6 = backUpcontext.Dr6;
            SetContext->Dr7 = backUpcontext.Dr7;
        }
    };
 
 
 
    bool GetRtlDispatcherAddr()
    {
 
        if (cAddrRtlDispatchException)return true;
        func = (byte*)GetProcAddress(GetModuleHandleA(XorString("ntdll.dll")), XorString("RtlUnwind"));
 
 
 
 
        func += 0x20;
        if (!func)
        {
            DbgPrintA("[-]未找到RtlUnwind");
            return false;;
        }
 
 
        for (int i = 0; i < 0x200; i++)
        {
            //8B FF 55 8B EC
            if (func[i] == 0x8B&& func[i+1] == 0xFF && func[i+2] == 0x55 && func[i+3] == 0x8B && func[i+4] == 0xEC)
            {
 
                cAddrRtlDispatchException = (int)func+i;
                printf("cAddrRtlDispatchException -> 0x%X\r\n", cAddrRtlDispatchException);
                return true;
            }
        }
        return false;
    }
 
 
    typedef void(_stdcall* _RtlExceptionDispatche)(PEXCEPTION_RECORD ExceptionRecord, PCONTEXT  Context);
 
    _RtlExceptionDispatche Old_RtlExceptionDispatche = NULL;
    uint64_t o_RtlExceptionDispatcher = NULL;
 
    NOINLINE void _stdcall RtlExceptionDispatcher(PEXCEPTION_RECORD ExceptionRecord, PCONTEXT  Context)noexcept
    {
        auto reset = hooks(Context);
        if (Context)
        {
 
            if (Context->ContextFlags & CONTEXT_DEBUG_REGISTERS)
            {
                Context->Dr0 = 0;
                Context->Dr1 = 0;
                Context->Dr2 = 0;
                Context->Dr3 = 0;
                Context->Dr6 = 0;
                Context->Dr7 = 0;
 
            }
        }
        return PLH::FnCast(o_RtlExceptionDispatcher, Old_RtlExceptionDispatche)(ExceptionRecord, Context);
    }
 
 
 
 
 
    void ShutUpVEH()
    {
        if (GetRtlDispatcherAddr())
        {
 
            PLH::CapstoneDisassembler dis(PLH::Mode::x86);
            Old_RtlExceptionDispatche = (_RtlExceptionDispatche)cAddrRtlDispatchException;
            PLH::x86Detour detour_RtlExceptionDispatcher((char*)cAddrRtlDispatchException, (char*)&RtlExceptionDispatcher, &o_RtlExceptionDispatcher, dis);
            if (!detour_RtlExceptionDispatcher.hook())
            {
                DbgPrintA("[-] detour_RtlExceptionDispatcher Failed\r\n");
            }
 
        }       
    }
 
 
}

在前辈的文章中是使用了纯汇编的写法,我这里将其简单转成了C++的格式并且动态定位Hook函数,使用PolyHook2,Hook了RtlExceptionDispatcher,在其中将DR寄存器清0,然后利用析构函数的特性会待RtlExceptionDispatcher函数执行完之后将其修复,我个人按照前辈的方法使用纯汇编Hook KiUserExceptionDispatcher是存在一些问题的,所以换了一条路
最后附上使用本例子Hook DX9的效果图

也算是在2023年交了份2013年的作业吧哈哈
最后感谢前辈们的辛勤付出,正所谓前人栽树后人乘凉,如果没有你们我作为一个后生无法在这个知识付费的时代享受到如此优质的资源

 

参考资料:
1.PolyHook2 https://github.com/stevemk14ebr/polyhook_2_0
2.[原创]抛砖引玉—硬件断点的检测和反检测 https://bbs.kanxue.com/thread-181720.htm


[培训]《安卓高级研修班(网课)》月薪三万计划

最后于 2023-1-18 02:28 被AlexLoNe编辑 ,原因:
收藏
点赞5
打赏
分享
最新回复 (6)
雪    币: 10545
活跃值: (3936)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jgs 2023-1-18 06:36
2
0
收藏学习,谢谢楼主提供
雪    币: 11980
活跃值: (15277)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2023-1-18 09:05
3
0
感谢分享
雪    币: 3525
活跃值: (3632)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caolinkai 2023-5-19 23:39
4
0
雪    币: 1390
活跃值: (3105)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小希希 2023-5-22 21:56
5
0
感谢分享
雪    币: 18614
活跃值: (27889)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-5-23 09:03
6
1
感谢分享
雪    币: 2332
活跃值: (2571)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
院士 2023-5-24 20:59
7
0
大佬,这段代码要如何调用呢?
游客
登录 | 注册 方可回帖
返回