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

//提升本进程权限 BOOL GetPrivilege() { HANDLE tokenHandle; BOOL bRet = OpenProcessToken(GetCurrentProcess...

DLL注入与卸载

DLL注入可用于编写外挂和病毒不易发现。 void CInjectDllToolDlg::StartInject(char *path, int pid) { int pathLen = strle...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

远程加载与卸载DLL

DWORD GetProcessIdByName(LPCTSTR szProcess)//注意要加exe后缀 { DWORD dwRet=0; HANDLE hSnapshot=Create...
  • evi10r
  • evi10r
  • 2011-08-27 17:14
  • 2627

C++ DLL远程注入与卸载函数

代码是别处的 第一个函数是成功的,第二个函数运行发现会将目标程序挂死,也许是目标程序有保护机制 支持Unicode编码。 //--------------------...
  • sky04
  • sky04
  • 2011-11-30 14:52
  • 4347

dll远程注入

DLL注入的一般步骤为: (1)取得注入进程ID dwRemoteProcessId; (2)取得注入DLL的完全路径,并将其转换为宽字符模式pszLibFileName; (3)利...

远程DLl注入

远程注入DLL 一、概述 为了隐藏自身的进程信息,我们希望将进程作为一个合法进程的线程运行。由于系统进程间不允许直接操作资源,因而我们需要在合法进程内部创建一个线程,为其指定要执行的代码。一种简单...

DLL的远程注入及卸载技术详解

DLL的远程注入技术是目前Win32病毒广泛使用的一种技术。使用这种技术的病毒体通常位于一个DLL中,在系统启动的时候,一个EXE程序会将这个DLL加载至某些系统进程(如Explorer.exe)中运...
  • sky04
  • sky04
  • 2011-11-30 13:27
  • 2073

进程保护(二)

上一次做了个双进程保护。后来试着做了DLL远程注入。可以是可以。但是在WIN

DLL远程注入代码

BOOL RtlFileExists(WCHAR* InPath) { HANDLE hFile; if((hFile = CreateFileW(InPath, 0, FILE_SHARE_R...

远线程DLL注入

远线程DLL注入主要通过使用API CreateRemoteThread创建远程线程来实现,CreateRemoteThread与创建线程用的CreateThread非常相似,除了第一个参数hProc...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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