免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
遠(yuǎn)程線程注入(二)線程注入

這里我們要用到上篇中的那個(gè) msg.dll

下面的代碼還是使用的統(tǒng)一的寬字符版本,已經(jīng)在VS2010下編譯通過。

首先上代碼,然后慢慢解釋:

  1. #include <windows.h>  
  2. #include <TlHelp32.h>  
  3.   
  4. BOOL LoadRemoteDll(DWORD dwProcessId, LPTSTR lpszLibName)  
  5. {  
  6.     BOOL   bResult            = FALSE;  
  7.     HANDLE hProcess            = NULL;  
  8.     HANDLE hThread            = NULL;  
  9.     PSTR   pszLibFileRemote = NULL;  
  10.     DWORD cch;  
  11.     PTHREAD_START_ROUTINE pfnThreadRrn;  
  12.     __try  
  13.     {  
  14.         //獲得想要注入代碼的進(jìn)程的句柄  
  15.         hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);  
  16.         if (NULL == hProcess)  
  17.             __leave;  
  18.         //計(jì)算DLL路徑名需要的字節(jié)數(shù)  
  19.         cch = 2 * (1 + lstrlen(lpszLibName));  
  20.         //在遠(yuǎn)程線程中為路徑名分配空間  
  21.         pszLibFileRemote = (PSTR)VirtualAllocEx(hProcess, NULL, cch, MEM_COMMIT, PAGE_READWRITE);  
  22.           
  23.         if (pszLibFileRemote == NULL)  
  24.             __leave;  
  25.         //將DLL的路徑名復(fù)制到遠(yuǎn)程進(jìn)程的地址空間  
  26.         if (!WriteProcessMemory(hProcess, (PVOID)pszLibFileRemote, (PVOID)lpszLibName, cch, NULL))  
  27.             __leave;  
  28.         //獲得LoadLibraryA在Kernel.dll中得真正地址  
  29.         pfnThreadRrn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");  
  30.         if (pfnThreadRrn == NULL)  
  31.             __leave;  
  32.   
  33.         hThread = CreateRemoteThread(hProcess, NULL, 0, pfnThreadRrn, (PVOID)pszLibFileRemote, 0, NULL);  
  34.         if (hThread == NULL)  
  35.             __leave;  
  36.         //等待遠(yuǎn)程線程終止  
  37.         WaitForSingleObject(hThread, INFINITE);  
  38.         bResult = TRUE;  
  39.     }  
  40.     __finally  
  41.     {  
  42.         //關(guān)閉句柄  
  43.         if (pszLibFileRemote != NULL)  
  44.             VirtualFreeEx(hProcess, (PVOID)pszLibFileRemote, 0, MEM_RELEASE);  
  45.         if (hThread != NULL)  
  46.             CloseHandle(hThread);  
  47.         if (hProcess != NULL)  
  48.             CloseHandle(hProcess);  
  49.     }  
  50.     return bResult;  
  51. }  
  52.   
  53. BOOL GetProcessIdByName(LPWSTR szProcessName, LPDWORD lpPID)  
  54. {  
  55.     //變量及其初始化  
  56.     STARTUPINFO st;  
  57.     PROCESS_INFORMATION pi;  
  58.     PROCESSENTRY32 ps;  
  59.     HANDLE hSnapshot;  
  60.     ZeroMemory(&st, sizeof(STARTUPINFO));  
  61.     ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));  
  62.     st.cb = sizeof(STARTUPINFO);  
  63.     ZeroMemory(&ps, sizeof(PROCESSENTRY32));  
  64.     ps.dwSize = sizeof(PROCESSENTRY32);  
  65.   
  66.     //遍歷進(jìn)程  
  67.     hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  
  68.     if (hSnapshot == INVALID_HANDLE_VALUE)  
  69.         return FALSE;  
  70.     if (!Process32First(hSnapshot, &ps))  
  71.         return FALSE;  
  72.   
  73.     do  
  74.     {  
  75.         //比較進(jìn)程名  
  76.         if (lstrcmpi(ps.szExeFile, TEXT("calc.exe")) == 0)  
  77.         {  
  78.             //找到了  
  79.             *lpPID = ps.th32ProcessID;  
  80.             CloseHandle(hSnapshot);  
  81.             return TRUE;  
  82.         }  
  83.     }  
  84.     while (Process32Next(hSnapshot, &ps));  
  85.     //沒有找到  
  86.     CloseHandle(hSnapshot);  
  87.     return FALSE;  
  88. }  
  89.   
  90. //修改進(jìn)程權(quán)限  
  91. BOOL EnablePrivilege(LPWSTR name)  
  92. {  
  93.     HANDLE hToken;  
  94.     BOOL rv;  
  95.     TOKEN_PRIVILEGES priv = {1, {0, 0, SE_PRIVILEGE_ENABLED}};  
  96.     LookupPrivilegeValue(0, name, &priv.Privileges[0].Luid);  
  97.     OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);  
  98.     AdjustTokenPrivileges(hToken, FALSE, &priv, sizeof priv, 0, 0);  
  99.     rv = GetLastError() == ERROR_SUCCESS;  
  100.     CloseHandle(hToken);  
  101.     return rv;  
  102. }  
  103.   
  104. int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)  
  105. {  
  106.     DWORD dwPID;  
  107.     //提權(quán),獲取SE_DEBUG_NAME 權(quán)限  
  108.     //可以在其他進(jìn)程的內(nèi)存空間中寫入,創(chuàng)建線程  
  109.      if (0 != EnablePrivilege(SE_DEBUG_NAME))  
  110.          return 0;  
  111.     if (!GetProcessIdByName(TEXT("calc.exe"), &dwPID))  
  112.         return 0;  
  113.     //通過上傳遠(yuǎn)程線程加載dll  
  114.     //將msg.dll放置在系統(tǒng)目錄下  
  115.     if (!LoadRemoteDll(dwPID, TEXT("msg.dll")))  
  116.         return 0;  
  117.     return 1;  
  118. }  

