当前位置:编程学习 > C/C++ >>

实现dll注入到explorer进程

为了完成一个小程序写的一段代码,记下,查了不少资料
//
// 实现dll注入到explorer进程 code by LengF 2011-5-3
//

#include
#include // 声明快照函数的头文件
#include "stdio.h"
#include "tchar.h" // _tcsrchr

// 插入dll目标进程
LPTSTR Target="iexplore.exe";

DWORD FindProcess(LPTSTR lpszProName); // 查找进程
BOOL RemoteLoadLibrary(DWORD dwPID,LPCSTR lpszDll); // 插入进程

int main(int argc, char* argv[])
{
DWORD pid;
char dir[MAX_PATH];
GetModuleFileName(NULL,dir,sizeof(dir)); // 获取当前模块路径
(_tcsrchr(dir, _T(\)))[1] = 0;//删除文件名,只获得路径字串
strcat(dir,"injectdll.dll"); // dll路径
pid=FindProcess(Target);
//printf("%u ",pid);
//printf("%s ",dir);
if(RemoteLoadLibrary(pid,(LPCSTR)dir))
{
printf("Inject Success! ");
return 1;
}else
{
printf("Inject Failed! ");
return 0;
}
return 1;
}


DWORD FindProcess(LPTSTR lpszProName)
{
BOOL bMore=FALSE; // 返回值
HANDLE hSnap=NULL; // 快照句柄
DWORD dwPID=0; // 进程ID
PROCESSENTRY32 pe32; // 进程信息结构
pe32.dwSize = sizeof(pe32); // 初始化进程结构大小
hSnap =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hSnap == INVALID_HANDLE_VALUE) // Failed
{
return -1;
}
// 遍历进程快照
bMore = Process32First(hSnap, &pe32);
while(bMore)
{
// 比较进程名,不区分大小写
if(lstrcmpi(pe32.szExeFile,lpszProName)==0)
{
dwPID=pe32.th32ProcessID;
break;
}
bMore = Process32Next(hSnap, &pe32);
}
// 释放快照对象
CloseHandle(hSnap);
return dwPID;
}

// 注入dll到指定进程
// 入口参数:DwPID ->进程ID值
// lpszDll->要注入的DLL路径
// 返回值:TRUE->Success FALSE->Failed
BOOL RemoteLoadLibrary(DWORD dwPID,LPCSTR lpszDll)
{
DWORD dwSize,dwWritten;
DWORD dwID=0;
HANDLE hThread=NULL;
LPVOID pFun=NULL;

HANDLE hPro=NULL;
LPVOID lpBuf=NULL;
hPro=OpenProcess(// 打开进程,返回进程句柄
PROCESS_CREATE_THREAD // 防止和CreateRemoteThread冲突
|PROCESS_VM_OPERATION // 允许函数VirtualProtectEx使用此句柄修改进程的虚拟内存.
| PROCESS_VM_WRITE, // 允许函数访问和写入权限
FALSE, // 取消传递性
dwPID // 指定进程ID
);
// 计算要写入大小
dwSize=lstrlenA(lpszDll)+1;
// 在指定进程空间分配虚拟空间
lpBuf=VirtualAllocEx(
hPro, // 申请内存所在的进程句柄
NULL, // 保留页面的内存地址,设置为NULL自动分配
dwSize, // 欲分配的内存大小
MEM_COMMIT, // 为特定的页面区域分配内存中或磁盘的页面文件中的物理存储
PAGE_READWRITE // 可读写该内存区域
);
if(NULL==lpBuf) // Failed
{
CloseHandle(hPro);
return FALSE;
}
// 写入
if(WriteProcessMemory(hPro,lpBuf,(LPVOID)lpszDll,dwSize,&dwWritten))
{
// 判断实际写入大小是否与要写入的大小一致,不想当则写入失败
if(dwWritten!=dwSize)
{
// 释放分配的空间
VirtualFree(hPro,lpBuf,dwSize,MEM_DECOMMIT);
CloseHandle(hPro);
return FALSE;
}
}else // 写入失败
{
CloseHandle(hPro);
return FALSE;
}

pFun=LoadLibraryA;
hThread=CreateRemoteThread(
hPro, // 指定线程入驻的进程句柄,
NULL, // 线程的安全属性
0, // 系统默认大小
(LPTHREAD_START_ROUTINE)pFun, // 调用LoadLibrary加载dll
lpBuf, // 线程函数其实地址
0, // 参数
&dwID // 线程创建标志
);
// 等待FreeLibrary卸载完毕
WaitForSingleObject(hThread,INFINITE );
CloseHandle(hThread); // 关闭线程句柄
CloseHandle(hPro); // 关闭进程句柄
return TRUE;
}

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,