打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
DLL的远程注入技术
  1. // 使目标进程调用GetModuleHandle,获得DLL在目标进程中的句柄  
  2. DWORD dwHandle, dwID;  
  3. LPVOID pFunc = GetModuleHandleA;  
  4. HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)  
  5. pFunc, lpBuf, 0, &dwID );  
  6. // 等待GetModuleHandle运行完毕  
  7. WaitForSingleObject( hThread, INFINITE );  
  8. // 获得GetModuleHandle的返回值  
  9. GetExitCodeThread( hThread, &dwHandle );  
  10. // 释放目标进程中申请的空间  
  11. VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT );  
  12. CloseHandle( hThread );  
  13. // 使目标进程调用FreeLibrary,卸载DLL  
  14. pFunc = FreeLibrary;  
  15. hThread = CreateRemoteThread( hProcess, NULL, 0,  
  16.  (LPTHREAD_START_ROUTINE)pFunc,  
  17.  (LPVOID)dwHandle, 0, &dwID );  
  18. // 等待FreeLibrary卸载完毕  
  19. WaitForSingleObject( hThread, INFINITE );  
  20. CloseHandle( hThread );  
  21. CloseHandle( hProcess );   

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

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

2、法二:采用查杀工具

2、1.安装木马查杀工具。对于多数人而言,要想通过手工查杀DLL木马是不太现实的,因此安装一款可以查杀此类木马的反病毒软件,是非常有必要的。这里还要提醒读者的是,应及时升级病毒数据库,这样才能保证有效地查杀绝大部分木马病毒。当然,我们也可以在计算机中安装那些专门针对木马的查杀工具,例如木马克星。

2、2.查看是否有不明端口开放以及对端口通信进行监控。只要木马进行连接,接受/发送数据则必然会打开端口,DLL木马也不例外,我们可以通过“Netstat-ano”命令来查看TCP/UDP端口的连接,以及开放端口的进程标识符;

也可以直接使用进程端口查看工具Fport.exe来查看与端口对应的进程,以发现是否有不明的连接和端口开放。另外,有些DLL木马通过端口劫持或者端口重用的方法来进行通信,所以仅是查看端口还是不够的,有必要的话,我们可使用嗅探器来了解打开的端口到底在传输些什么数据。

2、3.检查系统目录下是否有可疑的DLL文件。安装好系统和所有应用程序之后,可对系统目录下System32文件夹中的EXE和DLL文件作一记录:在命令提示符下执行“dir*.exe>bak1.txt&dir*.dll>bak2.txt”,将所有的EXE和DLL文件信息导出成TXT文件保存。当日后发现异常时,可以使用相同的命令再次备份,并使用FC命令比较两次的EXE文件和DLL文件。通过这种方法,我们可以发现可疑的EXE和DLL文件,同时通过文件的大小、创建时间来判断是否为DLL木马。

2、4.查看系统进程调用的DLL文件。当我们怀疑有DLL木马插入到系统进程,可以使用一些第三方进程工具来查看进程所调用的DLL文件,然后进一步确认是否中了DLL木马。此类查看工具有进程猎手、进程间谍等等。另外,我们也可以使用XP系统自带的命令行工具TaskList,来显示进程调用的DLL文件,并将这些信息导出成TXT文件保存,以便随时进行比较。


但我们就要利用这种木马 因为他比较难查杀 所以\~~~~~~~~~~~~~~

3、法三:找出寄生的EXE

警报,病毒无法清除

如果系统中被植入了DLL木马,将会出现什么情况呢?

首先,系统被黑客远程控制,出现数据丢失等情况;其次,杀毒软件会报警系统中有病毒,但是却无法进行清除。例如,在电脑中运行了上面制作的上兴远控木马后,笔者电脑上安装的杀毒软件提示发现病毒,但是在删除DLL病毒文件时却失败了。即使我们手工删除病毒文件,也会因为DLL文件正在使用中,所以也无法彻底删除。即使进入安全模式,得到的也是同样的结果。
另外,由于DLL木马是插入到系统进程中的,因此通过任务管理器等进程工具,也无法发现任何木马进程,这给木马的清除带来了很大的困难!
无法删除病毒文件,无法查找到木马进程,那么到底该如何清除DLL注入式木马呢?

