主 页  下载中心 文章中心 在线杀毒 软件论坛
国内杀毒软件     瑞星杀毒 金山毒霸 江民杀毒 光华反病毒 更多... 木马专杀   木马杀客 木马克星 木马清道夫 AVG(原Ewido)Anti-Spyware 更多...
国外杀毒软件     卡巴斯基   诺顿   趋势 安博士 熊猫卫士  小红伞 驱逐舰 麦咖啡McAfee   NOD32   F-Secure   Dr.Web   Avast   更多...
升级补丁   瑞星升级 金山毒霸升级 江民升级 光华升级 卡巴斯基升级 诺顿升级 趋势升级 安博士升级 NOD32升级 Dr.Web升级 Avast升级
流氓软件清理     360安全卫士 瑞星卡卡   金山毒霸系统清理专家 Wopti流氓软件清除大师   恶意软件清理助手   超级兔子网络卫士 更多...
防火墙     天网 费尔 冰盾 更多... 病毒专题     熊猫烧香病毒专题 电眼间谍病毒专题 AV终结者病毒专题 灰鸽子清理     更多...
系统漏洞补丁     windowXP系统漏洞补丁 window2000系统漏洞补丁 window2003系统漏洞补丁 windowVISTA系统漏洞补丁 更多...
 您当前的位置:爱客者 -> 文章中心 -> 安全技术 -> 杀毒技术 -> 文章内容
揭开病毒的奥秘 dll的远程注入技术详解
来源:网络 时间:2006-5-31
dll的远程注入技术是目前win32病毒广泛使用的一种技术。使用这种技术的病毒体通常位于一个dll中,
在系统启动的时候,一个exe程序会将这个dll加载至某些系统进程(如explorer.exe)中运行。
这样一来,普通的进程管理器就很难发现这种病毒了,而且即使发现了也很难清除,
因为只要病毒寄生的进程不终止运行,那么这个dll就不会在内存中卸载,
用户也就无法在资源管理器中删除这个dll文件,真可谓一箭双雕哉。
记得2003年qq尾巴病毒肆虐的时候,就已经有些尾巴病毒的变种在使用这种技术了。
到了2004年初,我曾经尝试着仿真了一个qq尾巴病毒,但独是跳过了dll的远程加载技术。
直到最近在学校论坛上看到了几位朋友在探讨这一技术,便忍不住将这一尘封已久的技术从
我的记忆中拣了出来,以满足广大的技术爱好者们。
必备知识
  在阅读本文之前,你需要了解以下几个api函数:

  ·openprocess - 用于打开要寄生的目标进程。

  ·virtualallocex/virtualfreeex - 用于在目标进程中分配/释放内存空间。

  ·writeprocessmemory - 用于在目标进程中写入要加载的dll名称。

  ·createremotethread - 远程加载dll的核心内容,用于控制目标进程调用api函数。

  ·loadlibrary - 目标进程通过调用此函数来加载病毒dll。

  在此我只给出了简要的函数说明,关于函数的详细功能和介绍请参阅msdn。

  示例程序

  我将在以下的篇幅中用一个简单的示例virus.exe来实现这一技术。这个示例的界面如下图:

首先运行target.exe,这个文件是一个用win32 application向导生成的“hello, world”程序,
用来作为寄生的目标进程。

  然后在界面的编辑控件中输入进程的名称“target.exe”,单击“注入dll”按钮,
这时候virus.exe就会将当前目录下的dll.dll注入至target.exe进程中。

  在注入dll.dll之后,你也可以单击“卸载dll”来将已经注入的dll卸载。

  模拟的病毒体dll.dll

  这是一个简单的win32 dll程序,它仅由一个入口函数dllmain组成:

bool winapi dllmain( hinstance hinstdll, dword fdwreason, lpvoid lpvreserved )
{
 switch ( fdwreason )
 {
  case dll_process_attach:
  {
   messagebox( null, _t("dll已进入目标进程。"), _t("信息"), mb_iconinformation );
  }
  break;
  case dll_process_detach:
  {
   messagebox( null, _t("dll已从目标进程卸载。"), _t("信息"), mb_iconinformation );
  }
  break;
 }
 return true;
}

  如你所见,这里我在dll被加载和卸载的时候调用了messagebox,这是用来显示我的远程注入/
