首页
社区
课程
招聘
[原创]NMI游戏攻防堆栈数据流回缩检测(NMI_DPC_APC)
发表于: 2022-8-9 05:46 12626

[原创]NMI游戏攻防堆栈数据流回缩检测(NMI_DPC_APC)

2022-8-9 05:46
12626

一.前言

1.NMI

NMI (Non Maskable Interrupt)——不可屏蔽中断(即CPU不能屏蔽)
无论状态寄存器中 IF 位的状态如何,CPU收到有效的NMI必须进行响应;NMI是上升沿有效;中断类型号固定为2;它在被响应时无中断响应周期.不可屏蔽中断通常用于故障处理(如:协处理器运算出错,存储器校验出错,I/O通道校验出错等).

2.介绍

由于驱动读写相关驱动现在都是无模块拉伸.sys不容易被查 聪明的大佬想到下列方案
NMI-DPC-APC这3个强制打断执行线程历程广泛应用到游戏公司反作弊系统,利用线程高频率插入做到高频触发来模糊定位一些执行体代码。

3.实现原理

很简单抓堆栈数据大一点无所谓 排斥垃圾数据MmIsAddressValid,小地址,就要内核地址就行挨个去过滤分析出异常无模块驱动

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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <ntifs.h>
#include<nthalext.h>
PVOID g_NmiCountText = 0;
PVOID g_Nmiaffinity = 0;
PVOID g_Nmipag = 0;
 
typedef struct _KAFFINITY_EX {
    SHORT Count;
    SHORT Size;
    ULONG Padding;
    ULONG64 bitmap[20];
} KAFFINITYEX, * PKAFFINITYEX;
 
typedef void (__fastcall* _KeInitializeAffinityEx)(PKAFFINITYEX pkaff);
typedef void (__fastcall* _KeAddProcessorAffinityEx)(PKAFFINITYEX pkaff, ULONG nmu);
typedef void (__fastcall *_HalSendNMI)(ULONG64 a1);
//每个核插入
VOID
KeGenericCallDpc(
    __in PKDEFERRED_ROUTINE Routine,
    __in_opt PVOID Context
);
 
//释放锁
VOID
KeSignalCallDpcDone(
    __in PVOID SystemArgument1
);
 
 
 
VOID
DpcCallback1(
    _In_ struct _KDPC* Dpc,
    _In_opt_ PVOID DeferredContext,
    _In_opt_ PVOID SystemArgument1,
    _In_opt_ PVOID SystemArgument2
)
{
    DbgBreakPoint();
    ULONG number = KeGetCurrentProcessorNumber();
    KdPrintEx((77, 0, "DpcCallback CALL %d\r\n", number));
    //释放锁
    KeSignalCallDpcDone(SystemArgument1);
}
 
//等待函数
VOID KernelSleep(ULONG_PTR mm, BOOLEAN isAlert)
{
    /***********************************************************************************************
        *函数名 :KernelSleep
        *函数功能描述 :等待函数
        *函数参数 :
            参数1:毫秒
            参数2:可报错TRUE or FALSE
        *函数返回值 :HANDLE
        ***********************************************************************************************/
 
    LARGE_INTEGER in = { 0 };
    in.QuadPart = -10000 * mm;
    KeDelayExecutionThread(KernelMode, isAlert, &in);
 
 
}
//出发nmi中断
BOOLEAN NmiThread()
{
    UNICODE_STRING SystemRoutineName = { 0 };
    ULONG numCors= KeQueryActiveProcessorCountEx(0);
    RtlInitUnicodeString(&SystemRoutineName, L"HalSendNMI");
    _HalSendNMI HalSendNMI= MmGetSystemRoutineAddress(&SystemRoutineName);
    RtlInitUnicodeString(&SystemRoutineName, L"KeInitializeAffinityEx");
    _KeInitializeAffinityEx KeInitializeAffinityEx = MmGetSystemRoutineAddress(&SystemRoutineName);
    RtlInitUnicodeString(&SystemRoutineName, L"KeAddProcessorAffinityEx");
    _KeAddProcessorAffinityEx KeAddProcessorAffinityEx = MmGetSystemRoutineAddress(&SystemRoutineName);
    while (1)
    {
        //每个核执行一次nmi 2号中断
        for (size_t i = 0; i < numCors; i++)
        {
            KeInitializeAffinityEx(g_Nmiaffinity);
            KeAddProcessorAffinityEx(g_Nmiaffinity, i);
            HalSendNMI(g_Nmiaffinity);
            KernelSleep(1000,1);
        }
    }
}
BOOLEAN DpcThread()
{
    while (1)
    {
        KeGenericCallDpc(DpcCallback1, NULL);
        KernelSleep(1000, 0);
    }
 
}
//nmi回调
BOOLEAN NmiCallBack(PVOID Context,BOOLEAN handule)
{
    KdPrint((77,0,"触发一次nmi\r\n"));
    //必须返回1不处理0交给操作系统处理(蓝屏)
    return 1;
}
//驱动卸载回调
VOID DriverUpload(PDRIVER_OBJECT pDriver)
{
 
    KdPrintEx((77, 0, "________驱动卸载__________\r\n"));
}
 
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegString)
{
    //1.做掉目标线程
    //2.堆栈数据检测
    //3.根据堆栈回缩无模块驱动检测
    //-----------------------------------------------------------------------------
    //nmi
    HANDLE thread_hanlde[10];
    ULONG numCors= KeQueryActiveProcessorCountEx(0);//几个核心
    g_NmiCountText= ExAllocatePoolWithTag(NonPagedPool, numCors * 0x500, 'tag');
    g_Nmiaffinity= ExAllocatePoolWithTag(NonPagedPool, sizeof(KAFFINITYEX), 'tag');
    g_Nmipag= ExAllocatePoolWithTag(NonPagedPool, 0x1000, 'tag');
    KeRegisterNmiCallback(NmiCallBack, g_NmiCountText);
    PsCreateSystemThread(&thread_hanlde[0],
         THREAD_ALL_ACCESS, NULL, NtCurrentProcess(), NULL, NmiThread, 0);
    //-----------------------------------------------------------------------------
    //-----------------------------------------------------------------------------
    //dpc
    PsCreateSystemThread(&thread_hanlde[1],
        THREAD_ALL_ACCESS, NULL, NtCurrentProcess(), NULL, DpcThread, 0);
    //-----------------------------------------------------------------------------
    //-----------------------------------------------------------------------------
    //apc我就不写了大家都懂愿意写源码一堆
 
    //-----------------------------------------------------------------------------
    KdPrintEx((77, 0, "________加载成功__________\r\n"));
    pDriverObject->DriverUnload = DriverUpload;
    return STATUS_SUCCESS;
}

