首页
论坛
课程
招聘
code:PspTerminateProcess杀进程
2009-8-5 02:24 9486

code:PspTerminateProcess杀进程

2009-8-5 02:24
9486
//===============================PspTerminateProcess结束进程=============================================
/*PspTerminateProcess是内核未导出函数,需要自己定位
方法有二:
1、暴力搜索内存
2、从函数调用中定位(跟定位 SSDT Shadow一个原理)*/
//1、解析Ntoskerl.exe文件定位地址

typedef struct _SYSTEM_MODULE_INFORMATION
{
	ULONG Reserved[2];
	PVOID Base;  //基址
	ULONG Size;  // 镜像大小
	ULONG Flags;
	USHORT Index;
	USHORT Unknown;
	USHORT LoadCount;
	USHORT ModuleNameOffset;
	CHAR ImageName[256];
	
}SYSTEM_MODULE_INFORMATION,*PSYSTEM_MODULE_INFORMATION;

typedef NTSTATUS (*PSPTERMINATETPROCESS)(PEPROCESS Process,NTSTATUS ExitStatus);

ULONG GetPspTerminateProcess()
{
	//利用ZwQuerySystemInformation依据SystemModuleInformation获取Ntoskerl.exe基址和镜像大小,然后特征码搜索定位
	NTSTATUS status;
	PVOID buffer;
	ULONG size;   //动态分配大小
	ULONG code1=0x8b55ff8b, code2=0xa16456ec, code3=0x00000124, code4=0x3b08758b;   //SP2
	ULONG address;
	ULONG NtoskerlBase;
	ULONG NtoskerlEndAddress;
	ULONG i;
	PSYSTEM_MODULE_INFORMATION module;
	
	ZwQuerySystemInformation(SystemModuleInformation,&size,0,&size);  //返回需要size大小
	KdPrint(("[GetPspTerminateProcess] size:0x%x\n",size));
	buffer=ExAllocatePoolWithTag(NonPagedPool,size,MEM_TAG);
	if(buffer==NULL)
	{
		KdPrint(("[GetPspTerminateProcess] malloc memory failed\n"));
		return 0;
	}
	status=ZwQuerySystemInformation(SystemModuleInformation,buffer,size,0);
	if(!NT_SUCCESS(status))
	{
		KdPrint(("[GetPspTerminateProcess] query failed\n"));
		return status;
	}
	module=(PSYSTEM_MODULE_INFORMATION)((PULONG)buffer+1);
	NtoskerlBase=(ULONG)module->Base;
	NtoskerlEndAddress=(ULONG)module->Base+(ULONG)module->Size;
    KdPrint(("[GetPspTerminateProcess] Size :0x%x\n",(ULONG)module->Size));  //打印验证
	KdPrint(("[GetPspTerminateProcess] NtoskerlBase :0x%x\n",NtoskerlBase));  //打印验证
    KdPrint(("[GetPspTerminateProcess] NtoskerlEndAddress :0x%x\n",NtoskerlEndAddress));  //打印验证
	ExFreePool(buffer);
	//搜索特征码
	for(i=NtoskerlBase;i<=NtoskerlEndAddress;i++)
	{   
		if(MmIsAddressValid((PULONG)i))
		{  //蓝屏原因:搜索到之后就应该退出,少句代码return address
			if((*(PULONG)i==code1)&&(*(PULONG)(i+4)==code2)&&(*(PULONG)(i+8)==code3)&&(*(PULONG)(i+12)==code4))
			{
				address=(ULONG)i;
				KdPrint(("[GetPspTerminateProcess] address :0x%x\n",address));  //打印地址
				return address;
			}
		}
	}
	return 0;
}

VOID KillProcessWithPsp(ULONG epro)
{
	PSPTERMINATETPROCESS MyPspTerminateProcess;
	ULONG address;
	address=GetPspTerminateProcess();
	if(MmIsAddressValid((PULONG)address))
	{
		MyPspTerminateProcess =(PSPTERMINATETPROCESS)address;  //定位PspTerminateProcess
		MyPspTerminateProcess((PEPROCESS)epro,0);              //杀进程
	}
	else
		return;
	
}

看雪侠者千人榜,看看你上榜了吗?

收藏
点赞0
打赏
分享
最新回复 (7)
雪    币: 3482
活跃值: 活跃值 (203)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
寒冰心结 活跃值 2009-8-5 03:33
2
0
Anti PspTerminateProcess杀进程 and Anti PspTerminateProcessByPointer

遍历目标进程线程。找到ETHEAD

再利用线程标记偏移找到并修改flags

|= PS_CROSS_THREAD_FLAGS_SYSTEM..

关键代码段:

//找到线程标记偏移
ULONG GetCrossThreadFlagsOffset()
{
        static ULONG Offset = 0;
        PUCHAR pProc;
        if(Offset == 0)
                pProc = (PUCHAR)PsIsSystemThread;
        while( *pProc!=0x8B || *(pProc+1)!=0x80 )
                pProc++;
        DbgPrint("发现函数。address == 0x%0.8X",pProc);
        Offset = *(PULONG)(pProc+2);
        DbgPrint("偏移是0x%0.8X",Offset);
        return Offset;
}

需要保护的时候

Flags = (PULONG)( (PUCHAR)Thread + GetCrossThreadFlagsOffset() );
                                        *Flags |= PS_CROSS_THREAD_FLAGS_SYSTEM;
雪    币: 666
活跃值: 活跃值 (31)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
轩辕小聪 活跃值 7 2009-8-5 03:39
3
0
Anti 2楼的方法:
楼主另一帖:http://bbs.pediy.com/showthread.php?t=95032
而且现在更方便了,连flags都不用改了,2楼已经帮忙改好了
雪    币: 3482
活跃值: 活跃值 (203)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
寒冰心结 活跃值 2009-8-5 05:58
4
0
呵呵。。那个帖子本来我不太好意思发。。

不过想想算了。发一下也好。。

http://bbs.pediy.com/showthread.php?t=95032 第四楼。。

继续Anti 杀进程
雪    币: 78
活跃值: 活跃值 (18)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
竹君 活跃值 5 2009-8-5 08:41
5
0
不错 都直接上代码,代码说话
雪    币: 514
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xacker 活跃值 1 2009-8-6 01:07
6
0
这些纯粹依赖硬编码的代码   
借用mj说过的一句话就是
写的不是代码 是寂寞。
雪    币: 284
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jerrynpc 活跃值 2009-8-8 00:02
7
0
都是高手,我啥也不明白。感谢sd
雪    币: 250
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kxsz 活跃值 2009-8-9 12:40
8
0
mark,thx for share
游客
登录 | 注册 方可回帖
返回