DLL Inject Porcess Code

实现dll注入到explorer进程

#include <windows.h>
#include <tlhelp32.h>  // 声明快照函数的头文件
#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\n",pid);
  //printf("%s\n",dir);
  if(RemoteLoadLibrary(pid,(LPCSTR)dir))
  {
    printf("Inject Success!\n");
    return 1;
  }else
  {
    printf("Inject Failed!\n");
    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,&dwWr

itten))
{
// 判断实际写入大小是否与要写入的大小一致,不想当则写入失败
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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值