C++ DLL注入和程式碼注入

努力的藍精靈發表於2013-10-04
void InjectDLL(DWORD PID,char *Path) 

{
  
  DWORD dwSize;
  
  HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
                           
  dwSize=strlen(Path)+1;

  LPVOID lpParamAddress=VirtualAllocEx(hProcess,0,dwSize,PARITY_SPACE,PAGE_EXECUTE_READWRITE);

  WriteProcessMemory(hProcess,lpParamAddress,(PVOID)Path,dwSize,NULL);

  HMODULE hModule=GetModuleHandleA("kernel32.dll");

  LPTHREAD_START_ROUTINE lpStartAddress=(LPTHREAD_START_ROUTINE)GetProcAddress(hModule,"LoadLibraryA");

  HANDLE hThread=CreateRemoteThread(hProcess,NULL,0,lpStartAddress,lpParamAddress,0,NULL);

  WaitForSingleObject(hThread,1000);

  CloseHandle(hThread);

}


另一種是直接注入程式碼,程式碼如下:
//函式名:InjectCode

//功能:封裝遠端注入的函式

//引數:程式ID

//引數:被注入函式指標<函式名>

//引數:引數

//引數:引數長度

 

void InjectCode(DWORD dwProcId,LPVOID mFunc, LPVOID Param, DWORD ParamSize) 



  HANDLE hProcess;//遠端控制程式碼

  LPVOID mFuncAddr;//申請函式記憶體地址   

  LPVOID ParamAddr;//申請引數記憶體地址

  HANDLE hThread;   //執行緒控制程式碼

  DWORD NumberOfByte; //輔助返回值

  CString str;   

  //開啟被注入的程式控制程式碼 

  hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcId);

  //申請記憶體

  mFuncAddr = VirtualAllocEx(hProcess,NULL,128,MEM_COMMIT,PAGE_EXECUTE_READWRITE);

  ParamAddr = VirtualAllocEx(hProcess,NULL,ParamSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);

  //寫記憶體

  WriteProcessMemory(hProcess,mFuncAddr,mFunc,128, &NumberOfByte);   

  WriteProcessMemory(hProcess,ParamAddr,Param,ParamSize, &NumberOfByte);

  //建立遠端執行緒

  hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)mFuncAddr,

    ParamAddr,0,&NumberOfByte);

  WaitForSingleObject(hThread, INFINITE); //等待執行緒結束

  
//釋放申請有記憶體

  VirtualFreeEx(hProcess,mFuncAddr,128,MEM_RELEASE);

  VirtualFreeEx(hProcess,ParamAddr,ParamSize,MEM_RELEASE);   

  //釋放遠端控制程式碼

  CloseHandle(hThread); 

  CloseHandle(hProcess); 

}
 

相關文章