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上查看。
若发生第一次加载成功,第二次不成功,则可能是第二次未能读取Dll,关闭占用Dll的进程则可以重新加载。
项目地址:链接:https://pan.baidu.com/s/1JCZZg4GhcJPeSnyLkS_srQ
提取码:6jmt