远程注入

转载 2006年05月25日 16:32:00
DLL木马的最高境界是动态嵌入技术,动态嵌入技术指的是将自己的代码嵌入正在运行的进程中的技术。理论上来说,在Windows中的每个进程都有自己的私有内存空间,别的进程是不允许对这个私有空间进行操作的(私人领地、请勿入内),但是实际上,我们仍然可以利用种种方法进入并操作进程的私有内存。在多种动态嵌入技术中(窗口Hook、挂接API、远程线程),我最喜欢的是远程线程技术,这种技术非常简单,只要有基本的进线程和动态链接库的知识就可以很轻松地完成嵌入,下面就为大家介绍一下远程线程技术。

远程线程技术


  远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。但是很少有人知道,通过CreateRemoteThread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程耶!)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。例如在远程进程内部启动一个DLL木马(与进入进程内部相比,启动一个DLL木马是小意思,实际上我们可以随意篡改那个远程进程的数据)。

  首先,我们通过OpenProcess 来打开我们试图嵌入的进程(如果远程进程不允许打开,那么嵌入就无法进行了,这往往是由于权限不足引起的,解决方法是通过种种途径提升本地进程的权限)

 hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | file://允许远程创建线程
                PROCESS_VM_OPERATION | file://允许远程VM操作
                PROCESS_VM_WRITE,//允许远程VM写
                FALSE, dwRemoteProcessId )

  由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。

  然后,我们可以建立LoadLibraryW函数这个线程来启动我们的DLL木马,LoadLibraryW函数是在kernel32.dll中定义的,用来加载DLL文件,它只有一个参数,就是DLL文件的绝对路径名pszLibFileName,(也就是木马DLL的全路径文件名),但是由于木马DLL是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址空间:(否则远程线程是无法读到这个参数的)

 file://计算DLL路径名需要的内存空间
 int cb = (1 + lstrlenW(pszLibFileName)) * sizeof(WCHAR);
 file://使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区
 pszLibFileRemote = (PWSTR) VirtualAllocEx( hRemoteProcess, NULL, cb,
            MEM_COMMIT, PAGE_READWRITE);
 file://使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间
 iReturnCode = WriteProcessMemory(hRemoteProcess,
            pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL);
 file://计算LoadLibraryW的入口地址
 PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)
     GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");

  OK,万事俱备,我们通过建立远程线程时的地址pfnStartAddr(实际上就是LoadLibraryW的入口地址)和传递的参数pszLibFileRemote(实际上是我们复制过去的木马DLL的全路径文件名)在远程进程内启动我们的木马DLL:

 file://启动远程线程LoadLibraryW,通过远程线程调用用户的DLL文件
 hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0,
                 pfnStartAddr, pszLibFileRemote, 0, NULL);

  至此,远程嵌入顺利完成,为了试验我们的DLL是不是已经正常的在远程线程运行,我编写了以下的测试DLL:

 BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved)
   {
    char szProcessId[64] ;
    switch ( reason )
     {
      case DLL_PROCESS_ATTACH:
       {
         file://获取当前进程ID
         _itoa ( GetCurrentProcessId(), szProcessId, 10 );
         MessageBox ( NULL, szProcessId, "RemoteDLL", MB_OK );
       }
      default:
      return TRUE;
     }
   }

  当我使用RmtDll.exe程序将这个TestDLL.dll嵌入Explorer.exe进程后(PID=1208),该测试DLL弹出了1208字样的确认框,同时使用PS工具也能看到

   Process ID: 1208
   C:/WINNT/Explorer.exe (0x00400000)
   ……
   C:/TestDLL.dll (0x100000000)
   ……

  这证明TestDLL.dll已经在Explorer.exe进程内正确地运行了。

C++:远程注入DLL

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

远程注入小记

原作者连接提权方法//注入程序 #include "stdafx.h" #include "Remote injection.h" #include "tlhelp32.h" using namesp...
  • osummertime
  • osummertime
  • 2016年09月26日 19:35
  • 597

在Delphi中利用CreateRemoteThread远程注入例子

花了一个下午翻了MSDN,写了这个例子,为了安全,我用Delphi建了个什么也没有作的程序prjzzhost.exe,将它用作被注入的宿主进程.写了一个TestDll.Dll,里面只有一个Log函数,...
  • yanxizhen
  • yanxizhen
  • 2005年04月05日 16:34
  • 1384

VC++远程注入动态库的实现(6-6)

通过Module32First()和Module32Next()函数遍历“快照”中的所有模块。这两个函数的使用方法与“3.2.2 遍历进程并显示”中介绍的Process32First()与Proces...
  • hou09tian
  • hou09tian
  • 2017年08月10日 12:10
  • 239

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

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

C++远程DLL注入

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

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

[C++] - DLL远程注入实例 来源:http://blog.csdn.net/syf442/archive/2009/07/04/4318899.aspx   一般情况下,每个...
  • flyingleo1981
  • flyingleo1981
  • 2016年10月09日 17:26
  • 340

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

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

远程注入

 简介:注入代码到远程线程,在目标进程创建一个线程,执行期望的代码。 项目需求:创建远程线程,并可以实现远程注入DLL. 项目分析:使用CreateRemoteProcess在目标进程创建一个远程线程...
  • boyplayee
  • boyplayee
  • 2007年03月05日 13:12
  • 1035

远程DLL注入、卸载

Dll注入//dwPid 为目标进程PID //szDllName 为要注入的DLL文件 void CDllManageDlg::InjectDll(DWORD dwPid, CString szDl...
  • u012319493
  • u012319493
  • 2016年01月04日 16:15
  • 657
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:远程注入
举报原因:
原因补充:

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