首页
社区
课程
招聘
code:PspTerminateProcess杀进程
发表于: 2009-8-5 02:24 11895

code:PspTerminateProcess杀进程

2009-8-5 02:24
11895
//===============================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;
	
}

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

收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 8196
活跃值: (2791)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
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;
2009-8-5 03:33
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
3
Anti 2楼的方法:
楼主另一帖:http://bbs.pediy.com/showthread.php?t=95032
而且现在更方便了,连flags都不用改了,2楼已经帮忙改好了
2009-8-5 03:39
0
雪    币: 8196
活跃值: (2791)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
呵呵。。那个帖子本来我不太好意思发。。

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

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

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