mirror of
https://github.com/rapid7/metasploit-payloads
synced 2025-04-06 01:16:37 +02:00
60 lines
1.7 KiB
C
60 lines
1.7 KiB
C
#include "precomp.h"
|
|
|
|
extern DWORD request_audio_output_channel_open(Remote *remote, Packet *packet);
|
|
extern DWORD request_net_tcp_client_channel_open(Remote *remote, Packet *packet);
|
|
extern DWORD request_net_tcp_server_channel_open(Remote *remote, Packet *packet);
|
|
extern DWORD request_net_udp_channel_open(Remote *remote, Packet *packet);
|
|
|
|
// Channel type dispatch table
|
|
struct
|
|
{
|
|
LPCSTR type;
|
|
DWORD (*handler)(Remote *, Packet *);
|
|
} channel_open_handlers[] =
|
|
{
|
|
{ "stdapi_fs_file", request_fs_file_channel_open },
|
|
{ "audio_output", request_audio_output_channel_open },
|
|
{ "stdapi_net_tcp_client", request_net_tcp_client_channel_open },
|
|
{ "stdapi_net_tcp_server", request_net_tcp_server_channel_open },
|
|
{ "stdapi_net_udp_client", request_net_udp_channel_open },
|
|
{ NULL, NULL },
|
|
};
|
|
|
|
/*
|
|
* Dispatches channel open requests to the appropriate handlers internally if
|
|
* they are destined to a type that is managed by this extension.
|
|
*/
|
|
DWORD request_general_channel_open(Remote *remote, Packet *packet)
|
|
{
|
|
Packet *response = NULL;
|
|
LPCSTR channelType;
|
|
DWORD result = ERROR_NOT_FOUND;
|
|
DWORD index;
|
|
|
|
do
|
|
{
|
|
// Get the requested channel type
|
|
channelType = packet_get_tlv_value_string(packet,
|
|
TLV_TYPE_CHANNEL_TYPE);
|
|
|
|
// No channel? Lame.
|
|
if (!channelType)
|
|
break;
|
|
|
|
// Enumerate the channel type dispatch table searching for a match
|
|
for (index = 0;
|
|
channel_open_handlers[index].type;
|
|
index++)
|
|
{
|
|
if (!strcmp(channel_open_handlers[index].type, channelType))
|
|
{
|
|
result = channel_open_handlers[index].handler(remote, packet);
|
|
break;
|
|
}
|
|
}
|
|
|
|
} while (0);
|
|
|
|
return result;
|
|
}
|