程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 實現dll注入到explorer進程

實現dll注入到explorer進程

編輯:關於C語言

為了完成一個小程序寫的一段代碼,記下,查了不少資料
//
// 實現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;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved