一文带你实现远程线程注入和卸载

本文详细介绍了如何实现远程线程注入和卸载,主要通过Windows API的CreateRemoteThread来完成。首先讲解原理,然后阐述远程线程注入Dll的四个步骤,包括打开进程、分配内存、获取loadLibrary地址及创建线程。接着提到了代码实现时的注意事项,如避免非kernel32和user32库的API,禁用/GZ选项等。最后提供了代码实现的概述,并推荐了一套《JAVA核心知识点总结》的学习资源。
摘要由CSDN通过智能技术生成

1. 原理

主要通过API:CreateRemoteThread 来进行远程线程注入

2.远程线程注入Dll的步骤

1.通过进程Id打开指定的进程 2.在指定的进程,分配一段大小为要导入的dll文件名长度的一段内存空间,将dll的文件名写入到分配的内存中。 3.获取目的进程中的loadLibrary的函数地址。 4.创建远程线程,通过上一步获得的loadlibrary函数进行dll导入。 5.释放内存,卸载dll。

3.代码远程注入注意点

1.不能调用除kernel32和user32之外动态库中的api函数。 2.不能使用static字符串 3. 去掉编译器的/GZ编译选项。这个选项是默认的,不然注入进去被注入的程序会崩溃。 4. 要么把ThreadFunc和AfterThreadFunc声明为static,要么关闭编译器的“增量连接(incremental linking)”(看附录C)。 5. ThreadFunc中的局部变量总大小必须小于4k字节。注意,当degug编译时,这4k中大约有10个字节会被事先占用。 (注入64位的程序,那么也需要64位的dll,主要用的函数:NtCreateThreadEx)

4.代码实现

//提升权限
BOOL cRemoteThreadInject::grantPriviledge(char* priName)
{
	if(NULL == priName)
	{
		return FALSE;
	}

	TOKEN_PRIVILEGES tokenPriviledge, oldPriviledge;
	DWORD dwRetLength = sizeof(oldPriviledge);
	HANDLE tokenHandle = NULL;
	LUID uId;

	if (!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &tokenHandle))
	{
		if (ERROR_NO_TOKEN != GetLastError())
		{
			return FALSE;
		}

		if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &tokenHandle))
		{
			return FALSE;
		}
	}

	if (!Look
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值