如何在程序中关闭别的进程中的DLL文件,让其释放掉
2007-05-19 20:20
1076 查看
#include <malloc.h>
#include <TlHelp32.h>
#ifdef UNICODE
#define EjectLib EjectLibW
#else
#define EjectLib EjectLibA
#endif // !UNICODE
//dwProcessId 进程id
//pszLibFile 库的绝对路径
BOOL WINAPI EjectLibW(DWORD dwProcessId,PCWSTR pszLibFile)
{
BOOL fOk=FALSE;//赋初值,假定函数失败
HANDLE hthSnapshot=NULL;
HANDLE hProcess=NULL,hThread=NULL;
__try
{
//获取进程快照
hthSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwProcessId);
if (hthSnapshot==NULL) __leave;
//获取注入dll的句柄
MODULEENTRY32W me={sizeof(me)};
BOOL fFound=FALSE;
BOOL fMoreMods=Module32FirstW(hthSnapshot,&me);
for(;fMoreMods;fMoreMods=Module32NextW(hthSnapshot,&me))//枚举进程模块判断是否为注入模块
{
fFound=(lstrcmpiW(me.szModule,pszLibFile)==0)||(lstrcmpiW(me.szExePath,pszLibFile)==0);
if(fFound)break;
}
if(!fFound)__leave;
//获得进程句柄
hProcess = OpenProcess(
PROCESS_QUERY_INFORMATION | // Required by Alpha
PROCESS_CREATE_THREAD |
PROCESS_VM_OPERATION, //可以使用CreateRemoteThread
FALSE,dwProcessId);
if(hProcess==NULL) __leave;
//获取Kernel32.dll中LoadLibraryW的真实地址
PTHREAD_START_ROUTINE pfnThreadRtn=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"FreeLibrary");
if(pfnThreadRtn == NULL) __leave;
////建立远程线程调用LoadLibraryW
hThread=CreateRemoteThread(hProcess,NULL,0,pfnThreadRtn,me.modBaseAddr,0,NULL);
if (hThread==NULL) __leave;
//等待线程结束
WaitForSingleObject(hThread, INFINITE);
fOk=TRUE; //释放成功
}
__finally
{
//异常处理
if(hthSnapshot != NULL)
CloseHandle(hthSnapshot);
if(hThread != NULL)
CloseHandle(hThread);
if(hProcess != NULL)
CloseHandle(hProcess);
}
return(fOk);
}
///////////////////////////////////////////////////////////////////////////////
BOOL WINAPI EjectLibA(DWORD dwProcessId,PCSTR pszLibFile)
{
//分配Unicode格式下路径存储空间
PWSTR pszLibFileW=(PWSTR)_alloca((lstrlenA(pszLibFile) + 1) * sizeof(WCHAR));
//把ANSI路径名转换为Unicode格式
wsprintfW(pszLibFileW, L"%S", pszLibFile);
//调用Unicode格式的函数
return(EjectLibW(dwProcessId, pszLibFileW));
}
#include <TlHelp32.h>
#ifdef UNICODE
#define EjectLib EjectLibW
#else
#define EjectLib EjectLibA
#endif // !UNICODE
//dwProcessId 进程id
//pszLibFile 库的绝对路径
BOOL WINAPI EjectLibW(DWORD dwProcessId,PCWSTR pszLibFile)
{
BOOL fOk=FALSE;//赋初值,假定函数失败
HANDLE hthSnapshot=NULL;
HANDLE hProcess=NULL,hThread=NULL;
__try
{
//获取进程快照
hthSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwProcessId);
if (hthSnapshot==NULL) __leave;
//获取注入dll的句柄
MODULEENTRY32W me={sizeof(me)};
BOOL fFound=FALSE;
BOOL fMoreMods=Module32FirstW(hthSnapshot,&me);
for(;fMoreMods;fMoreMods=Module32NextW(hthSnapshot,&me))//枚举进程模块判断是否为注入模块
{
fFound=(lstrcmpiW(me.szModule,pszLibFile)==0)||(lstrcmpiW(me.szExePath,pszLibFile)==0);
if(fFound)break;
}
if(!fFound)__leave;
//获得进程句柄
hProcess = OpenProcess(
PROCESS_QUERY_INFORMATION | // Required by Alpha
PROCESS_CREATE_THREAD |
PROCESS_VM_OPERATION, //可以使用CreateRemoteThread
FALSE,dwProcessId);
if(hProcess==NULL) __leave;
//获取Kernel32.dll中LoadLibraryW的真实地址
PTHREAD_START_ROUTINE pfnThreadRtn=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"FreeLibrary");
if(pfnThreadRtn == NULL) __leave;
////建立远程线程调用LoadLibraryW
hThread=CreateRemoteThread(hProcess,NULL,0,pfnThreadRtn,me.modBaseAddr,0,NULL);
if (hThread==NULL) __leave;
//等待线程结束
WaitForSingleObject(hThread, INFINITE);
fOk=TRUE; //释放成功
}
__finally
{
//异常处理
if(hthSnapshot != NULL)
CloseHandle(hthSnapshot);
if(hThread != NULL)
CloseHandle(hThread);
if(hProcess != NULL)
CloseHandle(hProcess);
}
return(fOk);
}
///////////////////////////////////////////////////////////////////////////////
BOOL WINAPI EjectLibA(DWORD dwProcessId,PCSTR pszLibFile)
{
//分配Unicode格式下路径存储空间
PWSTR pszLibFileW=(PWSTR)_alloca((lstrlenA(pszLibFile) + 1) * sizeof(WCHAR));
//把ANSI路径名转换为Unicode格式
wsprintfW(pszLibFileW, L"%S", pszLibFile);
//调用Unicode格式的函数
return(EjectLibW(dwProcessId, pszLibFileW));
}
相关文章推荐
- 【转】C#生成dll文件:如何用C#编译生成dll文件即动态链接库文件供其它程序调用
- 如何在Dll中分配内存,而在调用程序里释放
- 在Linux程序中如何获得本进程的可执行文件的全路径?
- vc++实现无进程无DLL无硬盘文件无启动项的ICMP后门后门程序
- Android 应用程序(APK) 如何获得系统签名权限 强制关闭程序(后台进程)
- Win7如何手动注册DLL文件以解决程序不能使用的问题
- vc++实现无进程无DLL无硬盘文件无启动项的ICMP后门后门程序
- 在Linux程序中如何获得本进程的可执行文件的全路径?
- 如何注册DLL、 进程/文件详细信息
- 在其他程序中如何使用FFMPEG 提供的lib dll文件
- Win8系统中最近打开的文件或程序如何设置显示或关闭
- 包含别人的dll,然后我们用类库再次封装成dll的时候的注意事项;源文件与模块生成时的文件不同;创建调试信息文件 ··PDB时发生意外的错误,进程无法访问文件,因为另一个程序正在使用此文件
- 在delphi中如何判断一个文件正在被其它的程序或进程所调用?
- 请求帮助:如何解决烦人的VS.NET2003编译时“无法将程序集复制到文件,另一个程序正在使用,进程无法访问”的问题?
- C# 如何关闭,释放Excel进程
- 请问如何强行释放所有已关闭的程序所残留的内存等资源?类似于微软的那个叫mem.exe的工具,如何入手呢?
- 如何在程序发布时不附带midas.dll文件
- vc++实现无进程无DLL无硬盘文件无启动项的ICMP后门后门程序
- windows server 2003更新后 启动网站提示另一个程序正在使用此文件,进程无法访问 关闭phpstudy全部停止再启动OK
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作