Making magic with the network stack
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.
 
 
 

189 lines
4.7 KiB

//
// Created by conntrack on 4/30/23.
//
#include "netguard.h"
struct ng_session *debug_socket;
int open_debug_socket(const struct arguments *args, int epoll_fd) {
void *saddr;
void *daddr;
char source[INET6_ADDRSTRLEN + 1];
char dest[INET6_ADDRSTRLEN + 1];
int version = 4;
int uid = 0;
uint16_t mss = get_default_mss(version);
uint8_t ws = 8;
int send_window = ntohs(65535);
int sequence_number = ntohs(5000);
int sport = ntohs(40404);
int dport = ntohs(50508);
int packet = 2;
struct allowed *redirect = NULL;
log_android(ANDROID_LOG_ERROR, "%d new debug session mss %u ws %u window %u",
packet, mss, ws, send_window << ws);
// Register session
struct ng_session *s = ng_malloc(sizeof(struct ng_session), "tcp session");
s->protocol = IPPROTO_TCP;
s->tcp.time = time(NULL);
s->tcp.uid = uid;
s->tcp.version = version;
s->tcp.mss = mss;
s->tcp.recv_scale = ws;
s->tcp.send_scale = ws;
s->tcp.send_window = ((uint32_t) send_window) << ws;
s->tcp.unconfirmed = 0;
s->tcp.remote_seq = (uint32_t) sequence_number; // probably should change hardcoded seq #
//s->tcp.remote_seq = ntohl(tcphdr->seq); // ISN remote
s->tcp.local_seq = (uint32_t) rand(); // ISN local
s->tcp.remote_start = s->tcp.remote_seq;
s->tcp.local_start = s->tcp.local_seq;
s->tcp.acked = 0;
s->tcp.last_keep_alive = 0;
s->tcp.sent = 0;
s->tcp.received = 0;
log_android(ANDROID_LOG_ERROR, "got to change address..");
if (version == 4) {
inet_aton("10.1.10.1", &s->tcp.saddr.ip4);
inet_aton("some_server_ip", &s->tcp.daddr.ip4);
}
saddr = &s->tcp.saddr.ip4;
daddr = &s->tcp.daddr.ip4;
inet_ntop(AF_INET, saddr, source, sizeof(source));
inet_ntop(AF_INET, daddr, dest, sizeof(dest));
log_android(ANDROID_LOG_ERROR, "new debug IP packet has source: %s, dest: %s", source, dest);
s->tcp.source = sport; //tcphdr->source;
s->tcp.dest = dport; // tcphdr->dest;
s->tcp.state = TCP_LISTEN;
s->tcp.socks5 = SOCKS5_NONE;
s->tcp.forward = NULL;
s->next = NULL;
log_android(ANDROID_LOG_ERROR, "got to data with source:");
/*
if (datalen) {
log_android(ANDROID_LOG_WARN, "%s SYN data", packet);
s->tcp.forward = ng_malloc(sizeof(struct segment), "syn segment");
s->tcp.forward->seq = s->tcp.remote_seq;
s->tcp.forward->len = datalen;
s->tcp.forward->sent = 0;
s->tcp.forward->psh = tcphdr->psh;
s->tcp.forward->data = ng_malloc(datalen, "syn segment data");
memcpy(s->tcp.forward->data, data, datalen);
s->tcp.forward->next = NULL;
}
*/
log_android(ANDROID_LOG_ERROR, "got to open socket with sport: %d, dport %d", sport, dport);
// Open socket
s->socket = open_tcp_socket(args, &s->tcp, redirect);
if (s->socket < 0) {
// Remote might retry
ng_free(s, __FILE__, __LINE__);
return 0;
}
s->tcp.recv_window = get_receive_window(s);
log_android(ANDROID_LOG_DEBUG, "TCP socket %d lport %d",
s->socket, get_local_port(s->socket));
// Monitor events
memset(&s->ev, 0, sizeof(struct epoll_event));
s->ev.events = EPOLLOUT | EPOLLERR;
s->ev.data.ptr = s;
log_android(ANDROID_LOG_ERROR, "DEBUG adding epoll monitor events: %d", epoll_fd);
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, s->socket, &s->ev))
log_android(ANDROID_LOG_ERROR, "epoll add tcp error %d: %s",
errno, strerror(errno));
s->next = args->ctx->ng_session;
//args->ctx->ng_session->next = s;
debug_socket = s;
return 1;
}
void debug_socket_init(const struct arguments *args, int epoll_fd) {
// TODO: Init the socket. Initialize this socket kind of like what happens
// in tcp.c for open_tcp_socket.
// debug_socket = open()
log_android(ANDROID_LOG_ERROR, "initalizing debug socket");
open_debug_socket(args, epoll_fd);
}
void read_debug_socket() {
// TODO: Figure out what needs to be passed as parameters to this function
return ;
}
void write_debug_socket(const struct arguments *args, const uint8_t *buffer, size_t length) {
// TODO: This function is modelled after write_pcap_ret so I made
// parameters for this function the same since we basically want to do the same thing.
//struct tcp_session *cur = &debug_socket->tcp;
// test write to the debug socket
//write_data(args, cur, buffer, length);
// Forward to tun
if (write_data(args, &debug_socket->tcp, buffer, length) >= 0) {
log_android(ANDROID_LOG_ERROR, "Writing to debug socket with length: %d", length);
debug_socket->tcp.local_seq += length;
debug_socket->tcp.unconfirmed++;
}
}