communication.h (50 lines of code) (raw):
#ifndef COMMUNICATION_H
#define COMMUNICATION_H
#include <Windows.h>
#include <stdint.h>
typedef struct checkin_
{
uint32_t pid;
wchar_t domain_and_username[512];
wchar_t current_process_directory[260];
} checkin_t;
typedef struct packet_
{
union
{
uint8_t buffer;
uint32_t command_id;
uint32_t is_wow64_check_flag;
uint32_t pid;
uint32_t result;
} _0;
union
{
uint32_t buffer_size;
uint32_t error_code;
} _1;
} packet_t;
packet_t* comm_allocate_packet();
void comm_encrypt_send_data(HANDLE pipe, const uint8_t* buffer,
uint32_t buffer_size, const uint8_t* key,
size_t key_size);
checkin_t* comm_new_checkin(void);
packet_t* comm_new_packet(uint32_t command_id, uint32_t buffer_size);
packet_t* comm_receive_packet(HANDLE pipe);
uint8_t* comm_receive_data(HANDLE pipe, uint32_t data_size);
checkin_t* comm_receive_checkin(HANDLE pipe, const uint8_t* key,
size_t key_size);
uint8_t* comm_receive_decrypt_data(HANDLE pipe, uint32_t buffer_size,
const uint8_t* key, size_t key_size);
void comm_send_command(HANDLE pipe, uint32_t command_id, const uint8_t* buffer,
uint32_t buffer_size, const uint8_t* key,
size_t key_size);
void comm_send_data(HANDLE pipe, const uint8_t* buffer, uint32_t buffer_size);
void comm_send_file_write(HANDLE pipe, const uint8_t* buffer,
uint32_t buffer_size);
void comm_send_file_write_size(HANDLE pipe, uint32_t buffer_size);
void comm_send_packet(HANDLE pipe, const packet_t* packet);
checkin_t* comm_process_initial_checkin(HANDLE pipe, const uint8_t* key,
size_t key_size);
void comm_send_request(HANDLE pipe, uint32_t command_id, uint32_t buffer_size);
#endif // !COMMUNNICAITON_H