卸载工作是否成功完成。而对于一个真正的病毒体来说,
它往往就是处理dll_process_attach事件,
在其中加入了启动病毒代码的部分:

case dll_process_attach:
{
 startvirus();
}
break;
注入!

  现在要开始我们的注入工作了。首先,我们需要找到目标进程:

dword findtarget( lpctstr lpszprocess )
{
 dword dwret = 0;
 handle hsnapshot = createtoolhelp32snapshot( th32cs_snapprocess, 0 );
 processentry32 pe32;
 pe32.dwsize = sizeof( processentry32 );
 process32first( hsnapshot, &pe32 );
 do
 {
  if ( lstrcmpi( pe32.szexefile, lpszprocess ) == 0 )
  {
   dwret = pe32.th32processid;
   break;
  }
 } while ( process32next( hsnapshot, &pe32 ) );
 closehandle( hsnapshot );
 return dwret;
}

  这里我使用了tool help函数库,当然如果你是nt系统的话,也可以选择psapi函数库。
这段代码的目的就是通过给定的进程名称来在当前系统中查找相应的进程,并返回该进程的id。得到进程id后,
就可以调用openprocess来打开目标进程了:

// 打开目标进程
handle hprocess = openprocess( process_create_thread | process_vm_operation |


process_vm_write, false, dwprocessid );

  现在有必要说一下openprocess第一个参数所指定的三种权限。在win32系统下,
每个进程都拥有自己的4g虚拟地址空间,各个进程之间都相互独立。如果一个进程需要完成跨进程的工作的话,
那么它必须拥有目标进程的相应操作权限。在这里,process_create_thread表示我可以通过返回的进程
句柄在该进程中创建新的线程,也就是调用createremotethread的权限;同理,process_vm_operation
则表示在该进程中分配/释放内存的权限,也就是调用virtualallocex/virtualfreeex的权限;
process_vm_write表示可以向该进程的地址空间写入数据,也就是调用writeprocessmemory的权限。

  至此目标进程已经打开,那么我们该如何来将dll注入其中呢?在这之前,我请你看一行代码,
是如何在本进程内显式加载dll的:

hmodule hdll = loadlibrary( "dll.dll" );

  那么,如果能控制目标进程调用loadlibrary,不就可以完成dll的远程注入了么?的确是这样,
我们可以通过createremotethread将loadlibrary作为目标进程的一个线程来启动,这样就可以完成
“控制目标进程调用loadlibrary”的工作了。到这里,也许你会想当然地写下类似这样的代码:

dword dwid;
lpvoid pfunc = loadlibrarya;
handle hthread = createremotethread( hprocess, null, 0,
(lpthread_start_routine)pfunc,
(lpvoid)"dll.dll", 0, &dwid );

  不过结果肯定会让你大失所望——注入dll失败!

  那么现在让我们来分析一下失败的原因吧。我是前说过,在win32系统下,
每个进程都拥有自己的4g虚拟地址空间,
各个进程之间都是相互独立的。在这里,我们当作参数传入的字符串"dll.dll"其实是一个数值,
它表示这个字符串位于virus.exe地址空间之中的地址,而这个地址在传给target.exe之后,
它指向的东西就失去了有效性。举个例子来说,譬如a、b两栋大楼,我住在a楼的401;
那么b楼的401住的是谁我当然不能确定——也就是401这个门牌号在b楼失去了有效性,而且如果我想要入住b楼的话,
我就必须请b楼的楼长为我在b楼中安排新的住处(当然这个新的住处是否401也就不一定了)。

  由此看来,我就需要做这么一系列略显繁杂的手续——首先在target.exe目标进程中分配一段内存空间,
然后向这段空间写入我要加载的dll名称,最后再调用createremotethread。这段代码就成了这样:

