DLL远程注入与卸载

原创 2007年09月16日 09:33:00

以下提供两个函数,分别用于向其它进程注入和卸载指定DLL模块。
支持Unicode编码。

  

#include <windows.h>
#include <tchar.h>
#include <tlhelp32.h>


/************************************************************************************************************
 * 函 数 名:InjectDll

 * 参    数:[in] const TCHAR* pszDllFile // Dll 文件名及路径
    [in] DWORD dwProcessId   // 目标进程 ID

 * 返 回 值:bool - 注入成功返回 true,注入失败则返回 false

 * 实现功能:向目标进程中注入一个指定 Dll 模块文件。
************************************************************************************************************/
bool InjectDll(const TCHAR* pszDllFile, DWORD dwProcessId)
{
 // 参数无效
 if (NULL == pszDllFile || 0 == ::_tcslen(pszDllFile))
 {
  return false;
 }

 // 指定 Dll 文件不存在
 if (-1 == _taccess(pszDllFile, 0))
 {
  return false;
 }

 HANDLE hProcess  = NULL;
 HANDLE hThread   = NULL;
 DWORD dwSize   = 0;
 TCHAR* pszRemoteBuf = NULL;
 LPTHREAD_START_ROUTINE lpThreadFun = NULL;

 // 获取目标进程句柄
 hProcess = ::OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, dwProcessId);
 if (NULL == hProcess)
 {
  return false;
 }

 // 在目标进程中分配内存空间
 dwSize = (DWORD)::_tcslen(pszDllFile) + 1;
 pszRemoteBuf = (TCHAR*)::VirtualAllocEx(hProcess, NULL, dwSize * sizeof(TCHAR), MEM_COMMIT, PAGE_READWRITE);
 if (NULL == pszRemoteBuf)
 {
  ::CloseHandle(hProcess);
  return false;
 }

 // 在目标进程的内存空间中写入所需参数(模块名)
 if (FALSE == ::WriteProcessMemory(hProcess, pszRemoteBuf, (LPVOID)pszDllFile, dwSize * sizeof(TCHAR), NULL))
 {
  ::VirtualFreeEx(hProcess, pszRemoteBuf, dwSize, MEM_DECOMMIT);
  ::CloseHandle(hProcess);
  return false;
 }

 // 从 Kernel32.dll 中获取 LoadLibrary 函数地址
#ifdef _UNICODE
 lpThreadFun = (PTHREAD_START_ROUTINE)::GetProcAddress(::GetModuleHandle(_T("Kernel32")), "LoadLibraryW");
#else
 lpThreadFun = (PTHREAD_START_ROUTINE)::GetProcAddress(::GetModuleHandle(_T("Kernel32")), "LoadLibraryA");
#endif
 if (NULL == lpThreadFun)
 {
  ::VirtualFreeEx(hProcess, pszRemoteBuf, dwSize, MEM_DECOMMIT);
  ::CloseHandle(hProcess);
  return false;
 }

 // 创建远程线程调用 LoadLibrary
 hThread = ::CreateRemoteThread(hProcess, NULL, 0, lpThreadFun, pszRemoteBuf, 0, NULL);
 if (NULL == hThread)
 {
  ::VirtualFreeEx(hProcess, pszRemoteBuf, dwSize, MEM_DECOMMIT);
  ::CloseHandle(hProcess);
  return false;
 }

 // 等待远程线程结束
 ::WaitForSingleObject(hThread, INFINITE);

 // 清理
 ::VirtualFreeEx(hProcess, pszRemoteBuf, dwSize, MEM_DECOMMIT);
 ::CloseHandle(hThread);
 ::CloseHandle(hProcess);

 return true;
}


