0x00 相關介紹:
Windows系統的進程擁有獨立的虛擬地址空間
進程之間的虛擬地址空間互不干擾
在應用層,進程A可以通過WIN32API CreateRemoteThread 在進程B的虛擬地址空間中創建一個線程並且執行
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() 的地址:
得到目標函數地址:0x00A1F521
編寫遠程調用程序:
#include <windows.h>
#include "Process.h"#define NAME L"Project1.exe"
#define FUN_ADDR 0x00A1F521int 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" ) 表示隱藏控制台
編譯執行:
Project1.exe 中的 Fun() 被再次執行



