CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  Windows SDK/API

如何卸载其它进程中加载的指定DLL

楼主lbg(lbg)2006-01-12 13:21:18 在 C++ Builder / Windows SDK/API 提问

比如,有木马插到了explorer里面,我想把他卸载该怎么做? 问题点数:100、回复次数:17Top

1 楼netsys2(来电!)回复于 2006-01-12 13:37:19 得分 0

这里图文并茂:  
   
  http://www.jiangmin.com/news/jiangmin/jmnews/chinajm/2005129101822.htmTop

2 楼constantine(飘遥的安吉儿)回复于 2006-01-12 13:46:31 得分 0

木马专杀软件一般就可以Top

3 楼lbg(lbg)回复于 2006-01-12 14:52:08 得分 0

BCB编程能实现吗?Top

4 楼cczlp(不惑)回复于 2006-01-12 16:28:33 得分 0

dwProcessID   :目标进程  
  szDllName:   目标进程的DLL路径  
   
   
          DWORD   dwHandle;  
          HANDLE   hProcess   =   OpenProcess(         PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,  
                  FALSE,   dwProcessID)   ;  
  if   (!hProcess)  
  {  
                          return   ;  
  }  
   
   
  HANDLE   hThread   =   CreateRemoteThread(   hProcess,   NULL,   0,    
                  (LPTHREAD_START_ROUTINE)GetModuleHandle,  
                  (LPVOID)szDllName,   0,   NULL);  
          if   (hThread   ==   NULL)  
          {  
                  CloseHandle(hProcess);  
                   
                  return   ;  
          }  
           
          //   等待GetModuleHandle运行完毕  
          WaitForSingleObject(   hThread,   INFINITE   );    
           
          //   获得GetModuleHandle的返回值  
          GetExitCodeThread(   hThread,   &dwHandle   );  
   
          CloseHandle(hThread);  
   
          //   使目标进程调用FreeLibrary,卸载DLL  
  hThread   =   CreateRemoteThread(   hProcess,   NULL,   0,   (LPTHREAD_START_ROUTINE)FreeLibrary,  
                  (LPVOID)dwHandle,   0,   NULL);  
   
          //   等待FreeLibrary卸载完毕  
      WaitForSingleObject(hThread,   INFINITE);  
   
      CloseHandle(hThread);  
   
          CloseHandle(hProcess);Top

5 楼cczlp(不惑)回复于 2006-01-12 16:30:30 得分 0

大致过程是这样的,   自己调试吧Top

6 楼ccrun(老妖)(www.ccrun.com)回复于 2006-01-12 16:33:37 得分 0

编程当然可以实现。  
   
  1.   通过枚举模块,先取得该dll的句柄  
  2.   用OpenProcess先打开目标进程  
  3.   用GetProcAddress取得FreeLibrary函数的地址,然后用CreateRemoteThread在目标进程中开辟一个线程,执行这个FreeLibrary(传入的参数就是第一步取得的句柄),等待线程执行完毕就OK了。  
  4.   关闭所有打开的东东。Top

7 楼ccrun(老妖)(www.ccrun.com)回复于 2006-01-12 16:35:00 得分 0

晕。刚写了几句话,就有人贴代码了。Top

8 楼lbg(lbg)回复于 2006-01-13 09:25:26 得分 0

