c++ DLL注入与卸载

#include<Windows.h>
#include<stdio.h>
void UnInjectDLL(int PID) {
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);

	//使用CE找到的想要卸载的DLL的地址
	LPVOID pRetAddress = (LPVOID)0x544B0000;

	//HMODULE hModule = LoadLibrary("KERNEL32.DLL");// 使用CE查到的KERNEL32的地址 0x76850000;

	//使用CE找到的FreeLibrary的地址是 0x76869040
	//LPTHREAD_START_ROUTINE lp_start_address = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule, "FreeLibrary");

	HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,(LPTHREAD_START_ROUTINE)0x76869040, pRetAddress, 0, NULL);

	WaitForSingleObject(hThread, 2000);

	CloseHandle(hThread);
	CloseHandle(hProcess);

}
void inject1(int PID,const char* Path) {
	//参数:要注入进程的PID,要注入的DLL的路径参数指针


	//获取进程句柄,打开进程
	//参数PROCESS_ALL_ACCESS 获取进程所有的访问权限
	//参数二一般为false

	//参数三位进程pid
	//返回值:进程句柄
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);

	//在虚拟地址空间分配一块内存
	//VirtualAllocEx(进程句柄,指针 指定要分配的页面区域的所需起始地址,
	//要分配的内存区域的大小,内存分配类型,要分配内存区域的内存保护 一个内存保护常量)
	//返回值,要分配页面的基址
	//说白了就是申请一块内存给DLL路径
	LPVOID pRetAddress = VirtualAllocEx(hProcess, NULL, strlen(Path) + 1, MEM_COMMIT,PAGE_READWRITE);
	
	//WriteProcessMemory(要修改的进程内存的句柄,指向写入数据的指定进程中的基址的指针,
	//在指定进程的地址空间中写入的数据(一个指向缓存区的指针),要写入指定进程的字节数,可忽略参数NULL)
	//写入路径到上一行代码申请的内存中
	WriteProcessMemory(hProcess,pRetAddress,Path,strlen(Path) + 1,NULL);
	
	HMODULE hModule = LoadLibrary("KERNEL32.DLL");
	
	//获取loadlibrary的地址
	LPTHREAD_START_ROUTINE lp_start_address =(LPTHREAD_START_ROUTINE) GetProcAddress(hModule,"LoadLibraryA");
	
	//CreateRemoteThread()创建在另一个进程的虚拟地址空间中运行的线程
	//参数:CreateRemoteThread(进程句柄,NULL,堆栈的初始大小填0默认,loadlibrary的地址,
	//指向要传递给线程要执行的函数的变量(参数->DLL所在的路径)的指针,控制线程创建的标志 0为立即执行)
	//创建远程线程 - 并获取线程句柄
	HANDLE hThread = CreateRemoteThread(hProcess , NULL, 0, lp_start_address, pRetAddress,0,NULL);

	//等待线程事件,第二个参数为等待超时时间  这样可以防止线程阻塞
	WaitForSingleObject(hThread, 2000);

	//将线程和进程关掉
	CloseHandle(hThread);
	CloseHandle(hProcess);
}
int main() {
	const char* a = "G:\\C++ Study Project\\DllConnect\\Debug\\DLLStudy.dll";
	inject(2052,a);
	return 0;
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值