0
点赞
收藏
分享

微信扫一扫

DLL注入—— 远程线程

Dll 代码:

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <tlhelp32.h>

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox(NULL,L"DLL_PROCESS_ATTACH",L"LYSM",NULL);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

注入器代码:

#include "stdafx.h"
#include<stdio.h>
#include<Windows.h>
#include<TlHelp32.h>
#include <iostream>

using namespace std;

// 进程名查PID
DWORD getProcessHandle(LPCTSTR lpProcessName)
{
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 process = {sizeof(PROCESSENTRY32)};

while (Process32Next(hProcessSnap,&process))
{
if(strcmp(process.szExeFile, lpProcessName) == 0){return process.th32ProcessID;}
}

cout << "没有找到进程" << endl;
return 0;
}

int main(int argc,char *argv[])
{

// 初始化
DWORD dwpid = getProcessHandle("Injector.exe");
LPCSTR lpDllName = "E:\\MyFiles\\Programing\\vs2012\\MyPrograms\\Test_Dll\\Debug\\Test_Dll.dll";

// 取 Injector.exe 句柄
HANDLE hProcess = OpenProcess(
PROCESS_ALL_ACCESS, // 所有权限
FALSE, // 进程不继承句柄
dwpid // PID
);
if(!hProcess){cout << "OpenProcess 失败: " << GetLastError() << endl;}

// 为 dll 分配内存,并记录基地址
DWORD dwSize = strlen(lpDllName)+1;
LPVOID lpRemoteBuf = VirtualAllocEx(
hProcess, // 进程句柄
NULL, // 分配的起始地址
dwSize, // 分配的区域大小
MEM_COMMIT, // 类型,MEM_COMMIT:分配内存
PAGE_READWRITE // 内存保护属性,PAGE_READWRITE:可读可写
);

// 写入内存
if(!WriteProcessMemory(
hProcess, // 进程句柄
lpRemoteBuf, // dll 基地址指针
lpDllName, // 写入内容的缓冲区指针
dwSize, // 缓冲区字节大小
NULL // 接收实际写入的字节数
))
{cout << "WriteProcessMemory 失败:" << GetLastError() << endl;}

// 创建远程线程
HANDLE hNewRemoteThread = CreateRemoteThread(
hProcess, // 进程句柄
NULL, // 默认安全描述符,不继承句柄
NULL, // 默认的堆栈初始大小
(LPTHREAD_START_ROUTINE)LoadLibraryA, // 远程线程起始地址
lpRemoteBuf, // 线程函数基地址指针
NULL, // 线程在创建之后立即运行
NULL // 不返回线程标识符
);
if(!hNewRemoteThread){cout << "CreateRemoteThread 失败:" << GetLastError() << endl;}

// 等待线程句柄返回
WaitForSingleObject(
hNewRemoteThread, // 线程句柄
INFINITE // 超时时间,INFINITE:不返回则一直等待
);

// 关闭线程句柄
CloseHandle(hNewRemoteThread);


getchar();
return 0;
}

效果图:

DLL注入—— 远程线程_#include

注意!!

此处为 32 位程序,所以注入 64 位进程会失败!
​​​64 位注入,参考这篇文章​​



举报

相关推荐

0 条评论