60 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | #define _CRT_RAND_S
 | ||
|  | #include <stdlib.h>
 | ||
|  | 
 | ||
|  | #include <iostream>
 | ||
|  | #include <windows.h>
 | ||
|  | #include <detours.h>
 | ||
|  | 
 | ||
|  | #include "payloadguid.hpp"
 | ||
|  | 
 | ||
|  | HANDLE hParent = NULL; | ||
|  | 
 | ||
|  | __declspec(noreturn) void HandleApiFailure(const char* api) | ||
|  | { | ||
|  |     DWORD lastErr = GetLastError(); | ||
|  |     std::cout << "payloadtarget.exe: " << api << " failed (" << lastErr << ')' << std::endl; | ||
|  | 
 | ||
|  |     if (hParent) | ||
|  |     { | ||
|  |         CloseHandle(hParent); | ||
|  |     } | ||
|  | 
 | ||
|  |     ExitProcess(1); | ||
|  | } | ||
|  | 
 | ||
|  | int main() | ||
|  | { | ||
|  |     DWORD payloadSize; | ||
|  |     void* payloadAddr = DetourFindPayloadEx(PARENT_HANDLE_PAYLOAD, &payloadSize); | ||
|  |     if (!payloadAddr || payloadSize != sizeof(HANDLE)) | ||
|  |     { | ||
|  |         HandleApiFailure("DetourFindPayloadEx"); | ||
|  |     } | ||
|  | 
 | ||
|  |     hParent = *static_cast<HANDLE*>(payloadAddr); | ||
|  | 
 | ||
|  |     DWORD randomPayloadSize; | ||
|  |     void* randomPayload = DetourFindRemotePayload(hParent, RANDOM_DATA_PAYLOAD, &randomPayloadSize); | ||
|  |     if (!randomPayload || randomPayloadSize != sizeof(random_payload_t)) | ||
|  |     { | ||
|  |         HandleApiFailure("DetourFindRemotePayload"); | ||
|  |     } | ||
|  | 
 | ||
|  |     random_payload_t randomData; | ||
|  |     if (rand_s(&randomData) != 0) | ||
|  |     { | ||
|  |         HandleApiFailure("rand_s"); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     if (!WriteProcessMemory(hParent, randomPayload, &randomData, sizeof(randomData), NULL)) | ||
|  |     { | ||
|  |         HandleApiFailure("WriteProcessMemory"); | ||
|  |     } | ||
|  | 
 | ||
|  |     CloseHandle(hParent); | ||
|  |     hParent = NULL; | ||
|  | 
 | ||
|  |     // conversion to int return type is potentially undefined
 | ||
|  |     ExitProcess(randomData); | ||
|  | } |