Algorithmen

Hi Leute,
ich hab da mal eine Frage zu Algorhitmen und zwar zu einem ganz bestimmten und zwar dem hier:
Code:
#include <iostream>
#include <windows.h>

using namespace std;

int main() {
    //Algo funktioniert:
    //unsigned char MyKey[15] = "QNUL0JCT71YZML";
    unsigned char MyKey[15] = "ABCDEFGHJKLOKM"; //Klappt natürlich nicht
    unsigned long int ABC[] = {'\x41','\x42','\x43','\x44','\x45','\x47','\x48','\x49','\x4A','\x4B','\x4C','\x4D','\x4E','\x4F','\x50','\x51','\x52','\x53','\x54','\x55','\x56','\x57','\x58','\x59','\x5A','\x30','\x31','\x32','\x33','\x35','\x37'};
    unsigned long int sEDX=0, sESI=0, sECX=0, loop=0, loop2=0, loop3=0;
    unsigned long int esi=0, eax=0, edi=0, esp=0, ecx=0;

for(loop2 = 0;loop2<14;loop2++) {   //Jeder Buchstabe durchläuft eine Schleife
    for(loop=0;loop<32;loop++) {  //Zaehlt 
            if(MyKey[loop2]==ABC[loop])
                    break;                            
    }
    loop++;
    for(loop3=0;loop3<5;loop3++){     
           //edi ist einzige beeinflußbare Variable
           //ecx ist abhaengig von dem geraden durchlaufenen buchstaben und edi
                 
           edi = loop; //loop ist immer verdoppelt
           loop = loop*2;
           
           ecx = loop2; //ecx nimmt die Buchstaben schleife an
           
           edi >>= 4;
           edi &= 1;           
           edi <<= ecx;
           
           if(loop3==0)
                ecx = sEDX;
           else if(loop3==1)
                ecx = sESI;
           else if(loop3==2)
                ecx = sECX;
                
           ecx |= edi;
           
           if(loop3==0)
                sEDX = ecx;
           else if(loop3==1)
                sESI = ecx;
           else if(loop3==2)
                sECX = ecx;
    }
}   


eax = loop3;
//Vorerst fertig
cout << sESI << " " << sEDX << " " << sECX << endl;
loop2 = sESI; //muss 16183 rauskommen
loop = sEDX; //muss 3989 rauskommen
eax = sECX;  //muss 4358 rauskommen
loop2 &= 16383; //3FFFh 11111111111111b
cout << loop2 << " " << eax << endl;
loop <<= 14;
loop2 |= loop; //loop2 und loop werden aneinander gehaengt
cout << loop2 << " " << eax << endl;
eax >>= 10;
loop2 <<= 4; //100b
cout << loop2 << " " << eax << endl;
eax &= 15; //1111b
loop2 |= eax; // hier muss ne zahl mit nur 1 stehen
cout << loop2 << " " << eax << endl;
if(loop2==1045951396)
   cout << "Valid Key" << endl;
else
   cout << "Nein:" << loop2 << endl;


    system("PAUSE");
    return 0;   
}

Nun meine Frage: ist es möglich diesen Algo zu lösen? Ich habe schon einen funktionierenden Key, aber kann ich mit Hilfe von diesem den Algorhitmus zurückverfolgen?

EDIT: Wer keine große Lust hat sich den Code groß anzuschauen: Im Endeffekt läuft es bei diesem Algorhitmus daraus hinaus das der Eingabestring mit 14 Buchstaben und Zahlen in eine Zahl umgerechnet wird und diese dann mit 1045951396 verglichen wird. Das Prinzip ist ähnlich einer Einwegverschlüssellung, deswegen habe ich ja bedenken, ob man es schafft dazu einen KeyGenerator zuschreiben.

Vielen Dank im voraus!

Gruß craven
 
Warum keygen wenn man ne HardCoded Serial hat LOL Einmal auslesen und ich habe mein key 1045951396..... X(
 
Großer Denkfehler: 1045951396 gilt hier wie ein Hashwert,d.h. er ist der Wert den dein Key haben soll, wenn er umgerechnet wurde. Natürlich kann man hier einfach die letzte Abfrage patchen sprich aus if(loop2==1045951396), if(loop2==loop2) machen, das ganze ist aber nicht der Sinn der Sache. Ich möchte nämlich wissen, ob man an Hand von diesem Algorithmus einen Keygen schreiben kann. Achja dein Key sollte mindestens 14 Stellen haben.

gruß craven
 
Der Decompilercode ist ja grauenhaft - Asm wäre in dem Fall deutlich klarer ;) . Die Assemblyausgabe müsste man dann zusammenfassen (z.B Pseudocode) und analysieren.
 
