首页
社区
课程
招聘
7
code:内存清零
发表于: 2009-8-5 02:16 13074

code:内存清零

2009-8-5 02:16
13074
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
//====================================内存填零杀进程=====================================================
//4个函数声明
void KeAttachProcess(PEPROCESS Process);
 
void KeDetachProcess();
 
NTSTATUS
ObOpenObjectByPointer(
                      IN PVOID Object,
                      IN ULONG HandleAttributes,
                      IN PACCESS_STATE PassedAccessState OPTIONAL,
                      IN ACCESS_MASK DesiredAccess,
                      IN POBJECT_TYPE ObjectType OPTIONAL,
                      IN KPROCESSOR_MODE AccessMode,
                      OUT PHANDLE Handle
                      );
 
 
NTSTATUS
ZwTerminateProcess(
                   IN HANDLE ProcessHandle OPTIONAL,
                   IN NTSTATUS ExitStatus
                   );
 
//进程虚拟空间填0
void DestoryProcessWithZero(ULONG eprocess)
{
    ULONG virtualAddr;
    PVOID handle;
    KeAttachProcess((PEPROCESS)eprocess);  //Attach进程虚拟空间
    for(virtualAddr=0;virtualAddr<=0x7fffffff;virtualAddr+=0x1000)
    
        //蓝屏原因:用户内存是否可写要进行验证。用ProbeForWrite函数
        if(MmIsAddressValid((PVOID)virtualAddr))
        {
            _try
            {
                ProbeForWrite((PVOID)virtualAddr,0x1000,sizeof(ULONG));
                //RtlZeroMemory((PVOID)virtualAddr, 0x1000);
                memset((PVOID)virtualAddr,0xcc,0x1000);
            }_except(1)
            {
                continue;  
            }
        }
        else
        {
            if(virtualAddr>0x1000000)  //填这么多足够破坏进程数据了
                break;
        }
    }
    KeDetachProcess();
    if(ObOpenObjectByPointer((PVOID)eprocess, 0, NULL, 0, NULL, KernelMode, &handle)!=STATUS_SUCCESS)
        return;
    ZwTerminateProcess((HANDLE)handle, STATUS_SUCCESS);
    ZwClose((HANDLE)handle );
}

[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 7
支持
分享
赞赏记录
参与人
雪币
留言
时间
Youlor
为你点赞~
2024-2-25 00:18
伟叔叔
为你点赞~
2024-1-4 04:32
QinBeast
为你点赞~
2023-12-9 00:03
shinratensei
为你点赞~
2023-10-11 04:05
PLEBFE
为你点赞~
2023-10-10 00:00
心游尘世外
为你点赞~
2023-9-27 00:21
飘零丶
为你点赞~
2023-9-20 00:19
最新回复 (15)
雪    币: 227
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
顶下,
2009-8-5 12:44
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
始终觉得太危险。没什么用 。
2009-8-5 19:29
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看下,
2009-8-6 13:56
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不知道360能不能被干掉
2009-8-6 13:58
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
360我没安装 理论上可以干掉吧
2009-8-7 13:01
0
雪    币: 152
活跃值: (106)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
太牛B了..膜拜..大哥
2009-8-7 13:22
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
8
这段代码会蓝屏的,但:
if(virtualAddr>0x1000000)  //填这么多足够破坏进程数据了
        break;
这个判断极大降低了蓝屏的概率,但填这么多其实是不够的。大部分程序默认加载地址是0x00400000,所以对大部分程序有效,但是有些别有用心的一小撮程序改掉加载地址后就无效了。

正确的清0代码如下:(出自DebugMan)
VOID ZeroIt(PEPROCESS pProcess){
        ULONG start,tmp;
        KAPC_STATE kapc;
        PHYSICAL_ADDRESS physicalAddr;

        KeStackAttachProcess(pProcess,&kapc);

        for(start=0x00010000;start< 0x60000000;start+=0x1000){
                physicalAddr = MmGetPhysicalAddress((PVOID)start);
                if( physicalAddr.HighPart > g_PhysicalPage.HighPart )
                        continue;
                if( physicalAddr.HighPart == g_PhysicalPage.HighPart &&
                        physicalAddr.LowPart >= g_PhysicalPage.LowPart   )
                        continue;
                if ( !(physicalAddr.HighPart | physicalAddr.LowPart) )
                        continue;
                if(start!=(ULONG)MmGetVirtualForPhysical(physicalAddr))
                        continue;
               
                __asm {
                        cli;
                        mov eax,cr0;
                        and eax,not 10000h;
                        mov cr0,eax;
                }
                __try{
                        RtlZeroMemory( (PVOID)start, 0x1000);
                }__except(1){
                }
                __asm {
                        mov  eax,cr0
                        or   eax,10000h
                        mov  cr0,eax
                        sti
                }
        }

        KeUnstackDetachProcess (&kapc);
}
2009-8-7 13:26
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
9
那是RKU的 我没遇到蓝屏
2009-8-8 19:28
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
wow! It's unsafe.
2009-8-8 21:43
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
感谢啊~~顶啊
2009-8-9 20:45
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这么清内存太暴力了吧!
有部分内存是不能清的,相当不安全!
2009-8-13 17:59
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
13
本来就是暴力的,本来就是想让目标进程挂掉,本来就是只有在其他方法不起作用时才不得已而为之的。
2009-8-13 18:05
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
看来看去都不实用
2009-8-13 20:11
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
有同步问题,在检测完成,关中断之前,用户的虚拟地址空间随时可以发生变化,关中断时发生Page Fault 就直接BugCheck。补充一下,即使地址空间不发生变化,地址存在也不表示地址可写
关中断后由于在单CPU内核上不会收到时钟中断,因而不会调度其他线程;在SMP上收不到IPI,也不会调度调度其他线程和改变虚拟地址空间,应该问题不大
2009-8-16 10:35
0
雪    币: 112
活跃值: (48)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
16
这个早有了。。。。。。。。。。。。。。。。。
2009-8-16 11:57
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

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