/************************************************************************************************************
 * 函 数 名:UnInjectDll

 * 参    数:[in] const TCHAR* pszDllFile // Dll 文件名及路径
    [in] DWORD dwProcessId   // 目标进程 ID

 * 返 回 值:bool - 卸载成功返回 true,卸载失败则返回 false

 * 实现功能:从目标进程中卸载一个指定 Dll 模块文件。
************************************************************************************************************/
bool UnInjectDll(const TCHAR* pszDllFile, DWORD dwProcessId)
{
 // 参数无效
 if (NULL == pszDllFile || 0 == ::_tcslen(pszDllFile))
 {
  return false;
 }

 HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
 HANDLE hProcess = NULL;
 HANDLE hThread  = NULL;

 // 获取模块快照
 hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
 if (INVALID_HANDLE_VALUE == hModuleSnap)
 {
  return false;
 }

 MODULEENTRY32 me32;
 memset(&me32, 0, sizeof(MODULEENTRY32));
 me32.dwSize = sizeof(MODULEENTRY32);

 // 开始遍历
 if(FALSE == ::Module32First(hModuleSnap, &me32))
 {
  ::CloseHandle(hModuleSnap);
  return false;
 }

 // 遍历查找指定模块
 bool isFound = false;
 do
 {
  isFound = (0 == ::_tcsicmp(me32.szModule, pszDllFile) || 0 == ::_tcsicmp(me32.szExePath, pszDllFile));
  if (isFound) // 找到指定模块
  {
   break;
  }
 } while (TRUE == ::Module32Next(hModuleSnap, &me32));

 ::CloseHandle(hModuleSnap);

 if (false == isFound)
 {
  return false;
 }

 // 获取目标进程句柄
 hProcess = ::OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION, FALSE, dwProcessId);
 if (NULL == hProcess)
 {
  return false;
 }

 // 从 Kernel32.dll 中获取 FreeLibrary 函数地址
 LPTHREAD_START_ROUTINE lpThreadFun = (PTHREAD_START_ROUTINE)::GetProcAddress(::GetModuleHandle(_T("Kernel32")), "FreeLibrary");
 if (NULL == lpThreadFun)
 {
  ::CloseHandle(hProcess);
  return false;
 }

 // 创建远程线程调用 FreeLibrary
 hThread = ::CreateRemoteThread(hProcess, NULL, 0, lpThreadFun, me32.modBaseAddr /* 模块地址 */, 0, NULL);
 if (NULL == hThread)
 {
  ::CloseHandle(hProcess);
  return false;
 }

 // 等待远程线程结束
 ::WaitForSingleObject(hThread, INFINITE);

 // 清理
 ::CloseHandle(hThread);
 ::CloseHandle(hProcess);

 return true;
}
 

远程DLL注入、卸载

Dll注入//dwPid 为目标进程PID //szDllName 为要注入的DLL文件 void CDllManageDlg::InjectDll(DWORD dwPid, CString szDl...
  • u012319493
  • u012319493
  • 2016年01月04日 16:15
  • 646

远程线程注入和卸载DLL

########################################################################/* * 在远程进程中搜索模块句柄 */ HMODULE...
  • wuzh1230
  • wuzh1230
  • 2009年09月27日 15:55
  • 1462

远程注入与卸载DLL

//提升本进程权限 BOOL GetPrivilege() { HANDLE tokenHandle; BOOL bRet = OpenProcessToken(GetCurrentProcess...
  • u010497228
  • u010497228
  • 2015年02月18日 19:39
  • 303

DLL远程注入与卸载(C++)

以下提供两个函数,分别用于向其它进程注入和卸载指定DLL模块。支持Unicode编码。 //-----------------------------------------------------...
  • JPEXE
  • JPEXE
  • 2007年09月16日 01:17
  • 3536

将DLL挂接到远程进程之中(远程注入)

在上一篇文章《线程的远程注入》中介绍了如何让其他的进程中执行自己的代码的一种方法 及自己定义一个线程,在线程体中编写执行代码,然后使用VirtualAllocEx函数为线程体以 及线程中用到的字符常量...
  • vcforever
  • vcforever
  • 2005年03月15日 16:42
  • 7407

C++远程DLL注入

这是个很古老的DLL注入技术,采用的是创建远程线程的方式。将LdadLibraryA的函数地址当做线程的回调地址,线程参数采用待注入DLL的绝对路径值。这个参数我们得采用VirtualAllocEx和...
  • fzuim
  • fzuim
  • 2017年06月28日 16:53
  • 344

一个完整的DLL远程注入函数

函数名称: CreateRemoteDll()返加类型:BOOL接受参数: DLL路径,注入进程ID 其完整代码如下: BOOL CreateRemoteDll(const char *DllFull...
  • chinafe
  • chinafe
  • 2007年07月11日 14:53
  • 2304

VB 远程注入卸载DLL

Option ExplicitPrivate Const PROCESS_CREATE_THREAD = &H2Private Const PROCESS_QUERY_INFORMATION = &H...
  • chenhui530
  • chenhui530
  • 2007年10月01日 12:32
  • 2196

C++:远程注入DLL

远程注入Dll:Exe部分:CString GetCurrWorkingDir(){//获取当前目录 CString strPath; GetCurrentDirectory(MAX_PATH,str...
  • suacker
  • suacker
  • 2007年11月30日 15:04
  • 3181

[C++] - DLL远程注入实例

[C++] - DLL远程注入实例 来源:http://blog.csdn.net/syf442/archive/2009/07/04/4318899.aspx   一般情况下,每个...
  • flyingleo1981
  • flyingleo1981
  • 2016年10月09日 17:26
  • 338
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DLL远程注入与卸载
举报原因:
原因补充:

(最多只允许输入30个字)