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 位注入,参考这篇文章