jeko
Lounge-Member
Hi Leute,
wieder mal ne C++-Frage
Nach dem starten der Funktion MD5decrypt() schiesst der Speicher ziemlich schnell nach oben, das heisst von 0 auf bis zu 160000 KB RAM bis dann ausgelagert wird, was ich aber echt nicht versteh...?
Schaut euch mal die Funktion an, ist da irgendwas das laufend neuen Speicher belegt? Ich erstelle ja keine Variablen oder so, oder fülle Felder etc....???
wieder mal ne C++-Frage
Nach dem starten der Funktion MD5decrypt() schiesst der Speicher ziemlich schnell nach oben, das heisst von 0 auf bis zu 160000 KB RAM bis dann ausgelagert wird, was ich aber echt nicht versteh...?
Schaut euch mal die Funktion an, ist da irgendwas das laufend neuen Speicher belegt? Ich erstelle ja keine Variablen oder so, oder fülle Felder etc....???
PHP:
#include <iostream>
#include <string>
#include <stdlib.h>
#include <math.h>
#include <sstream>
#include <time.h>
#include <windows.h>
#include "md5.cpp"
using namespace std;
void cppDoEvents() {
// VB-pendant zu DoEvents (gibt Steuerung an OS zurück)
MSG Msg;
while(PeekMessage(&Msg,NULL,0,0,PM_REMOVE)) {
if (Msg.message == WM_QUIT)break;
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
string itos (int num) {
// Wandelt einen Integer in einen String um
stringstream ts;
ts << num; // Schicke Integer an Stream
return ts.str();
}
string formTime(int sek) {
// Formatiert Sekunden t ins Format hh:mm:ss
int min = 0;
int std = 0;
if (sek / 60 > 0) {
min = sek/60;
sek /= 60;
}
if (min / 60 > 0) {
std = min/60;
min /= 60;
}
return "" + ((std < 10)? "0" + itos(std) : itos(std)) + ":"
"" + ((min < 10)? "0" + itos(min) : itos(min)) + ":"
"" + ((sek < 10)? "0" + itos(sek) : itos(sek));
}
string Givepool (char *eingabe) {
// Gibt Pool(Vorrat) von Zeichen zurück, basierend auf der Usereingabe
string az_klein = "abcdefghijklmnopqrstuvwxyz"; // az Länge: 26 + 1
string az_gross = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // AZ Länge: 26 + 1
string az_numbers = "0123456789"; // 09 Länge: 10 + 1
string ascii = "ASCII";
string ret = "";
string streingabe = eingabe;
if (streingabe.find("az",0) != string::npos) {
ret += az_klein;
}
if (streingabe.find("AZ",0) != string::npos) {
ret += az_gross;
}
if (streingabe.find("09",0) != string::npos) {
ret += az_numbers;
}
if (streingabe == "ascii" || eingabe == "ASCII") {
ret = "ASCII";
}
return ret;
}
string MD5decrypt(char *hash, char *laenge, char *zeichen) {
// Entschlüsselt den MD5-Hash hash und gibt das Ergebnis zurück
// Beginn der Operationen
// Umwandlung der Usereingabe zu einem verwendbaren Zeichenvorrat-String
string npool = Givepool(zeichen);
string ret = ""; // Aktueller Wert des generierten Strings und Rückgabevariable
string::size_type len = npool.length(); // Grösse des Pools
char* cs; // Wichtig um ret zu einem C-String für die MD5String()-Funktion umwzuwandeln
float zaehler = 0; // Hauptzaehler
float temp = 0,; // Tempvariable für innere Schleife des Algorithmus
float total = pow(float(len),atoi(laenge)); // Anzahl Möglichkeiten: Grösse des Pools ^ (Länge des Textes)
time_t zeit;
time(&zeit);
cout << "\n\tZaehler initialisiert: " << total << " Moeglichkeiten";
if (npool == "") {
return "\nFehler beim initialisieren des Zeichenvorrats: Ungueltige Bereichsangabe.\n"
"Gueltige Werte: AZ az 09 ASCII\n";
}
cout << "\n\tZeichenvorrat initialisiert: " << npool;
cout << "\n\n\tVorgang begonnen... Abbrechen mit Ctrl+Break bzw. Strg+Pause.";
// Beginn Algorithmus
for (zaehler = 0; zaehler <= total; zaehler++) {
ret = "";
temp = zaehler;
do {
ret += npool[(long(temp) % int(len))];
temp = temp / len;
} while (floor((temp / int(len))) > 0);
cs = const_cast < char* > (ret.c_str()); // Umwandlung zu MD5String()-freundlichem C-String
if (strcmp(MD5String(cs),hash) == 0) { // Hashvergleiche
return "\n"
"\n\tErgebnis:"
"\n\t*********"
"\n\t" + string(hash) + "\t" + ret + ""
"\n\tZeit: " + formTime(int((time(NULL) - zeit)));
}
cppDoEvents();
}
ret = "";
cout << "\nEs ist ein Fehler aufgetreten: Hash konnte nicht entschluesselt werden.\n"
"Dieser Fehler tritt haeufig auf wenn die Laenge des entschluesselten Texts zu tief"
"gewaehlt (>" << len << ") wurde oder der entschluesselte Text Zeichen ausserhalb des angegebenen"
"Zeichenbereichs (" << zeichen << ") enthaelt.\n";
return ret;
}
string MD5encrypt(char *text) {
// Gibt MD5-Hash von text zurück
string ret = MD5String(text);
return ret;
}
int main(int argc, char *argv[]) // decrypter ( -e | -d <laenge> <zeichen> ) <text>
{
string result = "";
switch (argc) {
case 5:
if (strcmp(argv[1],"-d") == 0) {
cout << "\n\tEntschluesseln:";
cout << "\n\t***************";
cout << "\n\t" << argv[4] << "\n\t";
result = MD5decrypt(argv[4], argv[2], argv[3]);
cout << result;
break;
}
case 3:
if (strcmp(argv[1],"-e") == 0) {
cout << "\n\tVerschluesseln:";
cout << "\n\t***************";
cout << "\n\t" << argv[2] << "\n\t" ;
result = MD5encrypt(argv[2]);
cout << result;
break;
}
default :
cout << "\nEntschluesselt MD5-Hashes mit der Brute-Force Methodik.\n";
cout << "\nSyntax:\t\tdecrypter ( -e | -d <laenge> <zeichen> ) <text>\n";
cout << "\nModi:\t-e\tGeneriert MD5-Hash von <text>.";
cout << "\n\t-d\tEntschluesselt den MD5-Hash <text> mit der"
"\n\t\tmaximalen Laenge <laenge> und den moeglichen Zeichen"
"\n\t\t<zeichen>.";
cout << "\nWerte:";
cout << "\tlaenge\tGanzzahlige Zahl die die maximale Laenge des\n\t\t"
"entschluesselten Texts angibt.\n\t\t"
"Moegliche Werte: Alle ganzen Zahlen.";
cout << "\n\tzeichen\tZeichen, aus denen der entschluesselte Text\n\t\t"
"Text besteht.\n\t\t"
"Moegliche Werte: 'AZ' fuer A-Z, 'az' fuer a-z, '09' fuer 0-9\n\t\t"
"'ASCII' fuer alle ASCII-Zeichen; Werte koennen kombiniert"
"\n\t\twerden.";
cout << "\n\ttext\tBei -d muss <text> ein gueltiger MD5-Hash sein.\n";
cout << "Beispiele:\tdecrypter -e test";
cout << "\n\t\tdecrypter -d 10 az09 098f6bcd4621d373cade4e832627b4f6";
cout << "\n\t\tdecrypter -d 10 ASCII 098f6bcd4621d373cade4e832627b4f6";
break;
}
cout << "\n\nCopyright by Dominique Sandoz\n";
system("PAUSE");
return EXIT_SUCCESS;
}