红队免杀必会-进程注入--注册表-全局钩

本文详细介绍了Windows系统中的进程注入技术,包括DLL注入、AppInit_DLLs注册表注入和全局钩子注入。通过代码示例展示了如何实现这些注入方式,以及在注入过程中遇到的权限提升和异常处理问题。同时,提到了Windows的安全机制变化,如Win7之后对DLL加载的控制。文章最后探讨了全局钩子如何利用DLL实现跨进程注入,并讨论了共享内存作为跨进程通信的一种方式。
摘要由CSDN通过智能技术生成

前言

​ 进程注入 ,简而言之就是将代码注入到另一个进程中,跨进程内存注入,即攻击者将其代码隐藏在合法进程中,长期以来一直被用作逃避检测的手段.

​ 进程的注入方式可以分为DLL注入和shellcode注入,这两种方式本质上没有区别,在操作系统层面上,dll也就是shellcode的汇编代码。

代码框架

​ 想法是尽量用一个通用的注入框架,有异常接收,令牌权限开启,获取进程PID的功能,只需要在main函数中调用不同的注入方式:

#include "public.h"
int main() {
	DWORD pid = GetPid();
	if (pid == 0) {
		ShowError("Getpid");
		return -1;
	}
	//std::cout<<"Pid:" << pid << std::endl;
	if (!EnableDebugPrivilege(TRUE)) {
		ShowError("EnableDebugPrivilege");
		return -1;
	}

	BOOL bRet = Inject(DWORD dwPid, CHAR code[]);
	if (bRet != TRUE)
	{
		ShowError("Inject");
		return -1;
	}
	system("pause");
	return 0;
}
BOOL Inject(DWORD dwPid, CHAR code[])
{
	BOOL ret = TRUE;
	return ret;
}

获取进程pid

​ 主要实现通过进程名称获取进程Pid,代码很简单如下:

DWORD GetPid() {
	//获取进程快照
	HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	//创建进程结构体
	PROCESSENTRY32 process = { 0 };
	process.dwSize = sizeof(process);
	if (Process32First(snapshot, &process)) {
		do {
			if (!wcscmp(process.szExeFile, L"notepad.exe"))
				break;
		} while (Process32Next(snapshot, &process));

	}
	CloseHandle(snapshot);
	return process.th32ProcessID;
}

错误处理

​ 错误、异常处理,用来接收的返回值GetLastError():

VOID ShowError(PCHAR msg)
{
	printf("%s Error %d\n", msg, GetLastError());
}

进程提权

AdjustTokenPrivileges

​ 在进程注入中,如果要对其他进程(包括系统进程和服务进程)进行注入,需要获取当前进程的SeDeBug权限来调用OpenProcess打开要注入的进程。如果用户是管理员组下的成员是具有该权限的。

​ 但是当我们用Administrator身份去打开一个进程时,还是会出现拒绝访问的错误:

image-20220308101220544

错误代码为5表示拒绝访问:

image-20220308101349718

这是因为默认情况下,某些进程的访问权限是没有开启的。所谓的"提权",其实就是将原有的权限开启,并不是真正意思上的提权,微软提供了一些可供我们修改令牌权限,比如:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值