无所遁形,揪出木马藏身之所

虽然木马没有自己的进程,但是有一个宿主进程,只要结束宿主进程,停止DLL文件的调用,就可以删除DLL文件,进而清除木马。因此,清除DLL木马的第一步,就是找到木马注入的宿主进程。那么,如何才能找到木马注入的宿主进程呢?且让我们细细看来。

以清除“上兴远控木马”为例,从杀毒软件的报警提示中已经知道木马DLL文件名为“rejoice.dll”。因此,就可以通过一些查看进程调用DLL文件的进程管理工具,找到该文件的宿主进程,此类工具很多,比如大名鼎鼎的ICESword

运行IceSword后,点击左侧边栏“查看→进程”,就可以在其右侧窗口中看到所有进程列表。右键点击某进程,在弹出菜单中选择“模块信息”命令,即可看到该进程调用的所有DLL文件


提示:DLL注入式木马通常是将DLL文件,加载到explorer.exe、svchost.exe、winlogon.exe、iexplore.exe等系统进程中的。因此在查找DLL宿主文件时,可以关闭其它无关的程序,然后依次检查这几个进程中的DLL文件。

不过一个一个的检查系统进程,确实有些麻烦,如何才能快速的定位木马的宿主进程呢?可以使用一款名为“procexp”的进程管理工具。运行procexp后,在程序界面中间显示的是树状进程关系列表,下方是每个进程的详细信息。点击菜单“Find→Find DLL”命令,打开DLL文件查找对话框,在“DLL Substring”中输入要查找的关键词,这里输入刚才杀毒软件扫描出的DLL文件名“rejoice.dll”。然后点击“Search”按钮,在下方的列表中就可以看到该DLL文件是被哪个进程调用的了。


牛刀小试,清除普通进程DLL注入木马

对于大部分DLL注入木马,其注入到“iexplore.exe”和“explorer.exe”这两个进程。对于这类普通进程的DLL木马,清除将是非常方便的。

如果DLL文件是注入到“iexplore.exe”进程中,由于此进程就是IE浏览器进程,因此就需要先关掉所有IE窗口和相关程序,然后直接找到DLL文件进行删除就可以了。

如果DLL文件是注入到“explorer.exe”进程中,那么就略显麻烦一些。由于此进程用于显示桌面和资源管理器,因此,当通过任务管理器结束掉“explorer.exe”进程时,桌面无法看到,桌面上所有图标消失掉,"我的电脑"、"网上邻居"等所有图标都不见了,同时,也无法打开资源管理器找到木马文件进行删除。怎么办呢?

实际上,解决的方法也很简单。在任务管理器中点击菜单“文件→新任务运行”,打开“创建新任务”对话框,点击“浏览”按钮,通过浏览对话框就可以打开DLL文件所在的路径。然后选择“文件类型”为“所有文件”,即可显示并删除DLL文件了。


在浏览对话框中删除DLL文件

除恶务尽,清除特殊DLL注入木马

除了以上所说的注入普通进程的DLL木马之外,还有许多木马注入到系统里关键进程中,比如svchost.exe、smss.exe、winlogon.exe进程。这些进程使用普通方式无法结束,使用特殊工具结束掉进程后,却又很可能造成系统崩溃无法正常运行的情况。对于这些木马,我们可以通过以下两种方法进行清除。

1.使用IceSword卸载DLL文件

IceSword的功能十分强大,我们曾在以前作过介绍,在这里,就可以利用它卸载掉已经插入到正在运行的系统进程中的DLL文件。在IceSword的进程列表显示窗口中,右键点击DLL木马宿主进程,选择弹出命令“模块信息”。在进程模块信息对话框中找到DLL木马文件,选择文件后点击“强制解除”命令,即可将系统进程中的DLL木马文件卸载掉了


