w81 schrieb:
es geht um eine wette. mein Freund mein er ist der beste Hacker und ich will ihm zeigen das auch von mir geschriebenes programm b.z string in in dem exe er nicht findet. er soll Passwort eingeben und das Programm zeigt dann ob es ok ist oder nicht.
Dann mach doch was fieses, wo der String erst berechnet wird. Superfies, wenn es noch von äußeren Umständen, wie dem Systemdatum abhängt. Hier mal etwas Inspiration:
#include <iostream>
#include <random>
#include <string>
#include <ctime>
using namespace std;
string generate_deterministic_password(unsigned length)
{
mt19937 rng;
rng.seed(1234598765);
std::uniform_int_distribution<char> alphabet_distribution('A','Z');
string password;
for (unsigned i =0; i < length; ++i)
password.push_back(alphabet_distribution(rng));
return password;
}
string generate_password_depending_on_environment(unsigned length)
{
time_t rawtime;
time(&rawtime);
tm *ptm = gmtime(&rawtime);
mt19937 rng;
rng.seed(1234598765 + ptm->tm_yday);
std::uniform_int_distribution<char> alphabet_distribution('A','Z');
string password;
for (unsigned i =0; i < length; ++i)
password.push_back(alphabet_distribution(rng));
return password;
}
int main()
{
string passwort = generate_deterministic_password(8);
cout << "Normales Passwort wäre: " << passwort << '\n';
string fieses_passwort = generate_password_depending_on_environment(8);
cout << "Heutiges Passwort wäre: " << fieses_passwort << '\n';
}
Dieses sollte deterministisch das Passwort "AOTQABKJ" und heute (oder wenn das Systemdatum der 6.3.2012 ist) das fiese Passwort "YURICUQM". Da schreibst du dir nach diesem Muster einen Keygen für dich und ein Abfrageprogramm für deinen Freund.
Für beide Passwörter muss man sich schon ziemlich anstrengen. Wenn du den Symboltable stripst, dann ist noch nicht einmal mehr verräterische Information über den Zufallsgenerator übrig und es bleibt eigentlich nur Deassemblieren oder im Debugger das Programm nach Zeichenkettenvergleichen suchen. Damit bekommt man das Programm dann aber recht leicht . Das gilt auch für die meisten anderen Obfuskationstechniken - wenn man sich gegen Debuggereinsatz wehren will, dann ist das eigentlich eher ein Vergleich der Willenskräfte zwischen Hacker und Programmierer, wer zu mehr Gehirnverknotungen bereit/fähig ist.
Aber ich bezweifle, dass dein Freund dazu in der Lage ist, schon dieses einfache Beispielprogramm zu knacken. Denn die am lautesten tönenden Hacker sind meistens die schlechtesten. Außer du lässt Debuginformationen im Programm, dann schafft das sogar meine Oma. Da musst du aufpassen.
P.S.: Das Programm braucht die Zufallsgeneratoren aus der C++11-Stanardbibliothek (oder auch schon C++98-TR1(?), dafür müsstest du das Programm leicht anpassen, dann können das dann selbst Compiler mit älteren Standardbibliotheken), da ich mich auf die Implementierung des Zufallsgenerators verlassen können möchte. Man könnte auch einen eigenen Zufallsgenerator nehmen (oder einfach jede andere Funktion, die irgendwie Zahlen zwischen 'A' und 'Z' erzeugt), wenn es streng C++98-konform sein soll.