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; 
}

效果图:
在这里插入图片描述

注意!!

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值