[Solved] Erstes Crackme für dieses Forum (leicht)

Hallo,
das hier ist mein erster Thread (erstes Crackme für dieses Forum auch) und mein erstes Crackme. Ich habe es mit (Visual) C++ und dem inline Assembler geschrieben. Wenn das Konsolenprogramm die Meldung gibt, eine DLL fehlt, müsst ihr das VCredist-package von MS installieren: Detail Seite Microsoft*Visual*C++*2010 Redistributable Package (x86).

Es darf gepatcht werden, das Crackme ist gelöst, wenn die Meldung kommt, das Passwort ist richtig!

Ich hab noch so gut wie garnichts gecrackt, nur ein paar Assemblerbereiche gelesen, aber ich habe mich bemüht es euch möglichst schwer zu machen 8)
Beißt euch nicht die Zähne aus! :P

Ich wünsche euch viel Spaß!
Mfg
TheShadowAE
 
Zuletzt bearbeitet:
Die Lösung lautet:

PHP:
    char serial[28];
    int counter1 = 1;
    int counter2 = 1;
    char *dest = (char*) malloc (sizeof(char)*2);
    char code[26] = {'\x73', '\x68', '\x56', '\xBB', '\x35', '\xB9', '\x76', '\xF1', '\x68', '\x17', '\xA9', '\x3F', '\xA9', '\x2A', '\x08', '\x78',
                     '\x2F', '\x8E', '\x62', '\x8E', '\x6F', '\xA2', '\xEC', '\xF3', '\x00'};

    for (int i = 0; i < 28; i++)
    {
        if (i % 2 == 0)
        {
            // Code[i] XOR 0x1A
            serial[i] = code[i] ^ '\x1A';

            // Dez2Hex
            sprintf(dest, "%c", counter1);

            // Subtraction
            serial[i] = serial[i] - dest[0];

            // Rotate right
            serial[i] = rol(serial[i], 3);
            counter1++;
        }
        else
        {
            // Dez2Hex
            sprintf(dest, "%c", counter2);

            // Odd serial place constitutes the actual cipher amount
            serial[i] = dest[0];

            // Increase counter
            counter2++;
        }
    }
    
    // Last cipher
    serial[26] = '\xFE' ^ '\x1A';
    serial[26] = serial[26] - ror('\x0d', 3);

    // We need every even sign
    for (int i = 0; i < 27; i=i+2)
    {
        printf("%c", serial[i]);
    }

    return 0;
Das Passwort lautet somit: CRaCkmePasSWhC
 
Wie hast du das jetzt geschafft? :rolleyes:
Und das Passwort was ich einprogrammeirt habe ist eigentlich
CRaCkmePasSW, also ohne die letzten 2 Buchstaben
Da muss ich wohl irgendwo schlampig programmiert haben..

EDIT:
Mein Sourcecode:
Code:
#include <iostream>

using namespace std;

#define PW (unsigned char)0x73,(unsigned char)0x68,(unsigned char)0x56,(unsigned char)0xBB,(unsigned char)0x35,(unsigned char)0xB9,(unsigned char)0x76,(unsigned char)0xF1,(unsigned char)0x68,(unsigned char)0x17,(unsigned char)0xA9,(unsigned char)0x3F,(unsigned char)0xA9,(unsigned char)0x2A,(unsigned char)0x08,(unsigned char)0x78,(unsigned char)0x2F,(unsigned char)0x8E,(unsigned char)0x62,(unsigned char)0x8E,(unsigned char)0x6F,(unsigned char)0xA2,(unsigned char)0xEC,(unsigned char)0xF3,(unsigned char)0
inline void encode(char *str);
void falsch(bool);


int main()
{
	__asm
	{ //repe cmpsb prüfen
		push eax
		push esi
		mov esi,ort
		lodsw
		cmp ax,0xA6F3 //F3=repe :: A6=cmpsb ;; musste wegen little endian getauscht werden
		jne inner
		jmp wwww
		inner:
		pop esi
		pop eax
	}
	falsch(true);
	__asm
	{
		wwww:
		pop esi
		pop eax
	}
	char buff[101]={(unsigned char)0};
	char buf[51]={(unsigned char)0};
	cout << "Passwort: ";
	cin.getline(buf,51,'\n');
	for (unsigned int i=0; i<strlen(buf); i++)
	{
		buff[i*2]=buf[i];
		buff[i*2+1]=i+1;
		buff[(i+1)*2]=(unsigned char)0;
	}
	encode(buff);
	char pw[25]={PW};
	int r=0;
	__asm
	{
		push esi
		push edi
		push ecx
		lea esi,pw[0]
		lea edi,buff[0]
		mov ecx,25
		ort:
		repe cmpsb //wenn ecx=0 oder String stimmt nicht überein: Schleifenabbruch
		or ecx,ecx
		jnz www
		inc r
		www:
	}
	if (r==0) falsch(false);
	cout << "Passwort richtig! Vielen Dank fuer's Cracken :)\nGehen sie bitte nach dem Dreifach-Beep auf meine Homepage: TheShadowAE.ohost.de\a\a\a";
	system ("pause >nul");
	exit(0);
	return 0;
}



void falsch(bool which)
{
	if (which) cout << "Die Datei wurde veraendert!\nDruecke eine beliebige Taste zum beenden!\n";
	else cout << "Das Passwort ist falsch!\nDruecke eine beliebige Taste zum beenden!\n";
	system("pause >nul");
	exit(1);
}

inline void encode(char *str)
{
	int len=strlen(str);
	for (int i=0; i<len; i++)
	{
		char c=str[i];
		__asm
		{
			push ax
			mov al,c
			ror al,3
			mov c,al
			pop ax
		}
		c+=str[i+1];
		if (i==len-1) c+=str[1];
		c^=26;
		str[i]=(c&0xFF);
	}
}
 
Zuletzt bearbeitet:
Sry habe die Woche leider noch sehr viel zu tun. Werde mich am Wochenende hinsetzen und einen ausführlichen Lösungsweg posten. :-)
 
Nicht mehr nötig, ich hab einige Crackmes aus dem Forum gemacht und hab mein eigenes ganz leicht gepatcht. :rolleyes:
Und der Algo ist auch leicht zu verstehen, mein nächstes Crackme ist ald fertig, das wird schwerer, vorallem weil ich jetzt auch ein bsischen Crackerfahrungen gemacht hab;)
 
Zurück
Oben