• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[C++] Speicherbedarf steigt ins endlose??

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....???
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;
}
 
Danke für die schnelle Antwort :)

Dass es die for-Schleife ist, dürfte klar sein :)
Der +=-Operator pumpt zwar schon, doch am Anfang jedes Durchlaufs wird ja
Code:
        ret = "";
Sodass der Speicher wieder frei gegeben wird...Oder ned? Mhm... Vielleicht ned, ich schau mal was passiert wenn ich den Speicher dynamisch allokiere und statt = ""; einfach den Speicher freigebe.

Hier kann man sich das Teil mal anschaun.
 
Nur der Vollständigkeit zuliebe: Bug gefixed...

Die Ursache war ein Memory Leak, aber nicht verursacht durch meinen Code sondern durch die Implementation des MD5-Algorithmus von RSA Security... *grml*, auf das muss man erst mal kommen :)
Naja, hab das Leck geflickt und jetzt funzt, Speicherbedarf steigt während dem Entschlüsselungsvorgang nicht über 2 MB (auf meinem Rechner).

Naja, danke trotzdem die Powerslave,

eua jeko
 
Zurück
Oben