// 向目标进程地址空间写入dll名称
dword dwsize, dwwritten;
dwsize = lstrlena( lpszdll ) + 1;
lpvoid lpbuf = virtualallocex( hprocess, null, dwsize, mem_commit, page_readwrite );
if ( null == lpbuf )
{
 closehandle( hprocess );
 // 失败处理
}
if ( writeprocessmemory( hprocess, lpbuf, (lpvoid)lpszdll, dwsize, &dwwritten ) )
{
 // 要写入字节数与实际写入字节数不相等,仍属失败
 if ( dwwritten != dwsize )
 {
  virtualfreeex( hprocess, lpbuf, dwsize, mem_decommit );
  closehandle( hprocess );
  // 失败处理
 }
}
else
{
 closehandle( hprocess );
 // 失败处理
}
// 使目标进程调用loadlibrary,加载dll
dword dwid;
lpvoid pfunc = loadlibrarya;
handle hthread = createremotethread( hprocess, null, 0,
(lpthread_start_routine)pfunc, lpbuf, 0, &dwid );

  需要说的有两点,一是由于我要在目标进程中为ansi字符串来分配内存空间,
所以这里凡是和目标进程相关的部分,都明确使用了后缀为“a”的api函数——
当然,如果要使用unicode字符串的话,可以换作后缀是“w”的api;
第二,在这里loadlibrary的指针我是取的本进程的loadlibrarya的地址,这是因为loadlibrarya/loadlibraryw位于kernel32.dll之中,


而win32下每个应用程序都会把kernel32.dll加载到进程地址空间中一个固定的地址,所以这里的函数地址在target.exe中也是有效的。
在调用loadlibrary完毕之后,我们就可以做收尾工作了:

// 等待loadlibrary加载完毕
waitforsingleobject( hthread, infinite );
// 释放目标进程中申请的空间
virtualfreeex( hprocess, lpbuf, dwsize, mem_decommit );
closehandle( hthread );
closehandle( hprocess );

  在此解释一下waitforsingleobject一句。由于我们是通过createremotethread在目标进程中另外开辟了
一个loadlibrary的线程,所以我们必须等待这个线程运行完毕才能够释放那段先前申请的内存。

  好了,现在你可以尝试着整理这些代码并编译运行。运行target.exe,
然后开启一个有模块查看功能的进程查看工具(在这里我使用我的july)来查看target.exe的模块,
你会发现在注入dll之前,target.exe中并没有dll.dll的存在:


  在调用了注入代码之后,dll.dll就位于target.exe的模块列表之中了:




  矛盾相生

  记得2004年初我将qq尾巴病毒成功仿真后,有很多网友询问我如何才能杀毒,
不过我都没有回答——因为当时我研究的重点并非病毒的寄生特性。
这一寄生特性直到今天可以说我才仿真完毕,
那么,我就将解毒的方法也一并公开吧。

  和dll的注入过程类似,只不过在这里使用了两个api:getmodulehandle和freelibrary。
出于篇幅考虑,我略去了与注入部分相似或相同的代码:

// 使目标进程调用getmodulehandle,获得dll在目标进程中的句柄
dword dwhandle, dwid;
lpvoid pfunc = getmodulehandlea;
handle hthread = createremotethread( hprocess, null, 0, (lpthread_start_routine)
pfunc, lpbuf, 0, &dwid );
// 等待getmodulehandle运行完毕
waitforsingleobject( hthread, infinite );
// 获得getmodulehandle的返回值
getexitcodethread( hthread, &dwhandle );
// 释放目标进程中申请的空间
virtualfreeex( hprocess, lpbuf, dwsize, mem_decommit );
closehandle( hthread );
// 使目标进程调用freelibrary,卸载dll
pfunc = freelibrary;
hthread = createremotethread( hprocess, null, 0,
(lpthread_start_routine)pfunc,
(lpvoid)dwhandle, 0, &dwid );
// 等待freelibrary卸载完毕
waitforsingleobject( hthread, infinite );
closehandle( hthread );
closehandle( hprocess );

  用这个方法可以卸载一个进程中的dll模块,当然包括那些非病毒体的dll。
所以,这段代码还是谨慎使用为好。

  在完成卸载之后,如果没有别的程序加载这个dll,你就可以将它删除了。

相关新闻
学习从系统中删除病毒2007/6/28
吃透木马运行原理把它扼杀2007/6/28
McAfee杀毒软件高级设置技巧五招2007/6/28
隐藏文件看不到?中毒了!2007/6/25
360安全卫士推出集三重防护理念2007/6/25
 
    其它相关新闻
