首页
社区
课程
招聘
如何删除正在运行的dll文件?
发表于: 2005-3-1 09:46 20353

如何删除正在运行的dll文件?

2005-3-1 09:46
20353
关于结束正在运行的exe文件,只需先中止该进程,然后删除它就行了,但是对于一个dll文件,该怎么办呢,如何停止它的运行?
比如QQ有个dll文件QQHook.dll会加载到许多进程中,我要在它运行的过程中就将其删除,试了远程线程的方法插入到主进程中,通过调用FreeLibrary释放这个库文件,发现这个方法不能成功。各位大虾有何高见?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 215
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
试一吓这个KillBox v2.0.0.175 汉化版

软件简介:  
 国外反病毒论坛很受欢迎的工具软件,与 HijackThis 是最佳配合,
实质是一个删除任意文件的利器,它不管这个文件是EXE还是DLL等其它文件,
也不管这个文件是正在运行中,还是被系统调用了,KillBox 都可以简单几步就将文件删除.
2005-3-1 10:00
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
3
多 Ctrl  + Alt + Del 几次,调出系统任务界面。然后再删一下看看。
2005-3-1 11:05
0
雪    币: 233
活跃值: (43)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
感谢大家的帮忙,我试了2楼提供的工具,并没有传说中的那么厉害,根本无法删除这个dll文件,我是想通过编程的方法来解决这个问题,提供思路即可
2005-3-1 11:11
0
雪    币: 214
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
真的要编成?写个驱动,对应文件系统驱动,找到文件名,绕过操作系统直接读写硬盘,直接在fat或者ntfs里面搞定他,谁都挡不了
2005-3-1 11:59
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
6
去编程板块。前段时间有朋友发了这方面代码
2005-3-1 13:09
0
雪    币: 427
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我也有这个代码,不过不记得了,也有个命令行工具,也不记得丢哪了,很少用。
2005-3-1 14:32
0
雪    币: 202
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
最初由 鸡蛋壳 发布
我也有这个代码,不过不记得了,也有个命令行工具,也不记得丢哪了,很少用。


次次来到都是潜水,也多次看到鸡蛋所发的贴子,这次实在忍不了。。。。
2005-3-1 15:42
0
雪    币: 233
活跃值: (43)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
nbw知道在哪啊,怎么我找了半天都找不到,你告诉我链接好吗?
2005-3-1 18:15
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
10
http://bbs.pediy.com/showthread.php?s=&threadid=10850

你看这个合意不。
2005-3-1 19:42
0
雪    币: 1241
活跃值: (160)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
FreeLibrary只是减少了引用计数,并不会直接释放DLL。我想必须系统中的所有进程对该DLL调用的引用计数都为零时,才能合法删除DLL吧。从内核入手可能也是这样。
2005-3-1 21:01
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
12
最初由 ljtt 发布
FreeLibrary只是减少了引用计数,并不会直接释放DLL。我想必须系统中的所有进程对该DLL调用的引用计数都为零时,才能合法删除DLL吧。从内核入手可能也是这样。


既然是减少计数,那么如果我们强行 Free 100次,让计数为0,那是不是可以删除呢?
2005-3-1 22:46
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
13
最初由 nbw 发布



既然是减少计数,那么如果我们强行 Free 100次,让计数为0,那是不是可以删除呢?


这个也许可行,没试过
2005-3-2 15:50
0
雪    币: 239
活跃值: (478)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
最初由 nbw 发布



既然是减少计数,那么如果我们强行 Free 100次,让计数为0,那是不是可以删除呢?


牛人呀,这也想的出来,PFPF!
2005-3-2 15:54
0
雪    币: 233
活跃值: (43)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
看到各位高人都来捧场,我今天终于把这个程序给做出来了,就是用的远程线程的技术,上次没有成功居然是一个非常小的错误 现将源代码上传,欢迎大家参考。
居然没有权限上传!
只好贴源代码了,有谁要工具的话直接给我来信marxixing@tom.com
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include "resource.h"

//  Forward declarations:
BOOL GetProcessList( );
BOOL ListProcessModules( DWORD dwPID, HANDLE hProc);
void EnableDebugPriv(void);
bool Remote(HANDLE hProc, HMODULE hModule);

BOOL SignFindVirus=false;   //发现病毒标志
char Virus[128];
char Virname[MAX_PATH];