卸载系统进程中的DLL木马

4、法四:定时枚举,发现不是本身所用的就强制Free掉

防止DLL注入我用的是另一种方法:

//允许的模块列表
theApp.m_szAuthorizedList = " USER32.DLL RPCRT4.DLL KERNEL32.DLL GDI32.DLL ADVAPI32.DLL NTDLL.DLL MSVCRT.DLL SETUPAPI.DLL CFGMGR32.DLL WINMM.DLL SHELL32.DLL SHLWAPI.DLL MSVCR80.DLL MFC80.DLL OLE32.DLL COMCTL32.DLL OLEACC.DLL OLEAUT32.DLL ATL80.DLL MSVCM80.DLL MFC80CHS.DLL MSVCP80.DLL MFCM80.DLL MFCM80U.DLL MFC80U.DLL VCOMP.DLL SECUR32.DLL MSVCRT.DLL MSVCP60.DLL MFC60.DLL ";

然后定时枚举系统进程,找到自己进程本身并分析所加载的模块,发现不是本身所用的就强制FREE掉:

  1. do  
  2. {  
  3.     if(!IsModuleAuthorized(me32.szModule))  
  4.     {  
  5.         HMODULE hmodule = me32.hModule;  
  6.         CloseHandle(hModuleSnap);    
  7.         FreeLibrary(hmodule);  
  8.         //发现可疑模块并已移除  
  9.         return;  
  10.     }  
  11. }  

 

5、法五: 拦截自身LoadLibraryExW 这个函数吧  

如果仅仅只是防御 远程线程 你可以按下面这样做  :

(1)在程序初始化时把自身程序的所有线程ID 用个ULONG 数组保存起来  
并动态维护这个ULONG数组 这个也是多线程程序所必需的吧 如果是单线程就更方便了
(2)然后 在LoadLibraryExW假函数里做一个判断  
判断当前的操作线程是否为自身程序原有的线程 如果不是 就是远程线程了  

  1. ULONG __stdcall Fake_LoadLibraryExW(LPCWSTR lpwLibFileName,HANDLE hFile,DWORD dwFlags)     
  2. {  
  3.     ULONG TID=GetCurrentThreadId();  
  4.     //把这个TID 循环对比一下 是否存在于自身TID 数组     
  5.   
  6.   
  7.     if (flag)//存在则 通过     
  8.     {  
  9.         return MyReal_LoadLibraryExW(lpwLibFileName,hFile,dwFlags);  
  10.     }  
  11.     else  
  12.     {  
  13.         return FALSE;  
  14.     }  
  15. }  




(4)上面的方法可以防止远程线程 在自身程序加载DLL ,但还有个问题 值得注意
WINDOWS的 SetWindowsHookEx (设GUI全局钩子) 这个函数,因为他是切换到进程上下文 使用程序自身线程来加载DLL的 所以不能用判断TID的方法来判断了  

这里再提供二个思路  

(4、1)一个是 判断当前加载 的DLL 是否有WINDOWS签名 是则放行 否则拦截 (稍微有点费时 但非常安全)

(4、2)在一个是 判断路径 
系统加载DLL时是不会包含DLL路径的直接是类似“kernel32.dll” 这样的  
所以,可以判断当前路径是否包含路径分割符,是则拦截 否则放行 (速度快 安全性较高)


结合上面三种方法 自己写个规则来决定拦截与否吧
比直接定义模块名 兼容性高多了 也方便多了    

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
系统安全至上 剿清删不掉的DLL木马
可恶的木马! 2006-07-28
dll插入型木马病毒的原理,查杀与防范-飞翔软件教程-52z.com
[揭开DLL木马神秘面纱-删除木马
护眼小秘书隐藏后门驱动,强锁主页难以卸载,已感染超3万台电脑
系统安全:要小心防范---木马是这样伪装你知道吗 - 瑞星反病毒资讯网
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服