我的改写的代码:  
  void   __fastcall   UNIT_pro::UnLoadDll(String   str_proce,   String   str_dllname)  
  {  
   
          AnsiString   tmpstr="";  
          PROCESSENTRY32   pinfo;  
          pinfo.dwSize   =   sizeof(pinfo);  
          DWORD   dw_pid=0;  
          HANDLE   snapshot   =   CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  
          if(snapshot   ==   NULL)   return;  
          bool   flag   =   Process32First(snapshot,&pinfo);  
          while(flag)  
          {  
   
                tmpstr=AnsiString(pinfo.szExeFile)   ;  
                if((ExtractFileName(tmpstr)).UpperCase()   ==str_proce.UpperCase())  
                  {  
                    dw_pid=pinfo.th32ProcessID   ;  
                    break;  
                  }  
                flag   =   Process32Next(snapshot,&pinfo);  
          }  
        CloseHandle(snapshot);  
        DWORD   dwHandle;  
        HANDLE   hProcess1   =   OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,   dw_pid)   ;  
        if   (!hProcess1)   return   ;  
        HANDLE   hThread   =   CreateRemoteThread(   hProcess1,   NULL,   0,(LPTHREAD_START_ROUTINE)GetModuleHandle,(LPVOID)str_dllname.c_str()   ,   0,   NULL);  
        if   (hThread   ==   NULL)  
          {  
                  CloseHandle(hProcess1);  
                  return   ;  
          }  
          //   等待GetModuleHandle运行完毕  
      WaitForSingleObject(   hThread,   INFINITE   );  
    //   获得GetModuleHandle的返回值  
      GetExitCodeThread(   hThread,   &dwHandle   );  
      CloseHandle(hThread);  
    //   使目标进程调用FreeLibrary,卸载DLL  
      hThread   =CreateRemoteThread(   hProcess1,   NULL,   0,   (LPTHREAD_START_ROUTINE)FreeLibrary,(LPVOID)dwHandle,   0,   NULL);  
      //   等待FreeLibrary卸载完毕  
      WaitForSingleObject(hThread,   INFINITE);  
      CloseHandle(hThread);  
      CloseHandle(hProcess1);  
  }  
   
  调用UnLoadDll("explorer.exe","winlogokey.dll"   );explorer.exe出错,卸载没有成功Top

9 楼CityHost(市长)回复于 2006-01-13 10:02:16 得分 0

又涨了见识了Top

10 楼lbg(lbg)回复于 2006-01-13 10:11:36 得分 0

我的电脑里面explorer.exe被插了两个很奇怪的dll,我怀疑是木马,这两个文件是:  
  winlogokey.dll   和   winlogo_hook.dll,但是在网上搜索不到关于这两个文件的说明,所以想自己卸,   另外,我发现很多进程都被这两个dll给插了,真变态Top

11 楼icwin(www.cat898.com.cn)回复于 2006-01-13 13:01:00 得分 0

upTop

12 楼lbg(lbg)回复于 2006-01-13 14:37:25 得分 0

有人试过吗?Top

13 楼cczlp(不惑)回复于 2006-01-13 16:58:39 得分 100

