You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.6 KiB
70 lines
1.6 KiB
#include "client.hpp"
|
|
|
|
namespace theo
|
|
{
|
|
client::client
|
|
(
|
|
SOCKET client_socket,
|
|
const theo::theo_data& init_packet,
|
|
const mapper_routines_t& routines
|
|
)
|
|
:
|
|
client_socket(client_socket),
|
|
alloc(std::get<0>(routines)),
|
|
mcopy(std::get<1>(routines)),
|
|
resolver(std::get<2>(routines))
|
|
{
|
|
// send first packet to the server... this is an init packet...
|
|
if (send(client_socket, reinterpret_cast<const char*>(
|
|
&init_packet), sizeof init_packet, NULL) == SOCKET_ERROR)
|
|
std::printf("[!] failed to send init packet... reason = %d\n",
|
|
WSAGetLastError());
|
|
}
|
|
|
|
std::uintptr_t client::handle() const
|
|
{
|
|
theo::theo_data packet;
|
|
memset(&packet, NULL, sizeof packet);
|
|
|
|
while (recv(client_socket, reinterpret_cast<char*>(
|
|
&packet), sizeof packet, MSG_WAITALL) != SOCKET_ERROR)
|
|
{
|
|
switch (packet.type)
|
|
{
|
|
case theo::theo_packet_type::alloc_memory:
|
|
{
|
|
packet.alloc.addr = alloc(packet.alloc.alloc_size);
|
|
break;
|
|
}
|
|
case theo::theo_packet_type::copy_memory:
|
|
{
|
|
mcopy(packet.copy_memory.dest_addr,
|
|
packet.copy_memory.data, packet.copy_memory.size);
|
|
break;
|
|
}
|
|
case theo::theo_packet_type::resolve_symbol:
|
|
{
|
|
packet.resolve.symbol_addr =
|
|
resolver(packet.resolve.symbol);
|
|
break;
|
|
}
|
|
case theo::theo_packet_type::disconnect:
|
|
{
|
|
const auto result = packet.entry_point;
|
|
closesocket(client_socket);
|
|
return result;
|
|
}
|
|
}
|
|
|
|
send(client_socket, reinterpret_cast<char*>(
|
|
&packet), sizeof packet, NULL);
|
|
|
|
memset(&packet, NULL, sizeof packet);
|
|
}
|
|
|
|
std::printf("[+] socket closed with reason = %d\n",
|
|
WSAGetLastError());
|
|
|
|
return {};
|
|
}
|
|
} |