win32相關(遠程線程和遠程線程注入)

遠程線程和遠程線程注入


CreateRemoteThread函數

作用:創建在另一個進程的虛擬地址空間中運行的線程

HANDLE CreateRemoteThread([in]  HANDLE                 hProcess,				// 需要在哪個進程中創建線程[in]  LPSECURITY_ATTRIBUTES  lpThreadAttributes,		// 安全描述符[in]  SIZE_T                 dwStackSize,				// 分配的堆棧大小[in]  LPTHREAD_START_ROUTINE lpStartAddress,			// 要執行的函數[in]  LPVOID                 lpParameter,				// 參數[in]  DWORD                  dwCreationFlags,			// 控制線程創建的標志[out] LPDWORD                lpThreadId				// 返回線程id
);

和我們 CreateThread 函數相比也就多了一個hProcess參數


遠程線程

#include<iostream>
#include<windows.h>// 參數:進程ID,進程內函數地址
BOOL myCreateRemoteThread(DWORD dwProcessId,DWORD dwProcAddr) {// 獲取進程句柄DWORD dwThreadId = 0;HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);if (hProcess == NULL) {std::cout << "打開進程失敗!,錯誤碼:" << GetLastError() << std::endl;return FALSE;}// 創建遠程線程HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)dwProcAddr, NULL, 0, NULL);if (hThread == NULL) {std::cout << "創建遠程線程失敗!,錯誤碼:" << GetLastError() << std::endl;return FALSE;}getchar();// 釋放資源CloseHandle(hProcess);CloseHandle(hThread);return TRUE;
}int main()
{	 獲取窗口句柄//HWND hWind = FindWindow(NULL, L"進程A.exe");//DWORD pid; 通過窗口句柄獲取進程ID和線程id//GetWindowThreadProcessId(hWind,&pid);// 我們先使用硬編碼的方式來測試 myCreateRemoteThread(10872, 0x00007FF76ECD2220);return 0;
}

現在我們可以在其它進程中創建一個新的線程,然后執行它里面的方法


遠程線程注入

那如果我們要在其他進程中執行自己的代碼要怎么辦呢?

這就是用到注入的技術了,所謂注入就是在第三方進程不知道或者不允許的情況下將模塊或者代碼寫入對方進程空間,并設法執行的技術

常見的注入方式:

  • 遠程線程注入
  • APC注入
  • 消息鉤子注入
  • 注冊表注入(已淘汰 需要早期系統版本支撐)
  • 導入表注入
  • 輸入法注入

在CreateRemoteThread方法中,有一個參數lpStartAddress,這個參數是一個返回類型為4/8個字節,接收的參數類型也是4/8個字節的方法(字節數與當前是多少位的系統相關)

DWORD WINAPI ThreadProc(LPVOID lpParameter
);

還有一個函數和ThreadProc很像,也是只有一個參數(4個字節),返回類型也是4個字節,那就是LoadLibrary這個函數

HMODULE LoadLibrary(LPCSTR lpLibFileName
);

這樣以來我們就可以把LoadLibrary函數替換成ThreadProc函數去執行,我們回想一下,執LoadLibrary需要有一個參數,這個參數就是我們dll的路徑,但是這個dll路徑是不能放在我們當前進程的,進程之前的數據都隔離的,所以具體的實現步驟為以下幾點

  1. 在要注入的進程中分配空間,存儲dll的路徑
  2. 獲取LoadLibrary的函數地址
  3. 創建遠程線程,執行LoadLibrary函數

接下來我們來看一下具體的實現流程

DLL注入模塊的編寫

// dllmain.cpp : 定義 DLL 應用程序的入口點。
#include "pch.h"
extern "C" __declspec(dllimport) void __stdcall MyPrintWindow(); // pch.hDWORD WINAPI ThreadProc(LPVOID lpParameter)  { for (;;){Sleep(1000);std::cout << "注入的代碼在執行。。。\n";}return 0;
}BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);break;case DLL_THREAD_ATTACH:break;case DLL_THREAD_DETACH:break;case DLL_PROCESS_DETACH:break;}return TRUE;
}

實現注入功能的代碼

