远程线程注入代码

Posted zsl6658

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了远程线程注入代码相关的知识,希望对你有一定的参考价值。

                                                              远程线程注入代码 

       远程线程注入可以实现向一个正在运行的进程注入特定的代码。每个进程都有自己的私有空间。远程线程注入可以实现向一个正在运行的进程注入代码。通过进程名找到进程ID,在远程进程开辟空间,启动一个线程,执行一个DLL中的函数,通过得到kernel32中LoadLibrary函数地址,通过执行LoadLibrary载入DLL中的导出函数,执行我们自己定一的代码。实现如下:

//通过进程名得到进程ID

DWORD GetProcessIdFromName(LPCTSTR name)
{
 PROCESSENTRY32 pe;
 DWORD id = 0;
 
 HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 pe.dwSize = sizeof(PROCESSENTRY32);
 if( !Process32First(hSnapshot,&pe) )
  return 0;
 
 do
 {
  pe.dwSize = sizeof(PROCESSENTRY32);
  if( Process32Next(hSnapshot,&pe)==FALSE )
   break;
  if(strcmp(pe.szExeFile,name) == 0)
  {
   id = pe.th32ProcessID;
   break;
  }
  
 } while(1);
 
 CloseHandle(hSnapshot);
 
 return id;
}

//注入代码

void CMTestDlg::OnButton1()
{
 // TODO: Add your control notification handler code here
 DWORD dwRemoteProcessId=GetProcessIdFromName("notepad.exe");
 CString str;
 str.Format("%u",dwRemoteProcessId);
 AfxMessageBox(str,MB_OK);
 HANDLE hRemoteProcess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwRemoteProcessId);
 WCHAR* pszLibFileName=L"MDll.dll";
 int cb=(1+lstrlenW(pszLibFileName))*sizeof(WCHAR);
 LPVOID pszLibFileRemote=(PWSTR)VirtualAllocEx(hRemoteProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
 BOOL iReturnCode=WriteProcessMemory(hRemoteProcess,pszLibFileRemote,(PVOID)pszLibFileName,cb,NULL);
 //HMODULE hModule=GetModuleHandle(TEXT("kernel32"));
 HMODULE hModule=LoadLibrary("C:/WINDOWS/system32/kernel32");
 //typedef HModule (* pfunc)(LPCSTR filename);
 PTHREAD_START_ROUTINE pfnStartAddr=(PTHREAD_START_ROUTINE)GetProcAddress(hModule,"LoadLibraryA");

 //格式化出错信息
 TCHAR szBuf[80];
    LPVOID lpMsgBuf;
    DWORD dw = GetLastError();

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );

    wsprintf(szBuf,
        " failed with error %d: %s",
        dw, lpMsgBuf);
 
    AfxMessageBox(szBuf,MB_OK);

    LocalFree(lpMsgBuf);

 

 HANDLE hRemoteThread=CreateRemoteThread(hRemoteProcess,NULL,0,pfnStartAddr,pszLibFileRemote,0,NULL);

  //等待远程线程退出    
  WaitForSingleObject(hRemoteThread,   INFINITE);    
  //清场处理    
  if   (pszLibFileRemote   !=   NULL)    
  VirtualFreeEx(hRemoteProcess,   pszLibFileRemote,   0,   MEM_RELEASE);    
  if   (hRemoteThread   !=   NULL)   CloseHandle(hRemoteThread   );    
  if   (hRemoteProcess!=   NULL)   CloseHandle(hRemoteProcess);       

}

以上是关于远程线程注入代码的主要内容,如果未能解决你的问题,请参考以下文章

远程线程注入

远程线程注入

远程线程DLL注入, 如何释放DLL和结束DLL的线程

JNA实现远程线程注入

远程线程注入方法CreateRemoteThread

远程线程的注入 PE的修正