DLL动态链接库编程【5】Dll 远程线程注入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunjikui1255326447/article/details/88946213

DLL动态链接库编程【5】Dll 远程线程注入

 直接上具体步骤,不懂照做就行。

一、生成DLL文件。

1、打开vs2017----》文件------》新建----》项目---》确定:

2、点击确定后,如下图,打开dllmain.cpp文件在相应位置添加代码:

3、选中DllTest,右键单击-----》生成(我的是64位系统,所以为X64,32位请选择X86)如下图,在输出栏目可以看得到成功。

4、打开我们的debug目录,如下图:

二、现在开始想办法,将我们的DLL注入到目标线程。

1、右键单击解决方案----》添加-----》新建项-----》windows控制台应用程序,确定。

2、打开Dllcall工程目录,打开Dllcall.cpp文件,增加代码,全部代码如下:

Dllcall.cpp源码:

//运行程序前,请打开自己的计算器,运行程序后,dll的MessageBox会成功弹出。

#include "pch.h"
#include <iostream>

#include <Windows.h>
#include <Tchar.h>

#define path _T("C:\\Users\\tlsun\\source\\repos\\DllTest\\x64\\Debug\\DllTest.dll") //我自己生成的Dll路径

bool Inject(DWORD dwId, const wchar_t* szPath)
{
	//1 在目标进程中申请一个空间
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);
	LPVOID pRemoteAddress = VirtualAllocEx(
		hProcess,
		NULL,
		1,
		MEM_COMMIT,
		PAGE_READWRITE
	);
	//2 把dll的路径写入到对方的进程空间中
	SIZE_T dwWriteSize = 0;
	//写一段数据到指定进程所开辟的内存空间
	WriteProcessMemory(hProcess, pRemoteAddress, szPath, wcslen(szPath) * 2 + 2, &dwWriteSize);

	//3 创建一个远程线程,让目标进程调用LoadLibrary
	HANDLE hThread = CreateRemoteThread(
		hProcess,
		NULL,
		0,
		(LPTHREAD_START_ROUTINE)LoadLibrary,
		pRemoteAddress,
		NULL,
		NULL
	);
	WaitForSingleObject(hThread, -1);
	//4 释放申请的虚拟内存空间
	VirtualFreeEx(hProcess, pRemoteAddress, 1, MEM_DECOMMIT);
	return 0;
}


int _tmain(int argc, _TCHAR* argv[])
{
	DWORD dwId = 0;;
	HWND hCalc = FindWindow(NULL, L"计算器");
	DWORD dwPid = 0;
	DWORD dwRub = GetWindowThreadProcessId(hCalc, &dwPid);

	//选择自己输出PID或者自动获取
	//printf("请输入一个ID:");
	//scanf_s("%d",&dwPid);
	// RemoteThreadInject(dwPid,path);
	Inject(dwPid, path);
	return 0;
}

3、打开自己系统自带的计算器,选中Dllcall,右键单击,设置为启动项目,运行程序,发现已经成功:

三、说下远程线程注入Dll思路:

1、使用FindWindow函数,返回打开的窗口的句柄。(通俗说就是看这个窗口打开没,若是已经打开,接下来就获取进程号)

2、获取我们要找的进程的PID,GetWindowThreadProcessld。

3、在目标进程中申请一个空间

代码:

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);
    LPVOID pRemoteAddress = VirtualAllocEx(
        hProcess,
        NULL,
        1,
        MEM_COMMIT,
        PAGE_READWRITE
    );

4、把dll的路径写入到对方的进程空间中,写一段数据到指定进程所开辟的内存空间。

5、创建一个远程线程,让目标进程调用LoadLibrary

6、 释放申请的虚拟内存空间

注意:相关使用的函数,有不明白的直接去MSDN上查看。

猜你喜欢

转载自blog.csdn.net/sunjikui1255326447/article/details/88946213