远程加载与卸载DLL

来源:互联网 发布:spring cloud node 编辑:程序博客网 时间:2024/06/05 07:14
[cpp] view plaincopy
  1. DWORD GetProcessIdByName(LPCTSTR szProcess)//注意要加exe后缀  
  2. {  
  3.     DWORD dwRet=0;  
  4.     HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  
  5.     PROCESSENTRY32 pe32;  
  6.     pe32.dwSize=sizeof(PROCESSENTRY32);  
  7.     Process32First(hSnapshot,&pe32);  
  8.     do   
  9.     {  
  10.         if (_tcscmp(pe32.szExeFile,szProcess)==0)  
  11.         {  
  12.             dwRet=pe32.th32ProcessID;  
  13.             break;  
  14.         }  
  15.     } while (Process32Next(hSnapshot,&pe32));  
  16.     CloseHandle(hSnapshot);  
  17.     return dwRet;  
  18. }  
[cpp] view plaincopy
  1. BOOL Inject(LPCTSTR szModule, DWORD dwID)  
  2. {  
  3.     HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, dwID);  
  4.     if ( !hProcess ) {  
  5.         return FALSE;  
  6.     }  
  7.     int cByte  = (_tcslen(szModule)+1) * sizeof(TCHAR);  
  8.     LPVOID pAddr = VirtualAllocEx(hProcess, NULL, cByte, MEM_COMMIT, PAGE_READWRITE);  
  9.     if ( !pAddr || !WriteProcessMemory(hProcess, pAddr, szModule, cByte, NULL)) {  
  10.         return FALSE;  
  11.     }  
  12. #ifdef _UNICODE  
  13.     PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T("Kernel32")), "LoadLibraryW");  
  14. #else  
  15.     PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T("Kernel32")), "LoadLibraryA");  
  16. #endif  
  17. //Kernel32.dll总是被映射到相同的地址  
  18.     if ( !pfnStartAddr ) {  
  19.         return FALSE;  
  20.     }  
  21.     DWORD dwThreadID = 0;  
  22.     HANDLE hRemoteThread = CreateRemoteThread(hProcess, NULL, 0, pfnStartAddr, pAddr, 0, &dwThreadID);  
  23.     if ( !hRemoteThread ) {  
  24.         return FALSE;  
  25.     }  
  26.     WaitForSingleObject(hRemoteThread,INFINITE);  
  27.     VirtualFreeEx(hProcess,pAddr,cByte,MEM_COMMIT);  
  28.     CloseHandle(hRemoteThread);  
  29.     CloseHandle(hProcess);  
  30.     return TRUE;  
  31. }  


 

简单提权函数

[cpp] view plaincopy
  1. BOOL EnablePrivilege(LPCTSTR lpszPrivilegeName, BOOL bEnable)  
  2. {  
  3.     HANDLE hToken = NULL;  
  4.     TOKEN_PRIVILEGES tp;  
  5.     LUID luid;  
  6.   
  7.     if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_READ, &hToken))  
  8.         return FALSE;  
  9.     if(!LookupPrivilegeValue(NULL, lpszPrivilegeName, &luid))  
  10.         return TRUE;  
  11.   
  12.     tp.PrivilegeCount = 1;  
  13.     tp.Privileges[0].Luid = luid;  
  14.     tp.Privileges[0].Attributes = (bEnable) ? SE_PRIVILEGE_ENABLED : 0;  
  15.   
  16.     AdjustTokenPrivileges(hToken, FALSE, &tp, NULL, NULL, NULL);  
  17.     CloseHandle(hToken);  
  18.     return (GetLastError() == ERROR_SUCCESS);  
  19. }   


 

[cpp] view plaincopy
  1. BOOL UnLoadDll(LPCTSTR szDllName, DWORD dwID)//要卸载的DLL名,进程PID  
  2. {  
  3.     HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, dwID);  
  4.     if ( !hProcess ) {  
  5.         return FALSE;  
  6.     }  
  7.     int cByte  = (_tcslen(szDllName)+1) * sizeof(TCHAR);  
  8.     LPVOID pAddr = VirtualAllocEx(hProcess, NULL, cByte, MEM_COMMIT, PAGE_READWRITE);  
  9.     if ( !pAddr || !WriteProcessMemory(hProcess, pAddr, szDllName, cByte, NULL)) {  
  10.         return FALSE;  
  11.     }  
  12. #ifdef _UNICODE  
  13.     PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetModuleHandleW;  
  14. #else  
  15.     PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetModuleHandleA;  
  16. #endif  
  17.     //Kernel32.dll总是被映射到相同的地址  
  18.     if ( !pfnStartAddr ) {  
  19.         return FALSE;  
  20.     }  
  21.     DWORD dwThreadID = 0,dwFreeId=0,dwHandle;  
  22.     HANDLE hRemoteThread = CreateRemoteThread(hProcess, NULL, 0, pfnStartAddr, pAddr, 0, &dwThreadID);  
  23.     if ( !hRemoteThread ) {  
  24.         return FALSE;  
  25.     }  
  26.     WaitForSingleObject(hRemoteThread,INFINITE);  
  27.     // 获得GetModuleHandle的返回值  
  28.     GetExitCodeThread(hRemoteThread,&dwHandle);  
  29.     CloseHandle(hRemoteThread);  
  30.     // 使目标进程调用FreeLibrary,卸载DLL  
  31. #ifdef _UNICODE  
  32.     PTHREAD_START_ROUTINE pfnFreeAddr = (PTHREAD_START_ROUTINE)FreeLibrary;  
  33. #else  
  34.     PTHREAD_START_ROUTINE pfnFreeAddr = (PTHREAD_START_ROUTINE)FreeLibrary;  
  35. #endif  
  36.     HANDLE hFreeThread = CreateRemoteThread(hProcess, NULL, 0, pfnFreeAddr,(LPVOID)dwHandle,0,&dwFreeId);  
  37.     if ( !hFreeThread ) {  
  38.         return FALSE;  
  39.     }  
  40.     WaitForSingleObject(hFreeThread,INFINITE);  
  41.     VirtualFreeEx(hProcess,pAddr,cByte,MEM_COMMIT);  
  42.     CloseHandle(hFreeThread);     
  43.     CloseHandle(hProcess);  
  44.     return TRUE;