DLL注入

一、流程

1、打开目标进程

2、获取LoadLibraryA函数地址

3、申请远程内存空间

4、将dll文件路径写入到内存

5、创建远程线程

6、关闭句柄

二、代码

1、dll的代码

#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
	if(ul_reason_for_call == DLL_THREAD_ATTACH)
	{
		MessageBoxA(0,"DLL注入成功!","提示",MB_OK);
	}
    return TRUE;
}

2、exe的代码

#include "stdafx.h"
#include<Windows.h>
#include<string>

void inject(int pid,char *path)
{

	//获取进程句柄,得到进程的所有权限,不用在进程中创建子进程来获取句柄所以第二个参数传NULL就好
	//第三个表示进程的ID
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, pid);

	/*
	调用生成lpStartAddress变量
	这个变量是一个函数指针
	用来表示远程进程中线程的起始地址
	这里采用使用LoadLibrayA函数来处理
	*/

	//获取LoadLibraryA的dll
	HMODULE hModule = LoadLibrary(TEXT("Kernel32.dll"));
	//将kernel32.dll中的LoadLibraryA函数的地址获取
	LPTHREAD_START_ROUTINE lpStartAddress = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule,"LoadLibraryA");
	
	//申请一块虚拟内存的地址给传入的函数参数来处理,然后还需要给参数赋值
	//相当于申明一个变量后还要给变量赋值才能使用
	LPVOID pReturnAddress = VirtualAllocEx(hProcess,NULL,strlen(path)+1, MEM_COMMIT,PAGE_READWRITE);
	WriteProcessMemory(hProcess, pReturnAddress, path, strlen(path) + 1, NULL);
	
	//创建远程线程
	HMODULE hThread = (struct HINSTANCE__ *)CreateRemoteThread(hProcess,NULL,0,lpStartAddress,pReturnAddress,0,NULL);

	WaitForSingleObject(hThread,-1);
	VirtualFreeEx(hProcess,path,0,MEM_RELEASE);
	CloseHandle(hThread);
	CloseHandle(hProcess);
};						

int main(int argc, char* argv[])
{
	//这里输入进程id
	int pid = 3660;
	//这里输入dll文件路径
	char p[] = "C://B.dll";
	inject(pid, p);
	return 0;

}

posted @ 2021-12-29 17:22  lnterpreter  阅读(97)  评论(0编辑  收藏  举报