反制手段

1.走白名单驱动
2.干掉相关回调废了他

总结

欢迎补充各种中断回调历程,太狠了这帮游戏公司大佬扛不住哦


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
支持
分享
最新回复 (21)
雪    币: 1197
活跃值: (4011)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
没太懂什么是堆栈数据流回缩,我知道有个栈回潮,不知道和你说的是不是一个东西
2022-8-9 09:45
2
雪    币: 43
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
是这样的呀 堆栈的数据流啊 
2022-8-9 09:57
1
雪    币: 12857
活跃值: (9172)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
4
这波跟ID配合的很好
2022-8-9 10:18
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
5
不是封弊者我不认可
2022-8-9 10:52
0
雪    币: 43
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
hzqst 大哥哥我们很熟的哦
2022-8-9 11:03
0
雪    币: 43
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
大哥哥 带带我 我吃不起饭了
2022-8-9 11:07
0
雪    币: 12857
活跃值: (9172)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
8
作弊者 大哥哥 带带我 我吃不起饭了
吃不起饭可以把闲置的房子租出去.jpg
2022-8-9 11:41
0
雪    币: 43
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
大表哥现在什么地方干呢
2022-8-9 11:44
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
hzqst 这波跟ID配合的很好
大表哥~能问一下技术上的一些问题吗?有偿咨询~望指点迷津,扣594157090
2022-8-12 19:00
0
雪    币: 138
活跃值: (461)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
无模块拉伸,是什么意思?
2022-8-16 22:05
0
雪    币: 3785
活跃值: (3947)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
感谢分享!
2022-9-20 15:27
0
雪    币: 1935
活跃值: (4180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感谢分享!
2022-9-21 22:43
0
雪    币: 998
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
hzqst 吃不起饭可以把闲置的房子租出去.jpg
大表哥 看你这评论 明显就是已经带着钱走了的.难道不会觉得不吃一次国家免费饭不算大佬吗.
2022-10-1 06:15
0
雪    币: 2333
活跃值: (3902)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
15
玄学定位
2022-10-1 06:55
0
雪    币: 8401
活跃值: (4976)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
这不卡么?
2022-10-1 14:21
0
雪    币: 401
活跃值: (4116)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
作弊者 大哥哥 带带我 我吃不起饭了
make
2022-10-29 01:19
0
雪    币: 1223
活跃值: (4727)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
18
2022-10-29 01:47
0
雪    币: 5371
活跃值: (2995)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
支持一下
2022-10-29 09:34
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
简单的说就是针对无模块的驱动进行堆栈数据流的异常检测和分块内存回流方式的寻回而已,这个技术早就有了,干掉一个线程就解决了。
2022-10-29 10:06
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
21
其实就是另类的爆搜内存方式来查找无模块的sys Loader 而已,只是你的方法更加和谐一些,打掉你DPC让你这个玩意就可以回到宇宙的初始之地了
2022-10-29 10:08
0
雪    币: 6124
活跃值: (4721)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
22
AC不会用的
2022-10-29 16:33
0
游客
登录 | 注册 方可回帖
返回
//