//那个是随手写的,实际不能直接传文件名,用这个  
  #include   <tlhelp32.h>  
  void   __fastcall   UnLoadDll(String   str_proce,   String   str_dllname)  
  {  
   
          AnsiString   tmpstr="";  
          PROCESSENTRY32   pinfo;  
          pinfo.dwSize   =   sizeof(pinfo);  
          DWORD   dw_pid=0;  
          HANDLE   snapshot   =   CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  
          if(snapshot   ==   NULL)  
                  return;  
          bool   flag   =   Process32First(snapshot,&pinfo);  
          while(flag)  
          {  
   
                  tmpstr=AnsiString(pinfo.szExeFile)   ;  
                  if((ExtractFileName(tmpstr)).UpperCase()==str_proce.UpperCase()   )  
                  {  
                          dw_pid=pinfo.th32ProcessID   ;  
                          break;  
                  }  
                  flag   =   Process32Next(snapshot,&pinfo);  
          }  
          CloseHandle(snapshot);  
   
          if   (dw_pid   ==   NULL)  
          {  
                  ::MessageBox(NULL,   "Process   not   found",   "",   0);  
                  return;  
          }  
   
          DWORD   dwHandle   =   0;  
          HANDLE   hProcess1   =   OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,   dw_pid)   ;  
          if   (!hProcess1)  
                  return   ;  
   
          //   向目标进程地址空间写入DLL名称  
          DWORD   dwSize,   dwWritten;  
          dwSize   =   str_dllname.Length()   +   1;  
          LPVOID   lpBuf   =   VirtualAllocEx(   hProcess1,   NULL,   dwSize,   MEM_COMMIT,   PAGE_READWRITE   );  
   
          if   (   !WriteProcessMemory(   hProcess1,   lpBuf,   (LPVOID)str_dllname.c_str(),   dwSize,   &dwWritten   )   )  
          {  
                  VirtualFreeEx(   hProcess1,   lpBuf,   dwSize,   MEM_DECOMMIT   );  
                  CloseHandle(   hProcess1   );  
                  return;  
          }  
   
          LPVOID   pFun   =     GetProcAddress(GetModuleHandle("Kernel32"),   "GetModuleHandleA");//GetModuleHandleA;  
          HANDLE   hThread   =   CreateRemoteThread(   hProcess1,   NULL,   0,(LPTHREAD_START_ROUTINE)pFun,  
                                                                                    lpBuf   ,   0,   NULL);  
          if   (hThread   ==   NULL)  
          {  
                  CloseHandle(hProcess1);  
                  return   ;  
          }  
          //   等待GetModuleHandle运行完毕  
          WaitForSingleObject(   hThread,   INFINITE   );  
          //   获得GetModuleHandle的返回值  
          GetExitCodeThread(   hThread,   &dwHandle   );  
   
          //   释放目标进程中申请的空间  
          VirtualFreeEx(   hProcess1,   lpBuf,   dwSize,   MEM_DECOMMIT   );  
          CloseHandle(hThread);  
          //   使目标进程调用FreeLibrary,卸载DLL  
          pFun   =     GetProcAddress(GetModuleHandle("Kernel32"),   "FreeLibrary");  
          hThread   =CreateRemoteThread(   hProcess1,   NULL,   0,   (LPTHREAD_START_ROUTINE)pFun,(LPVOID)dwHandle,   0,   NULL);  
          //   等待FreeLibrary卸载完毕  
          WaitForSingleObject(hThread,   INFINITE);  
          CloseHandle(hThread);  
          CloseHandle(hProcess1);  
  }  
  //  
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
  {  
          UnLoadDll("iexplore.exe",   "C:\SOFTFI~1\IS\BhoPlugin.dll");  
  }  
  Top

14 楼alloutoflove(andrew)回复于 2006-01-13 18:00:28 得分 0

学习ing..Top

15 楼lbg(lbg)回复于 2006-01-14 11:44:40 得分 0

cczlp(不惑)   :按照你的代码,还是出错,卸载一些别的DLL,没有出错,但是,看进程的模块的时候,那个DLL还在,不知道什么原因Top

16 楼cczlp(不惑)回复于 2006-01-19 09:24:53 得分 0

代码没用问题,   可能调用的参数错误.  
  我的系统安装了Acrobat   7.0,   卸载它在explorer.exe中的一个DLL:  
  UnLoadDll("explorer.exe",   "PDFShell.dll");  
   
   
  卸载后,如果原来的进程还需要这个DLL,   可能出现问题.  
  Top

17 楼haiqian119(海嵌)回复于 2006-01-19 09:26:16 得分 0

markTop

相关问题

  • win98启动时如何自动加载指定的DLL
  • 请教诸位,加载的DLL如何从内存中卸载掉?(except reboot)
  • 请问大家,这个DLL加载后用什么方式卸载?FreeLibrary行不通
  • 动态加载DLL!!!!!!!!!!!!!!!!!!!
  • 动态加载dll
  • DLL加载错误
  • dll的加载 help
  • 如何加载dll?(隐式加载)
  • System.DllNotFoundException: 无法加载 DLL (oci.dll)。
  • System.DllNotFoundException: 无法加载 DLL (oci.dll)。

关键词

  • vm
  • pinfo
  • hprocess
  • dwhandle
  • snapshot
  • hthread
  • tmpstr
  • dwsize
  • freelibrary
  • dw

得分解答快速导航

  • 帖主:lbg
  • cczlp

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo