// beacon.h (ThreadlessInjectBof)
#pragma once

/*
 * Beacon Object Files (BOF)
 * -------------------------
 * A Beacon Object File is a light-weight post exploitation tool that runs
 * with Beacon's inline-execute command.
 *
 * Cobalt Strike 4.1.
 */

 /* data API */
typedef struct _data {
	char* original; /* the original buffer [so we can free it] */
	char* buffer;   /* current pointer into our buffer */
	int   length;   /* remaining length of data */
	int   size;     /* total size of this buffer */
} DATA;

DECLSPEC_IMPORT void    BeaconDataParse(datap* parser, char* buffer, int size);
DECLSPEC_IMPORT int     BeaconDataInt(datap* parser);
DECLSPEC_IMPORT short   BeaconDataShort(datap* parser);
DECLSPEC_IMPORT int     BeaconDataLength(datap* parser);
DECLSPEC_IMPORT char*   BeaconDataExtract(datap* parser, int* size);

/* format API */
typedef struct _format {
	char* original; /* the original buffer [so we can free it] */
	char* buffer;   /* current pointer into our buffer */
	int   length;   /* remaining length of data */
	int   size;     /* total size of this buffer */
} FORMAT;

DECLSPEC_IMPORT void    BeaconFormatAlloc(formatp* format, int maxsz);
DECLSPEC_IMPORT void    BeaconFormatReset(formatp* format);
DECLSPEC_IMPORT void    BeaconFormatFree(formatp* format);
DECLSPEC_IMPORT void    BeaconFormatAppend(formatp* format, char* text, int len);
DECLSPEC_IMPORT void    BeaconFormatPrintf(formatp* format, char* fmt, ...);
DECLSPEC_IMPORT char*   BeaconFormatToString(formatp* format, int* size);
DECLSPEC_IMPORT void    BeaconFormatInt(formatp* format, int value);

/* Output Functions */
#define CALLBACK_OUTPUT      0x0
#define CALLBACK_OUTPUT_OEM  0x1e
#define CALLBACK_ERROR       0x0d
#define CALLBACK_OUTPUT_UTF8 0x20

DECLSPEC_IMPORT void   BeaconPrintf(int type, char* fmt, ...);
DECLSPEC_IMPORT void   BeaconOutput(int type, char* data, int len);

/* Token Functions */
DECLSPEC_IMPORT BOOL   BeaconUseToken(HANDLE token);
DECLSPEC_IMPORT void   BeaconRevertToken();
DECLSPEC_IMPORT BOOL   BeaconIsAdmin();

/* Spawn+Inject Functions */
DECLSPEC_IMPORT void   BeaconGetSpawnTo(BOOL x86, char* buffer, int length);
DECLSPEC_IMPORT void   BeaconInjectProcess(HANDLE hProc, int pid, char* payload, int p_len, int p_offset, char* arg, int a_len);
DECLSPEC_IMPORT void   BeaconInjectTemporaryProcess(PROCESS_INFORMATION* pInfo, char* payload, int p_len, int p_offset, char* arg, int a_len);
DECLSPEC_IMPORT void   BeaconCleanupProcess(PROCESS_INFORMATION* pInfo);

/* Utility Functions */
DECLSPEC_IMPORT BOOL   toWideChar(char* src, wchar_t* dst, int max);
