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);
							 | 
						||
| 
								 | 
							
								}
							 |