Win32創建遠程線程


0x00 相關介紹:

Windows系統的進程擁有獨立的虛擬地址空間

進程之間的虛擬地址空間互不干擾

在應用層,進程A可以通過WIN32API CreateRemoteThread 在進程B的虛擬地址空間中創建一個線程並且執行

1

0x01 核心API說明:

HANDLE WINAPI 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
);

參數說明:

1、 hProcess:進程句柄,目標進程(進程B)的句柄

2、 lpThreadAttributes:安全描述符的結構體指針,填 NULL 即可

3、 dwStackSize:要創建的遠程線程的堆棧大小,一般填 0 使用默認大小

4、 lpStartAddress:遠程線程的執行體,也就是創建的線程要執行的過程函數

5、 lpParameter:遠程線程執行體的參數,與參數4配合使用

6、 dwCreationFlags:創建標志,一般填0

7、 lpThreadId:線程ID的指針,用於接收遠程線程創建成功后的ID

返回值:

線程句柄

0x02 目標程序:

用於測試的目標進程代碼如下:

#include <windows.h>
#include <stdio.h>

void Fun(void)
{
     for(size_t i = 0; i < 10; i++)
         printf("%s addr:0x%p\r\n", __FUNCTION__, Fun);
}

int main(int argc, char* argv[])
{
     Fun();
     //MessageBox(NULL, TEXT("執行完成!"), TEXT("提示"), MB_OK);

    getchar();
     return 0;
}

編譯生成 Project1.exe

0x03 遠程調用程序:

在遠程調用程序中實現:在Project1.exe創建一個線程並調用Fun()

首先運行 Project1.exe 查看 Fun() 的地址:

2

得到目標函數地址:0x00A1F521

編寫遠程調用程序:

#include <windows.h>
#include "Process.h"

#define NAME    L"Project1.exe"
#define FUN_ADDR    0x00A1F521

int main(int argc, char* argv[])
{
     Process* pProcess = new Process(NAME, FALSE);
     if(pProcess->hProcess == NULL){
         OutputDebugString(TEXT("未找到目標進程!\r\n"));
         exit(-1);
     }
     //OutputDebugString(TEXT("已找到目標進程!\r\n"));
     HANDLE hThread = CreateRemoteThread(pProcess->hProcess, NULL, 0,
                                         (LPTHREAD_START_ROUTINE)FUN_ADDR,
                                         NULL, 0, NULL);
     if (hThread == NULL) {
         delete pProcess;
         OutputDebugString(TEXT("CreateRemoteThread 失敗!\r\n"));
         exit(-1);
     }
     CloseHandle(hThread);

    delete pProcess;
     return 0;
}

#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )

其中 Process 類的相關內容參考:https://www.cnblogs.com/DarkBright/p/10809092.html

最后一行:#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" ) 表示隱藏控制台

編譯執行:

3

Project1.exe 中的 Fun() 被再次執行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM