0环进程断链

文章介绍了如何通过PsLookupProcessByProcessId查询PID为4的进程并获取PEPROCESS结构,以及如何隐藏和显示进程链表中的节点。作者展示了HideProcess函数用于从链表中移除进程,而UnHideProcess函数则用于恢复进程在链表中的位置。

通过PsLookupProcessByProcessId查询PID=4的进程获得eprocess,再通过偏移量遍历链表对比断链。

PEPROCESS HideProcess(PCHAR sourceName) {
	PEPROCESS processNode = 0;
	NTSTATUS status = PsLookupProcessByProcessId((HANDLE)4, &processNode);
	if (!NT_SUCCESS(status)) {
		DbgPrint("PsLookupProcessByProcessId\n");
		return STATUS_UNSUCCESSFUL;
	}

	PLIST_ENTRY pCur = processNode;
	PLIST_ENTRY pNext = processNode;
	STRING sourceStr = { 0 };
	RtlInitString(&sourceStr, sourceName);
	STRING targetStr = { 0 };
	do {
		pNext = (ULONG)((PLIST_ENTRY)((ULONG)pNext + 0xb8))->Flink - 0xb8;
		RtlInitString(&targetStr, (PCHAR)pNext + 0x16c);
		if (!RtlCompareString(&sourceStr, &targetStr, TRUE)) {
			DbgPrint("PROCESS:%p %s\n", pNext, (PCHAR)pNext + 0x16c);
			RemoveEntryList((ULONG)pNext + 0xb8);
			ObDereferenceObject(processNode);
			return pNext;
		}
	} while (pNext - pCur);
	ObDereferenceObject(processNode);
	return 0;
}

复原

VOID UnHideProcess(PEPROCESS processNode) {
	PLIST_ENTRY Node = (PUCHAR)processNode + 0xb8;
	PLIST_ENTRY LastNode = Node->Blink;
	PLIST_ENTRY NextNode = Node->Flink;
	LastNode->Flink = Node;
	NextNode->Blink = Node;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值