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

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

一、生成DLL文件。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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动态链接库编程【5】Dll 远程线程注入_内存空间_08

三、说下远程线程注入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上查看。

若发生第一次加载成功,第二次不成功,则可能是第二次未能读取Dll,关闭占用Dll的进程则可以重新加载。

项目地址:链接:https://pan.baidu.com/s/1JCZZg4GhcJPeSnyLkS_srQ 
提取码:6jmt