首页
社区
课程
招聘
彻底禁用CPU的缓存系统
发表于: 2024-6-2 10:43 3651

彻底禁用CPU的缓存系统

2024-6-2 10:43
3651

如何关闭CPU的缓存系统,使得所有的内存都是不可缓存(UC)类型?
分以下三步:
1.将CR0寄存器的CD位和NE位分别置1和清0;
2.使用WBINVD指令使所有已缓存的数据无效,并且将所有回写(WB)类型的内存缓存写回内存;
3.通过修改MTRR控制MSR寄存器禁用MTRR使所有内存的默认类型为不可缓存类型(UC)

上代码

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
#include<ntifs.h>
#include<intrin.h>
#include"core.h"
 
 
 
 
VOID InitCallFramework(int iCpuNum)
 
{
    KAFFINITY cpugrop = 1;
    KIRQL irq;
    for (int i = 0; i < iCpuNum; ++i)
    {
        cpugrop = (i == 0) ? 1 : cpugrop << 1;
        KeSetSystemAffinityThreadEx(cpugrop);
        irq = KeRaiseIrqlToDpcLevel();
        DisableMTRR();
        KeLowerIrql(irq);
         
    }
    return;
}
 
 
VOID Unload(PDRIVER_OBJECT obj)
{
     
     
     
    DbgPrint("Unload!\n");
}
VOID UnloadEx(PDRIVER_OBJECT obj)
{
     
    DbgPrint("Unload!\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT obj, PUNICODE_STRING str)
{
     
    ULONG CpuNum = 8;//CPU物理核心数量
    InitCallFramework(CpuNum);
    obj->DriverUnload = Unload;
    return STATUS_SUCCESS;
}

以下是DisableMTRR函数的具体实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.code
DisableMTRR proc
    cli;
    mov rax,cr0;
    or rax,040000000h;;CD置1
    and rax,0dfffffffh;;NW置0
    mov cr0,rax;
    mov rax,cr4;
    and rax,0ffffffffffffff7fh;
    mov cr4,rax;
    wbinvd;
    mov ecx,02ffh;
    xor edx,edx;
    mov eax,0400h;
    wrmsr;
    wbinvd;
    sti
    ret
DisableMTRR endp
 
end

最后再说明一点,不要在VMawre里试验以上程序,因为VMware没有真正使用CPU缓存系统,在真机上试验才会看到效果。可以看到运行完运行完代码后电脑会得很卡,是非常卡哦!


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

收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 7089
活跃值: (3645)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
asd
2
断腕自废武功是吧
2024-6-2 14:05
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢 分享
2024-6-2 18:47
0
雪    币: 483
活跃值: (1798)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这玩意可以解决MTF刷新缓存后漏掉指令,666666666666,感谢楼主
2024-7-21 14:44
0
游客
登录 | 注册 方可回帖
返回
//