#include<iostream>
#include<windows.h>
#include <tlhelp32.h>// 兩個參數,processId要注入的進程ID,dllAddress dll的地址
BOOL LoadDLL(DWORD dwProcessId,const WCHAR* pDllAddressStr) {BOOL bRet = FALSE;HANDLE hProcess = NULL;HANDLE hThread;DWORD dwLength;DWORD64 dwLoadAddr = NULL;LPVOID lpAllocAddr;DWORD dwThreadId;HMODULE hModule;// 1.獲取進程句柄hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);if (hProcess == NULL) {std::cout << "打開進程失敗!,錯誤碼:" << GetLastError() << std::endl;return FALSE;}// 2.計算Dll路徑名稱長度dwLength = (lstrlen(pDllAddressStr) + 1) * sizeof(WCHAR);// 3.在目標進程中申請內存 參數1,目標進程句柄,參數2,內存起始地址,參數3,內存大小,參數4,內存屬性已提交,參數5,具有讀寫權限lpAllocAddr = VirtualAllocEx(hProcess, NULL, dwLength, MEM_COMMIT, PAGE_READWRITE);if (lpAllocAddr == NULL) {std::cout << "分配置內存失敗!,錯誤碼:" << GetLastError() << std::endl;CloseHandle(hProcess);return FALSE;}// 4.把Dll路徑名稱復制到剛剛分配的目標進程內存當中bRet = WriteProcessMemory(hProcess, lpAllocAddr, pDllAddressStr, dwLength, NULL);if (!lpAllocAddr) {std::cout << "寫目標進程內存失敗!,錯誤碼:" << GetLastError() << std::endl;CloseHandle(hProcess);return FALSE;}// 5.獲取模塊地址hModule = GetModuleHandle(L"Kernel32.dll");if (!hModule) {std::cout << "獲取模塊失敗!,錯誤碼:" << GetLastError() << std::endl;CloseHandle(hProcess);return FALSE;}// 6.獲取LoadLibraryW函數地址dwLoadAddr = (DWORD64)GetProcAddress(hModule, "LoadLibraryW");if (!dwLoadAddr) {std::cout << "函數地址失敗!,錯誤碼:" << GetLastError() << std::endl;CloseHandle(hProcess);CloseHandle(hModule);return FALSE;}// 7.創建遠程線程,加載dllhThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)dwLoadAddr, lpAllocAddr, 0, NULL);if (hThread == NULL) {std::cout << "加載dll失敗!,錯誤碼:" << GetLastError() << std::endl;CloseHandle(hProcess);CloseHandle(hModule);return FALSE;}CloseHandle(hThread);return TRUE;}// 遍歷進程id
DWORD FindConsoleExePid(const WCHAR* exeName) {HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hSnap != INVALID_HANDLE_VALUE){setlocale(LC_ALL, "chs");PROCESSENTRY32 pe32 = { 0 };pe32.dwSize = sizeof(pe32);BOOL bRet = Process32First(hSnap, &pe32);while (bRet){//wprintf(L"%s %d\r\n", pe32.szExeFile, pe32.th32ProcessID);if (lstrcmp(pe32.szExeFile, exeName) == 0){// 返回pidreturn pe32.th32ParentProcessID;}bRet = Process32Next(hSnap, &pe32);}CloseHandle(hSnap);}return 0;
}int main()
{DWORD dwProcessId = FindConsoleExePid(L"遠程線程");//注入dllif (LoadDLL(dwProcessId, L"C:\\Users\\BananaLi\\Desktop\\注入DLL.dll")) {std::cout << "注入成功\n";}else{std::cout << "注入失敗\n";}return 0;}

我們來一步步的分析下代碼

// 1.獲取進程句柄
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);

首先要知道要往哪個進程中注入,就要獲取它的句柄

// 2.計算Dll路徑名稱長度
dwLength = (lstrlen(pDllAddressStr) + 1) * sizeof(WCHAR);

我們要把LoadLibraryW的參數也就是dll的路徑地址傳遞進去,要計算字符串的長度,后面好分配空間

// 3.在目標進程中申請內存 參數1,目標進程句柄,參數2,內存起始地址,參數3,內存大小,參數4,內存屬性已提交,參數5,具有讀寫權限
lpAllocAddr = VirtualAllocEx(hProcess, NULL, dwLength, MEM_COMMIT, PAGE_READWRITE);

我們要在目標進程中開辟一塊空間用來存入我們的dll地址:0x0x0000014922cd0000
在這里插入圖片描述
在這里插入圖片描述

// 4.把Dll路徑名稱復制到剛剛分配的目標進程內存當中
bRet = WriteProcessMemory(hProcess, lpAllocAddr, pDllAddressStr, dwLength, NULL);

運行后我們發現我們dll的路徑已經寫入到了目標進程的空間
在這里插入圖片描述
// 5.獲取模塊地址
hModule = GetModuleHandle(L"Kernel32.dll");
// 6.獲取LoadLibraryW函數地址
dwLoadAddr = (DWORD64)GetProcAddress(hModule, “LoadLibraryW”);

我們會發現不管在任何程序當中都會有ntdll.dll,kernel32.dll這些模塊,并且他們的模塊地址和函數地址在任何進程中都是固定的,然而我們的LoadLibraryW就在kernel32.dll這個模塊當中

在這里插入圖片描述
在這里插入圖片描述
// 7.創建遠程線程,加載dll

最后就是CreateRemoteThread函數加載我們的LoadLibraryW函數,然后在加載LoadLibraryW函數時,創建一個新的線程執行我們需要執行的方法就可以了

在這里插入圖片描述
查看模塊,我們dll也被識別出來了
在這里插入圖片描述
最后還有一個函數是用來退出的

  • FreeLibraryAndExitThread // 卸載自己并退出

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85886.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85886.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85886.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flyway

Flyway 是一個強大的數據庫版本控制和遷移工具&#xff0c;主要用于管理數據庫結構的變更和演進。 核心作用 1. 數據庫版本控制 追蹤數據庫變更&#xff1a;記錄每次數據庫結構的修改版本管理&#xff1a;為每個變更分配版本號變更歷史&#xff1a;完整記錄數據庫演進過程 …

【深尚想】OPA855QDSGRQ1運算放大器IC德州儀器TI汽車級高速8GHz增益帶寬的全面解析

1. 元器件定義與核心特性 OPA855QDSGRQ1 是德州儀器&#xff08;TI&#xff09;推出的一款 汽車級高速運算放大器&#xff0c;專為寬帶跨阻放大&#xff08;TIA&#xff09;和電壓放大應用優化。核心特性包括&#xff1a; 超高速性能&#xff1a;增益帶寬積&#xff08;GBWP&a…

機器學習實驗八--基于pca的人臉識別

基于pca的人臉識別 引言&#xff1a;pca1.pca是什么2.PCA算法的基本步驟 實例&#xff1a;人臉識別1.實驗目的2.實現步驟3.代碼實現4.實驗結果5.實驗總結 引言&#xff1a;pca 1.pca是什么 pca是一種統計方法&#xff0c;它可以通過正交變換將一組可能相關的變量轉換成一組線…

【LLIE專題】NTIRE 2025 低照度圖像增強第二名方案

Towards Scale-Aware Low-Light Enhancement via Structure-Guided Transformer Design&#xff08;2025&#xff0c;NTIRE&#xff09; 專題介紹一、研究背景二、SG-LLIE方法1.和Retinexformer方案對比2.總體方案及創新點3.詳細方案3.1 結構先驗提取3.2 網絡結構3.3 損失函數 …

泊松融合的介紹和OpenCV教程

泊松融合 Poisson Blending 簡介 核心思想 泊松融合的目標是在保留剪切圖像的梯度(紋理)信息的同時,使融合結果在邊界區域平滑過渡到目標圖像中。換句話說,它在融合區域中重建一個圖像,使其梯度盡可能接近源圖像的梯度,并且邊界貼合目標圖像。 數學描述 泊松融合將問題…

Unity協程Coroutine與UniTask對比

原理對比 CoroutineUniTask本質IEnumerator 的協作調度器async/await 狀態機&#xff08;IAsyncStateMachine&#xff09;調度方式Unity 內部調用 MoveNext()自建 PlayerLoopRunner 控制狀態推進內存管理引用類型&#xff0c;頻繁分配 GC結構體 UniTask&#xff0c;低 GC 壓力…

MAC軟件打開提示已損壞:“已損壞,打不開。您應將它移到廢紙簍“

打開「終端.app」&#xff0c;輸入以下命令并回車&#xff0c;輸入開機密碼回車 sudo spctl --master-disable 按照上述步驟操作完成后&#xff0c;打開「系統偏好設置」-「安全與隱私」-「通用」&#xff0c;確保已經修改為「任何來源」。 打開「終端.app」&#xff0c;輸入…

JAVA之 Lambda

Java Lambda Lambda 表達式是 Java 8 的核心特性&#xff0c;通過 函數式編程 大幅簡化代碼。其核心思想是將行為作為參數傳遞&#xff0c;替代匿名內部類&#xff0c;提升代碼的簡潔性和可讀性。以下是系統解析和完整代碼示例&#xff1a; 一、Lambda 表達式基礎 語法結構 (…

Starrocks中RoaringBitmap雜談

背景 最近在閱讀Starrocks源碼的時候&#xff0c;遇到ColumnRefSet的RoaringBitmap使用&#xff0c;所以借此來討論一下RoaringBitmap這個數據結構,這種思想是很值得借鑒的。 對于的實現可以參考一下 <dependency><groupId>org.roaringbitmap</groupId><…

數據結構:泰勒展開式:霍納法則(Horner‘s Rule)

目錄 &#x1f50d; 若用遞歸計算每一項&#xff0c;會發生什么&#xff1f; Horners Rule&#xff08;霍納法則&#xff09; 第一步&#xff1a;我們從最原始的泰勒公式出發 第二步&#xff1a;從形式上重新觀察展開式 &#x1f31f; 第三步&#xff1a;引出霍納法則&…

從Java的Jvm的角度解釋一下為什么String不可變?

從Java的Jvm的角度解釋一下為什么String不可變&#xff1f; 從 JVM 的角度看&#xff0c;Java 中 String 的不可變性是由多層次的機制共同保障的&#xff0c;這些設計涉及內存管理、性能優化和安全保障&#xff1a; 1. JVM 內存模型與字符串常量池 字符串常量池&#xff08;St…

初識硬編碼(x86指令描述)

硬編碼 任何一個程序其實都可以看做兩部分組成的&#xff0c;指令和數據 cpu并沒有明確的規定哪些要當做數據&#xff0c;哪些要當做指令來執行&#xff0c;把數據給EIP只要是遵循了指定的格式&#xff08;x86 x64 ARM&#xff09;&#xff0c;cpu都會當做指令來執行 x86/x64…

3.RV1126-OPENCV 圖像疊加

一.功能介紹 圖像疊加&#xff1a;就是在一張圖片上放上自己想要的圖片&#xff0c;如LOGO&#xff0c;時間等。有點像之前提到的OSD原理一樣。例如&#xff1a;下圖一張圖片&#xff0c;在左上角增加其他圖片。 二.OPENCV中圖像疊加常用的API 1. copyTo方法進行圖像疊加 原理…

MySQL垂直分庫(基于MyCat)

參考資料&#xff1a; 參考視頻 參考博客 Mycat基本部署 視頻參考資料&#xff1a;鏈接: https://pan.baidu.com/s/1xT_WokN_xlRv0h06b6F3yg 提取碼: aag3 概要&#xff1a; 本文的垂直分庫&#xff0c;全部是基于前文部署的基本架構進行的 垂直分庫&#xff1a; 垂直分庫…

Spitfire:Codigger 生態中的高性能、安全、分布式瀏覽器

Spitfire 是 Codigger 生態系統中的一款現代化瀏覽器&#xff0c;專為追求高效、隱私和分布式技術的用戶設計。它結合了 Codigger 的分布式架構優勢&#xff0c;在速度、安全性和開發者支持方面提供了獨特的解決方案&#xff0c;同時確保用戶對數據的完全控制。 1. 高性能瀏覽…

1-【源碼剖析】kafka核心概念

從今天開始開始在csdn上記錄學習的筆記&#xff0c;主要包括以下幾個方面&#xff1a; kafkaflinkdoris 本系列筆記主要記錄Kafka學習相關的內容。在進行kafka源碼學習之前&#xff0c;先介紹一下Kafka的核心概念。 消息 消息是kafka中最基本的數據單元&#xff0c;由key和…

互聯網大廠Java求職面試:云原生架構下的微服務網關與可觀測性設計

互聯網大廠Java求職面試&#xff1a;云原生架構下的微服務網關與可觀測性設計 鄭薪苦懷著忐忑的心情走進了會議室&#xff0c;對面坐著的是某大廠的技術總監張總&#xff0c;一位在云原生領域有著深厚積累的專家。 第一輪面試&#xff1a;微服務網關的設計挑戰 張總&#xf…

【HarmonyOS 5】針對 Harmony-Cordova 性能優化,涵蓋原生插件開發、線程管理和資源加載等關鍵場景

1. ?原生圖片處理插件&#xff08;Java&#xff09; package com.example.plugin; import ohos.media.image.ImageSource; import ohos.media.image.PixelMap; import ohos.app.Context; public class ImageProcessor { private final Context context; public ImagePro…

Java-IO流之緩沖流詳解

Java-IO流之緩沖流詳解 一、緩沖流概述1.1 什么是緩沖流1.2 緩沖流的工作原理1.3 緩沖流的優勢 二、字節緩沖流詳解2.1 BufferedInputStream2.1.1 構造函數2.1.2 核心方法2.1.3 使用示例 2.2 BufferedOutputStream2.2.1 構造函數2.2.2 核心方法2.2.3 使用示例 三、字符緩沖流詳…

健康檢查:在 .NET 微服務模板中優雅配置 Health Checks

&#x1f680; 健康檢查&#xff1a;在 .NET 微服務模板中優雅配置 Health Checks &#x1f4da; 目錄 &#x1f680; 健康檢查&#xff1a;在 .NET 微服務模板中優雅配置 Health Checks一、背景與意義 &#x1f50d;二、核心配置 &#x1f527;2.1 引入必要的 NuGet 依賴 &…