把上次的dll放到相對目錄下面或者是扔到system32下面。

我們首先從main函數(shù)開始吧:

主要是由三個(gè)部分組成的:

1.提取權(quán)限

  1. //提權(quán),獲取SE_DEBUG_NAME 權(quán)限  
  2.   //可以在其他進(jìn)程的內(nèi)存空間中寫入,創(chuàng)建線程  
  3.    if (0 != EnablePrivilege(SE_DEBUG_NAME))  
  4.        return 0;  


2.遍歷搜索進(jìn)程UID

  1. if (!GetProcessIdByName(TEXT("calc.exe"), &dwPID))  
  2.       return 0;  

3.創(chuàng)建遠(yuǎn)程線程

  1. //通過上傳遠(yuǎn)程線程加載dll  
  2.   //將msg.dll放置在系統(tǒng)目錄下  
  3.   if (!LoadRemoteDll(dwPID, TEXT("msg.dll")))  
  4.       return 0;  

前兩個(gè)步驟我們就不具體講了,不是我們的重點(diǎn)。關(guān)鍵是其實(shí)對于進(jìn)程令牌Token自己也不是很理解,不好意思給大家講。。。

關(guān)鍵我們還是來看看第三個(gè)步驟好了。


創(chuàng)建遠(yuǎn)程線程句柄有下面幾個(gè)步驟:

1.獲得想要注入代碼的進(jìn)程的句柄

  1. hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);  

2.計(jì)算DLL路徑名需要的字節(jié)數(shù)

  1. cch = 2 * (1 + lstrlen(lpszLibName));  

這里自己對寬字符的處理沒有做好

可以使用wcslen函數(shù)

3.在遠(yuǎn)程線程中為路徑名分配空間

  1. pszLibFileRemote = (PSTR)VirtualAllocEx(hProcess, NULL, cch, MEM_COMMIT, PAGE_READWRITE);  

