[C++] Crackme -> Passwort dynamisch ändern

Hi HaBo,
ich arbeite momentan an einem crackme, habe bereits einige sicherungen implementiert nur jetzt hänge ich an folgendem:
Ich wollte eine passwort abfrage erstellen die nach einer bestimmten zeit (z.B 10 sekunden) das passwort ändert. innerhalb dieser 10 sekunden soll das passwort eingegeben werden. Mein quellcode sah bisher so aus:
Code:
//...
string password; //soll pw aufnehmen
string input;        //nimmt usereingabe auf

while(1)
{
    password = generate();             //erstellt pseudo-zufälliges pw
    cout << "Passwort: " << endl;  
    wait(10);                                     //wartet 10 sek. ohne was anderes zu machen
    cin >> input;                               //list pw ein
    check(input, password);             //prüft password mit weiteren mechanismen
                                                       //und verlässt ggf die schleife
}
ihr sehts wahrscheinlich schon, während wait(); kann der user nichts eingeben und wenn wait zuende ist ist der zeitraum für die eingabe zu kurz. daher die frage:
wie kann der user parallel zu wait() eine eingabe machen?
weder in büchern noch in google konnte ich geeignetes finden.

dankbar für jede hilfe,
bad_alloc

PS: man soll zwar keine crackmes erstellen, die man ohne fremde hilfe nicht fertigkriegt, aber hier interessierts mich einfach mal ;)
 
RE: [c++]

also mit cin hast du da keine chance, da der aufruf solange blockiert, bis ne eingabe da ist. Ich glaube auch nicht, dass dir die stdlibs von cpp da weiterhelfen können. Ich denke hier must du die os-API verwenden. Unter windows ginge das grob so:
Code:
#include <windows.h>

#pragma comment(lib,"kernel32.lib")

/* ... */


HANDLE console = GetStdHandle(STD_INPUT_HANDLE);

time_t startTime = time(NULL);

char* pwdBuf = new char[BUFSIZE];

while(time(NULL) - startTime <= 10)
{
if(WaitForSingleObject(console,0) == WAIT_OBJECT_0)
{
// hier mit ReadConsole() den input an deinen buffer anhhängen und prüfen, ob nen enter dabei war, wenn ja -> break;
}
}

//hier hast du dann entweder die eingabe im buf oder die zeit ist abgelaufen

edit:
beim WaitForSingleObject() bitte nicht unbedingt 0 als timeout nehmen, das würde ne eingabe mit 100% cpu-last bedeuten,  50 ms wären da wohl besser.
 
hier mit ReadConsole() den input an deinen buffer anhhängen und prüfen, ob nen enter dabei war, wenn ja -> break;
könnte man auch "einfach" direkt nach wait(); mit ReadConsole() die konsole auslesen, oder bekommt man da das zurückgeliefert, was man mit cout auf die konsole geschrieben hat?

edit: (bitmuncher war schneller)
mit threads hab ich zwar noch garnichts am hut aber ich werds mir mal ansehen.
(damit wäre eine plattformunabhängige lösung dahin)
 
Original von bad_alloc
könnte man auch "einfach" direkt nach wait(); mit ReadConsole() die konsole auslesen, oder bekommt man da das zurückgeliefert, was man mit cout auf die konsole geschrieben hat?

die wait-function aus deinem snippet kenne ich garnicht. ich vermute mal die ist äquivalent zu Sleep() und hält die ganze anwendung an, was du ja eigentlich nicht möchtest. besser ist es mit WaitForSingleObject immer nur kurz zu warten. gleichzeitig verrät dir der Rückgabewert von WaitForSingleObject(), ob etwas eingegeben wurde. diese info brauchst du, da ReadConsoleInput sonst blockiert, bis etwas eingegeben wurde und das möchtest du sicher auch nicht.

Der Vorschlag von bitmuncher war auch meine erste idee, aber hat einen entscheidenen nachteil. cin blockiert solange bis nen enter kommt. und wenn man dann nach 10s die eingabe abbrechen möchte geht das nur mit TerminateThread(), was dazu führt, dass der Thread brutal beendet, ohne dass man noch irgendwelche aufräumarbeiten machen kann, wodurch laufzeitfehler vorprogrammiert sind.
 
Original von ArnoNühm
Der Vorschlag von bitmuncher war auch meine erste idee, aber hat einen entscheidenen nachteil. cin blockiert solange bis nen enter kommt. und wenn man dann nach 10s die eingabe abbrechen möchte geht das nur mit TerminateThread(), was dazu führt, dass der Thread brutal beendet, ohne dass man noch irgendwelche aufräumarbeiten machen kann, wodurch laufzeitfehler vorprogrammiert sind.

Hm, stimmt. Ich weiss schon warum ich Admin und kein Coder geworden bin. :D
 
Zurück
Oben