//Author: Leng_que //Date: 2009-11-11 23:44:44 #include <stdio.h> #include <windows.h> #include <tlhelp32.h> //功能:通过进程名(进程名不区分大小写)得到进程ID号。 DWORD GetProcessIdByName(char *processName) { DWORD dwRet = -1; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pe32={0}; pe32.dwSize = sizeof(PROCESSENTRY32); Process32First( hSnapshot, &pe32 ); do { if ( strcmpi(pe32.szExeFile, processName) == 0 ) { dwRet = pe32.th32ProcessID; break; } } while ( Process32Next(hSnapshot, &pe32) ); CloseHandle(hSnapshot); return dwRet; } //功能:将完全路径为DllFullName的DLL从名为ProcessName的进程中卸载。 bool unLoadDll(char* processName, char* DllFullName) { bool ret = true; HANDLE hProcess = NULL; LPVOID lpBuf = NULL; DWORD dwHandle = NULL; LPVOID pFun = NULL; HANDLE hThread = NULL; DWORD len_DllFullName = 0; DWORD pid = GetProcessIdByName(processName); if ( pid == -1 ) { ret = false; goto CLEAN; } hProcess = OpenProcess(PROCESS_ALL_ACCESS , FALSE, pid); if ( hProcess == NULL ) { ret = false; goto CLEAN; } len_DllFullName = strlen(DllFullName)+1; lpBuf = VirtualAllocEx(hProcess, NULL, len_DllFullName, MEM_COMMIT, PAGE_READWRITE); if ( lpBuf == NULL ) { ret = false; goto CLEAN; } if ( !WriteProcessMemory(hProcess, lpBuf, (LPVOID)DllFullName, len_DllFullName, NULL) ) { ret = false; goto CLEAN; } pFun = GetProcAddress(GetModuleHandle("Kernel32"), "GetModuleHandleA"); if ( pFun == NULL ) { ret = false; goto CLEAN; } hThread = CreateRemoteThread(hProcess, NULL, 0,(LPTHREAD_START_ROUTINE)pFun, lpBuf , 0, NULL); if ( hThread == NULL ) { ret = false; goto CLEAN; } WaitForSingleObject(hThread, INFINITE); if ( !GetExitCodeThread(hThread, &dwHandle) ) { ret = false; goto CLEAN; } if ( dwHandle == NULL ) { ret = false; goto CLEAN; } pFun = GetProcAddress(GetModuleHandle("Kernel32"), "FreeLibrary"); if ( pFun == NULL ) { ret = false; goto CLEAN; } CloseHandle(hThread); hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFun, (LPVOID)dwHandle, 0, NULL); if ( hThread == NULL ) { ret = false; goto CLEAN; } WaitForSingleObject(hThread, INFINITE); CLEAN: if ( hThread != NULL ) { CloseHandle(hThread); } if ( hProcess != NULL ) { if ( lpBuf != NULL ) { VirtualFreeEx(hProcess, lpBuf, len_DllFullName, MEM_DECOMMIT); } CloseHandle(hProcess); } return ret; } //主函数入口 int main(void) { //例如:将在D盘根目录下的evil.dll从名为target.exe的进程内卸载掉。 bool ret = unLoadDll("target.exe", "D://evil.dll"); if ( ret ) { printf("卸载成功!/r/n"); } else { printf("卸载失败!/r/n"); } return 0; }