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

code:内存清零

2009-8-5 02:16
12930
//====================================内存填零杀进程=====================================================
//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 );
}

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

收藏
免费 7
支持
分享
最新回复 (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
游客
登录 | 注册 方可回帖
返回
//