·学习从系统中删除病毒
·吃透木马运行原理把它扼杀
·McAfee杀毒软件高级设置技巧五招
·隐藏文件看不到?中毒了!
·360安全卫士推出集三重防护理念
·使用杀毒软件应该注意什么
·CA发布声明:我的杀毒软件漏洞很大
    最新新闻
·磁碟机病毒的十大罪行
·病毒预警:光华反病毒资讯(7月16日-7月22日)
·病毒预警:光华反病毒资讯(7月9日-7月15日)
·用Regsvr32命令解决系统疑难杂症
·Windows的DLL文件原理与修改方法
·如何隐藏硬盘分区
·攻防全面分析 常用九种攻击方法
·卡巴再次误报 将注册表判为木马
·英特尔酷睿2存在安全缺陷
    相关软件下载
·AVG(原Ewido)Anti-Spyware最新完整病毒库更新(2008.06.02)-Anti-Spyware升级包
·AVG(原Ewido)Anti-Spyware每日增量病毒库更新(2008.06.02)-Anti-Spyware升级包
·Kaspersky Anti-Virus7.0.0.125增量包(2008.05.31)-卡巴斯基升级包
·Kaspersky Internet Security7.0.0.125完整升级包(2008.06.01)-卡巴斯基升级包
·熊猫卫士06月01号最新病毒升级包通用版-熊猫卫士升级包
·Avast杀毒软件病毒库升级包(2008-06-01)for avast! 4.0 VPS更新-Avast升级包
·Avast杀毒软件病毒库升级包(2008-06-01)for avast! 4.x VPS更新-Avast升级包
·小红伞AntiVir最新病毒库(2008.06.01) for WindowsNT/2000/XP-小红伞升级包
·McAfee VirusScan DAT 5306病毒库-麦咖啡升级包
·更多相关杀毒软件
  [本站导航]  
瑞星  瑞星杀毒软件瑞星升级包 瑞星杀毒瑞星2007 瑞星在线杀毒瑞星杀毒软件下载瑞星升级
卡巴斯基  卡巴斯基下载卡巴斯基6.0卡巴斯基杀毒软件卡巴斯基7.0卡巴斯基病毒库卡巴斯基升级包
江民  江民杀毒软件江民杀毒江民2007江民杀毒软件下载江民升级包江民升级江民离线升级包
金山毒霸  金山毒霸2007下载金山毒霸下载金山毒霸2007升级包金山毒霸升级金山毒霸杀毒软件
诺顿  诺顿杀毒软件诺顿杀毒诺顿病毒库诺顿企业版诺顿升级包诺顿升级诺顿下载
小红伞AntiVir  德国小红伞小红伞下载小红伞中文小红伞杀毒软件小红伞汉化Avira AntiVir
麦咖啡McAfee  麦咖啡杀毒软件麦咖啡升级包麦咖啡8.0麦咖啡企业版麦咖啡8.5mcafee virusscan
NOD32  nod32升级nod32升级服务器nod32下载nod32 2.7nod32升级idnod32更新nod32升级包
F-Secure  F-secure杀毒软件f-secure anti-virusF-secure汉化版F-secure注册机F-secure2007
Dr.Web  dr.web keydr.web cureitdr.web注册码dr.web汉化dr.web病毒库大蜘蛛大蜘蛛杀毒软件
Avast  avast注册码 序列号avast antivirusavast杀毒软件avast中文版avast 升级avast升级包
木马专杀  木马杀客木马克星AVG Ewido Anti-SpywareAVG Ewido Anti-Spyware升级包 更新
防火墙  瑞星防火墙天网防火墙arp防火墙瑞星个人防火墙江民防火墙防火墙下载风云防火墙
流氓软件清理  瑞星卡卡360安全卫士Wopti流氓软件清除大师奇虎360安全卫士360安全卫士绿色版
推荐软件  Firefox火狐浏览器浏览器Picasa照片处理软件非主流图片制作软件非主流照片制作
关于本站 - 广告合作 - 联系我们 - 下载声明 - 网站地图 - RSS2.0 - 合作伙伴:爱客宝
Copyright©1998 - 2007 爱客者 All Rights Reserved

粤ICP备07006801号