4.將DLL的路徑名復(fù)制到遠(yuǎn)程進(jìn)程的地址空間

  1. WriteProcessMemory(hProcess, (PVOID)pszLibFileRemote, (PVOID)lpszLibName, cch, NULL);  

5.獲得LoadLibraryA在Kernel.dll中得真正地址

  1. pfnThreadRrn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");  

6.最后是最最關(guān)鍵的函數(shù)

  1. hThread = CreateRemoteThread(hProcess, NULL, 0, pfnThreadRrn, (PVOID)pszLibFileRemote, 0, NULL);  

7.當(dāng)然還有掃尾的工作

  1. //關(guān)閉句柄  
  2.         if (pszLibFileRemote != NULL)  
  3.             VirtualFreeEx(hProcess, (PVOID)pszLibFileRemote, 0, MEM_RELEASE);  
  4.         if (hThread != NULL)  
  5.             CloseHandle(hThread);  
  6.         if (hProcess != NULL)  
  7.             CloseHandle(hProcess);  

運(yùn)行一下,發(fā)現(xiàn)成功了!~~~


最后棟哥跟我提醒了幾點(diǎn):

1.關(guān)于進(jìn)程令牌的代碼,有時(shí)候不寫也是可以通過的。這里還有待研究一下。

2.被注入的程序有時(shí)候要放在相對目錄下才會(huì)產(chǎn)生效果。關(guān)于這點(diǎn)自己還沒有實(shí)踐過。有待驗(yàn)證。

3.像explorer.exe有時(shí)候會(huì)無法注入。換個(gè)簡單的calc.exe完全可以?;鸷?,qq全部都可以??赡苁莈xplorer.exe有點(diǎn)特別。

4.第一次遠(yuǎn)程注入可以成功,第二次就不行了,就不能彈出對話框了,貌似進(jìn)程打開之后馬上就關(guān)閉了。個(gè)人以為原因可能處在dll的fdwReason。有時(shí)間嘗試著調(diào)試一下。

自己改了一下,應(yīng)該是這樣的。上面的代碼里面沒有FreeLibrary,那么dll還是在遠(yuǎn)程地址空間里面。第二次想要注入的時(shí)候是不會(huì)發(fā)送DLL_PROCESS_ATTACH 消息的。

DLL_PROCESS_ATTACH消息的發(fā)送是這樣的:

線程調(diào)用LoadLibrary   -->   Dll是否已經(jīng)被映射到了進(jìn)程的地址空間中  (如果是)  -->   遞增DLL的使用計(jì)數(shù)  -->  使用計(jì)數(shù)器是否等于1 (如果是) -->  調(diào)用DLL的DllMain并且傳入DLL_PROCESS_ATTACH

所以說,在Dll已經(jīng)被映射到了進(jìn)程地址空間之后,只不過DLL的使用計(jì)數(shù)增加了,如果是2,那么很明顯就不會(huì)調(diào)用DLL的DllMain并且傳入DLL_PROCESS_ATTACH


但是如果我把dll改一下,把彈框代碼寫在DLL_THREAD_ATTACH里面,那么每次創(chuàng)建線程的時(shí)候就都會(huì)收到DLL_THREAD_ATTACH消息了。


關(guān)于遠(yuǎn)程線程注入就先講到這里。當(dāng)然這些都是最簡單的最基本的東西。

自己有時(shí)間去看看核心編程,順便進(jìn)一步了解下操作系統(tǒng)。


本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
DLL注入方法小結(jié)
《windows核心編程系列》十九談?wù)勈褂眠h(yuǎn)程線程來注入DLL。
VC++動(dòng)態(tài)鏈接庫編程之DLL木馬
代碼注入之遠(yuǎn)程線程篇
[Win32] DLL注入技術(shù)
DLL木馬的寫法
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服