typedef struct _RemotePara
{
   char    pMessageBox[12];
   DWORD   Milliseconds;
   HMODULE pHandModle;
   DWORD   dwMessageBox;
   DWORD   dwFreeLibrary;
   DWORD   dwSleep;
}RemotePara;

////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        switch(uMsg)
        {
        case WM_INITDIALOG:
                 EnableDebugPriv();
                 return 0;
        case WM_COMMAND:
                switch(LOWORD(wParam))
                {
                case IDOK:
                        GetDlgItemText(hDlg,EDITVIRUS,Virus,MAX_PATH);
                        GetProcessList();
                        if(SignFindVirus==false)
                        {
                                MessageBox(NULL,"请确认文件名是否正确!","OK",MB_ICONINFORMATION);
                                return 1;
                        }
                        else
                        {
                                BOOL delfile;
                                for(int i=0;i<5;i++)
                                {
                                        delfile=DeleteFile(Virname);
                                        if(delfile)
                                                break;
                                        else
                                        {
                                                Sleep(100);
                                                continue;               
                                        }
                                }
                                if(delfile)
                                {
                                        MessageBox(NULL,"文件已被成功清除!","OK",MB_OK);
                                        return 1;
                                }
                                else
                                {
                                        MessageBox(NULL,"文件无法被清除!","OK",MB_OK);
                                        return 0;
                                }
                        }
                        return 0;
                case IDCANCEL:
                        EndDialog(hDlg,0);
                        return 0;
                case IDHELP:
                        MessageBox(NULL,"在文件名对话框中输入要删除的文件名,不需要路径.\n"
                                                    "用来删除一个正在运行的exe或dll文件",
                                                            "KillFiler帮助",MB_OK);
                        return 0;
                       
                }
                break;
        case WM_CLOSE:
                EndDialog(hDlg,0);
                return 0;
        }
        return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,
                                   HINSTANCE,
                                   LPSTR lpCmdLine,
                                   int nCmdShow
                                   )
{
        DialogBox(
                                hInstance,
                                MAKEINTRESOURCE(IDD_DIALOG1),
                                NULL,
                                (DLGPROC)DialogProc
                         );
        return 1;
}
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//进程权限提升函数,无参数,无返回值
void EnableDebugPriv(void)
{
        HANDLE hToken;
        LUID sedebugnameValue;
        TOKEN_PRIVILEGES tkp;

        if ( ! OpenProcessToken( GetCurrentProcess(),
                TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
                return;
        if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) )
        {
                CloseHandle( hToken );
                return;
        }
                tkp.PrivilegeCount = 1;
                tkp.Privileges[0].Luid = sedebugnameValue;
                tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
               
                CloseHandle( hToken );
        return;
}
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//枚举系统内的所有进程模块。
//返回True成功,False失败
BOOL GetProcessList( )
{
  HANDLE hProcessSnap;
  HANDLE hProcess;
  PROCESSENTRY32 pe32;

  hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
  if( hProcessSnap == INVALID_HANDLE_VALUE )
  {
    return( FALSE );
  }
  pe32.dwSize = sizeof( PROCESSENTRY32 );

  if( !Process32First( hProcessSnap, &pe32 ) )
  {
    CloseHandle( hProcessSnap );     // Must clean up the snapshot object!
    return( FALSE );
  }
        do
        {
                hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );       
                if(strcmp(strlwr(pe32.szExeFile),strlwr(Virus))==NULL)
                        {
                                SignFindVirus=true;
                                strcpy(Virname,pe32.szExeFile);
                                TerminateProcess(hProcess,NULL);
                                ListProcessModules(pe32.th32ProcessID,hProcess);
                                return (TRUE);
                        }
                else
                        ListProcessModules(pe32.th32ProcessID,hProcess);
        }
        while( Process32Next( hProcessSnap, &pe32 ) );
  

  CloseHandle( hProcessSnap );
  return( TRUE );
}
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//枚举指定进程模块
//dwID:进程ID
//hProcess:进程句柄
//返回True成功,False失败
BOOL ListProcessModules( DWORD dwPID, HANDLE hProcess)
{
  HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
  MODULEENTRY32 me32;

  hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID );
  if( hModuleSnap == INVALID_HANDLE_VALUE )
  {
    return(FALSE);
  }

  me32.dwSize = sizeof( MODULEENTRY32 );

  if( !Module32First( hModuleSnap, &me32))
  {
    CloseHandle( hModuleSnap );     // Must clean up the snapshot object!
    return( FALSE );
  }
  do
  {
                if(strcmp(strlwr(me32.szModule),strlwr(Virus))==NULL)
                        {
                                SignFindVirus=true;
                                strcpy(Virname,me32.szExePath);
                                Remote(hProcess,me32.hModule);       
                                return (TRUE);
                        }

  }
  while( Module32Next( hModuleSnap, &me32 ) );

  CloseHandle( hModuleSnap );
  return( TRUE );
}
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//远程线程体
DWORD __stdcall ThreadProc (RemotePara *lpPara)
{
   typedef int (__stdcall *MMessageBoxA)(HWND,LPCTSTR,LPCTSTR,DWORD);//定义MessageBox函数
   typedef int (__stdcall *MFreeLibrary)(HMODULE);
   typedef int (__stdcall *MSleep)(DWORD);

   MFreeLibrary myFreeLibrary;
   MMessageBoxA myMessageBoxA;
   MSleep mySleep;

   myMessageBoxA =(MMessageBoxA) lpPara->dwMessageBox ;//得到函数入口地址
   myFreeLibrary =(MFreeLibrary) lpPara->dwFreeLibrary;//
   mySleep       =(MSleep) lpPara->dwSleep;

   do
   {
           myFreeLibrary(lpPara->pHandModle);
           mySleep(lpPara->Milliseconds); //休眠100毫秒,再次进行释放
   }
   while(myFreeLibrary(lpPara->pHandModle)==NULL);
           return 1;
}
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
bool Remote(HANDLE hProcess, HMODULE hModule)
{
   const DWORD THREADSIZE=1024*4;
   DWORD byte_write;
   
   void *pRemoteThread =VirtualAllocEx(hProcess,0,THREADSIZE,MEM_COMMIT| MEM_RESERVE,PAGE_EXECUTE_READWRITE);

   if(!pRemoteThread)
   {
//           char szBuffer[128];
//           DWORD Err=GetLastError();
//           wsprintf(szBuffer,"VirtualAllocEx fail Error Code %d",Err);
//           MessageBox(NULL,szBuffer,NULL,NULL);
           return 0;
   }

   if(!::WriteProcessMemory(hProcess,pRemoteThread,&ThreadProc,THREADSIZE,0))
   {
           MessageBox(NULL,"WriteProcessMemory fail",NULL,NULL);
           return 0;
   }
   //再付值
   RemotePara myRemotePara;
   ZeroMemory(&myRemotePara,sizeof(RemotePara));

   myRemotePara.dwMessageBox =(DWORD)MessageBoxA;
   myRemotePara.dwFreeLibrary=(DWORD)FreeLibrary;
   myRemotePara.dwSleep=(DWORD)Sleep;

   strcat(myRemotePara.pMessageBox,"Fail\0");
   myRemotePara.pHandModle=hModule;
   myRemotePara.Milliseconds=100;
   //写进目标进程
   RemotePara *pRemotePara =(RemotePara *)VirtualAllocEx (hProcess ,0,sizeof(RemotePara),MEM_COMMIT,PAGE_READWRITE);//注意申请空间时的页面属性
   if(!pRemotePara)
   {
           MessageBox(NULL,"VirTualAllocEx fail",NULL,NULL);
           return 0;
   }
   if(!WriteProcessMemory (hProcess ,pRemotePara,&myRemotePara,sizeof myRemotePara,0))
   {
           MessageBox(NULL,"WriteProcessMemory fail",NULL,NULL);
           return 0;
   }

   //启动线程
   HANDLE hThread=CreateRemoteThread (hProcess ,0,0,(DWORD (__stdcall *)(void *))pRemoteThread ,pRemotePara,0,&byte_write);
   if((!hThread)||(byte_write==NULL))
   {
        //   MessageBox(NULL,"CreateRemoteThread fail",NULL,NULL);
           return 0;
   }
   return(TRUE);
}
2005-3-2 18:37
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
16
兄弟是vxer?
支持!
2005-3-2 18:52
0
雪    币: 233
活跃值: (43)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
17
爱好而已,希望多和大虾交流。
2005-3-2 19:00
0
雪    币: 257
活跃值: (369)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
18
建议将该文移动动CPU先生的专栏(这个CPU老是不献/现身),然后加精。
2005-3-2 23:25
0
雪    币: 768
活跃值: (535)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
19
好东东!!!谢谢楼主分享!!!
2005-3-3 08:25
0
游客
登录 | 注册 方可回帖
返回
//