Ja war auch eigentlich früher mal Assembler, wie vielleicht unschwer zu erkennen ist ;). Hab das ganze in C++ umgeschrieben, weil es für mich so verständlicher ist. Mir geht es auch nur darum ob ich weiß ob ich da eine Chance habe oder nicht, wobei mir solangsam dämmert, dass ich da nix machen kann weil der Algo einer Einwegverschlüsselung gleicht.

EDIT: hier als Assembler Code, wobei ich finde dass der c++ Code trotzdem verständlicher ist ;)
Code:
009A0670     33F6                XOR ESI,ESI                                               ; LOSGEHTS ESI == 0
009A0672     0FBE5434 10         MOVSX EDX,BYTE PTR SS:[ESP+ESI+10]                        ; TOUPPER SCHLEIFE
009A0677     52                  PUSH EDX                                                  ; BUCHSTABE WIRD ÜBERGEBEN
009A0678     FF15 A0E0A300       CALL DWORD PTR DS:[<&MSVCRT.toupper>]                     ; msvcrt.toupper
009A067E     83C4 04             ADD ESP,4                                                 
009A0681     33D2                XOR EDX,EDX
009A0683     0FBE8A 28D5A400     MOVSX ECX,BYTE PTR DS:[EDX+A4D528]
009A068A     3BC1                CMP EAX,ECX                                               ; GEHT DAS ALPHABET DURCH
009A068C     74 08               JE SHORT womble.009A0696
009A068E     42                  INC EDX
009A068F     83FA 20             CMP EDX,20
009A0692   ^ 7C EF               JL SHORT womble.009A0683
009A0694     33D2                XOR EDX,EDX
009A0696     33C0                XOR EAX,EAX
009A0698     8BFA                MOV EDI,EDX                                               ; EDI=0
009A069A     8BCE                MOV ECX,ESI                                               ; ECX WIRD GESETZTESI IST DER COUNTER ZWISCHEN 1 und E
009A069C     C1FF 04             SAR EDI,4                                                 ; EDI 0!!
009A069F     83E7 01             AND EDI,1
009A06A2     03D2                ADD EDX,EDX                                               ; EDX MAL 2
009A06A4     D3E7                SHL EDI,CL                                                ; EDI NULL
009A06A6     8B4C84 20           MOV ECX,DWORD PTR SS:[ESP+EAX*4+20]                       ; ECX WIRD GESETZT
009A06AA     0BCF                OR ECX,EDI
009A06AC     894C84 20           MOV DWORD PTR SS:[ESP+EAX*4+20],ECX                       ; ECX, EAX ZWISCHEN 0 UND 4
009A06B0     40                  INC EAX
009A06B1     83F8 05             CMP EAX,5
009A06B4   ^ 7C E2               JL SHORT womble.009A0698                                  ; EAX WIRD BIS 5 GEZAEHLT
009A06B6     46                  INC ESI
009A06B7     83FE 0E             CMP ESI,0E                                                ; ABgleich mit der String Laenge
009A06BA   ^ 7C B6               JL SHORT womble.009A0672
009A06BC     8B7424 24           MOV ESI,DWORD PTR SS:[ESP+24]                             ; ESI WIRD GESETZT
009A06C0     8B5424 20           MOV EDX,DWORD PTR SS:[ESP+20]                             ; EDX WIRD GESETZT
009A06C4     8B4C24 28           MOV ECX,DWORD PTR SS:[ESP+28]                             ; ECX WIRD GESETZT
009A06C8     81E6 FF3F0000       AND ESI,3FFF                                              ; AND 3FFF(16383d) S: AENDERT NIX
009A06CE     C1E2 0E             SHL EDX,0E                                                ; DA 0 NIX
009A06D1     8BC1                MOV EAX,ECX                                               ; ECX=EAX
009A06D3     0BF2                OR ESI,EDX                                                ; NIX
009A06D5     C1F8 0A             SAR EAX,0A                                                ; 10 Bits nach Rechts Aus 30F0 wird 10
009A06D8     C1E6 04             SHL ESI,4                                                 ; Mal 2 hoch 4(16d)
009A06DB     83E0 0F             AND EAX,0F                                                ; Wird mit 16 AND
009A06DE     BA 20D5A400         MOV EDX,womble.00A4D520
009A06E3     0BF0                OR ESI,EAX                                                ; ESI GROSS EAX KLEIN(10)
009A0705     B9 A4F3573E         MOV ECX,3E57F3A4                                          ; VERGLEICH NOCHMAL
009A070A     3BF1                CMP ESI,ECX
009A070C     74 3F               JE SHORT womble.009A074D
 
Zurück
Oben