Loading ...
Sorry, an error occurred while loading the content.

Re: [RoCrack] Rocrackers

Expand Messages
  • Ix
    ideal ar fi sa ai licenta si din greseala ai formatat memory stick-ul [Un alt inceput] - start AspackDie 1.41 si facut un dump. cum dump-ul poate sa difere,
    Message 1 of 8 , Mar 6, 2009
    • 0 Attachment
      ideal ar fi sa ai licenta si din greseala ai formatat memory stick-ul

      [Un alt inceput]
      - start AspackDie 1.41 si facut un dump. cum dump-ul poate sa difere, adresele specificate mai jos nu sunt neaparat aceleasi (daca voi face referire la dll-uri)
      - pornit programul, avem mare un label care scrie "Acest program NU este licentiat"
      - dezasamblat dump-ul cu IDA, cautat (alt+t) dupa "program NU" si ajungem la 005505C2
      - analizam codul anterior si incercam sa intelegem ce se intampla. deducem ca cele trei call-uri de mai sus la 004DDAC4 citesc valoarea unor parametrii dati prin nume, care sunt apoi verificate
      - cum codul de la adresa respectiva pare o cautare in mapa avem de ales fie 1. sa vedem cand se face insert cu valori (inainte de primul call de exemplu se face pe topic Inregistrare field NumeClient), fie 2. sa adaugam cod care in functie de parametrii primiti sa returneze selectiv "ca si cum" licenta e buna sau 3. (cel mai urat posibil) sa modificam jump-urile conditionale de dupa apelurile rutinei
      - incercam sa aflam unde se seteaza respectivele valori si cautam dupa "Inregistrare" in dump, folosit in alt context decat ca apel la functia de citire. prima locatie care satisface conditiile este la 0051874E dupa care avem un call catre 004DE1FC. ne uitam prin cod si observam ca inainte de apelurile astea se face o referire la "dic.reg", probabil fisierul din care se citesc datele de licenta
      - dorim sa construim un fisier dummy data/dic.reg. dupa cum vedem dic.ini este criptat, deci ne asteptam ca si datele de inregistrare sa fie la fel.
      - cautam dupa "dic.reg" in codul dezasamblat sa vedem unde se face aceasta decodare. referinta de la 004DE367 unde aterizam ne da un prim candidat in call-urile catre 00406B9C sau 004DE1FC, apelate atat pentru dic.reg cat si pentru dic.ini (se vede asta in codul in care tocmai am ajuns)
      - functia de la 00406B9C e prea scurta si la 004DE1FC gasim un string ".tmp" care ar trebui sa ne puna pe ganduri, asa ca insistam aici. descoperim call-ul de la 004DE2A4 care pare a face citirea fisierului si decriptarea, asa ca punem un breakpoint aici si facem o rulare din IDA. cand intram in breakpoint punem unul si pe ReadFile, continue si aterizam in breakpoint. luam din callstack la rand adresele si citim codul
      - gasim in body la 004DD240 loop-ul de citire a fisierului (byte cu byte) la 004DD377-004DD3A2, cu rezultatul obtinut in edx urmat de call la 004DD214, care pare a fi functia de decriptare, dupa apelare facandu-se salvarea rezultatului cu un mov [eax+ebx-1], dl
      - pentru a verifica teoria, punem un breakpoint la 004DD39C, retinem valoarea lui eax, iesim din loop (la 004DD3A4) si ne uitam ce avem la adresa salvata. intr-adevar avem doar litere (altele decat la intrare) dar in continuare nu au sens. deci mai exista o decriptare (poate dezarhivare, un ROT sau cine stie)
      - trecem peste call-ul imediat urmator (de la 004DD3FF) si verificam rezultatul. de data asta suntem mai norocosi, in ebx setat de la 004DD40E avem ceva gen "Comun|interfata|0^Comun|nr_inreg_usr|0 etc. deci sectiune|parametru|valoare cu delimitator ^ (si in unicode). in codul ce urmeaza din functia curenta probabil se seteaza aceste variabile in mapa noastra
      - din lipsa de timp voi aborda o varianta de rezolvare rapida insa neeleganta: vom sari peste partea de decodare pentru a putea seta aceste variabile in clar. alternativele ar fi fost: gasit algoritmul de criptare (cu un break la WriteFile, cand se scrie fisierul de configurare criptat) sau alterate valorile dinamic (un jump undeva unde este spatiu, fiind dump e plin de garbage, verificat daca suntem apelati pentru dic.reg, adaugat parametrii doriti de noi, apoi restore de context si jump inapoi)
      - pentru a nu se mai face decriptarea mergem la loop-ul gasit anterior si modificam la 004DD38D in loc de call punem un "mov eax, edx; nop; nop; nop" si facem disable si la dezarhivare, modificand "mov edx,1; call 000406F6C" de la 004DD3FA in mov [ebp][-08],edx urmat de nop-uri in loc de call
      - revenim la functia de verificare depistata de noi anterior, 004DDAC4, punem un breakpoint si urmarim toti parametrii pentru care se cere pentru topicul Inregistrare. gasim a fi PRO, NumeClient si garantie
      - ne codificam variabilele dorite de noi, adica Inregistrare|PRO|1^Inregistrare|NumeClient|x^Inregistrare|garantie|1 si le scriem in clar in fisierul nou creat de noi data/dic.reg
      - pornim programul si ne scrie "Acest program a fost cumparat de x, Cod Program: 1", totusi cand apasam dictionar ne scrie ca nu e inregistrat.
      - revenim la o rulare din IDA, cu breakpoint in 004DDAC4. similar, de fiecare data cand se opreste in breakpoint pentru topic Inregistrare (vizibil in edx), ne uitam pentru ce parametru (in ecx). vedem ca se face un check si pentru Inregistrare|ENG (verificand memoria de la ecx aflam de fapt de mai multe posibile teste: ENG, DEU, FRA, HUN, ESP, RUS, ITA, INR, PRO)
      - incercam o noua rulare: in continuare zice neinregistrat. revenim deci la IDA in debug si din breakpointul unde se cere Inregistrare|ENG (din 004DDAC4) continuam rularea pas cu pas urmarind ce teste suplimentare se fac.
      - ajungem in 00552AA8 apelat din 0053AFF3, unde (se pare ca) se fac niste teste legate de formatul numarului de garantie si in functie de rezultat se merge pe ramura demonstrativ sau nu. ce trebuie sa facem e sa setam intotdeauna al pe 1 la iesirea din functie, mai precis la 00552DCB punem mov ax, 1
      - continuam step-by-step in functia de la 0053AFF3 (inca precauti legat de alte verificari care fac sa mearga pe traseul nedorit), si gasim un "dar NU ruleaz" la 0053B1FC. fiind un NU cu litere mari si traseul pe care o ia codul, decidem ca ar fi bine sa sarim si aceasta verificare.
      - analizam putin codul si ajungem la concluzia ca cel mai usor e sa modificam "sete [eax]" in "setne [eax]" la 0053B145
      - rulam din nou si, desi dupa deschiderea dictionarului avem un mesaj cu "dar NU ruleaza de pe memoria USB originala", totul pare sa mearga bine

      dezavantaj: setarile nu se vor mai citi din fisier. cu putin efort poti face ca sa nu se decripteze/dezarhiveze decat dic.reg, dic.ini sa fie tratat normal. sau sa construiesti un dic.reg convenabil folosind functia de criptare din program (cu breakpoint pe WriteFile am aflat ca ar fi la 004DD214).
      in forma prezentata aici exita sanse sa fie si alte efecte secundare datorita modului in care am sarit peste decriptare, dar nu este scopul meu sa iti fac un crack complet ci doar sa-ti arat cum s-ar putea face.


      --- On Sun, 2/22/09, Prenumele Numele <prenumele_numele@...> wrote:

      > From: Prenumele Numele <prenumele_numele@...>
      > Subject: [RoCrack] Rocrackers
      > To: rocrack@yahoogroups.com
      > Date: Sunday, February 22, 2009, 8:45 PM
      > ia gasiti fratilor un medicament pentru
      > ...
      > respecte,
      > Nick
    • Ix
      ideal ar fi sa ai licenta si din greseala ai formatat memory stick-ul [Un alt inceput] - start AspackDie 1.41 si facut un dump. cum dump-ul poate sa difere,
      Message 2 of 8 , Mar 6, 2009
      • 0 Attachment
        ideal ar fi sa ai licenta si din greseala ai formatat memory stick-ul

        [Un alt inceput]
        - start AspackDie 1.41 si facut un dump. cum dump-ul poate sa difere, adresele specificate mai jos nu sunt neaparat aceleasi (daca voi face referire la dll-uri)
        - pornit programul, avem mare un label care scrie "Acest program NU este licentiat"
        - dezasamblat dump-ul cu IDA, cautat (alt+t) dupa "program NU" si ajungem la 005505C2
        - analizam codul anterior si incercam sa intelegem ce se intampla. deducem ca cele trei call-uri de mai sus la 004DDAC4 citesc valoarea unor parametrii dati prin nume, care sunt apoi verificate
        - cum codul de la adresa respectiva pare o cautare in mapa avem de ales fie 1. sa vedem cand se face insert cu valori (inainte de primul call de exemplu se face pe topic Inregistrare field NumeClient), fie 2. sa adaugam cod care in functie de parametrii primiti sa returneze selectiv "ca si cum" licenta e buna sau 3. (cel mai urat posibil) sa modificam jump-urile conditionale de dupa apelurile rutinei
        - incercam sa aflam unde se seteaza respectivele valori si cautam dupa "Inregistrare" in dump, folosit in alt context decat ca apel la functia de citire. prima locatie care satisface conditiile este la 0051874E dupa care avem un call catre 004DE1FC. ne uitam prin cod si observam ca inainte de apelurile astea se face o referire la "dic.reg", probabil fisierul din care se citesc datele de licenta
        - dorim sa construim un fisier dummy data/dic.reg. dupa cum vedem dic.ini este criptat, deci ne asteptam ca si datele de inregistrare sa fie la fel.
        - cautam dupa "dic.reg" in codul dezasamblat sa vedem unde se face aceasta decodare. referinta de la 004DE367 unde aterizam ne da un prim candidat in call-urile catre 00406B9C sau 004DE1FC, apelate atat pentru dic.reg cat si pentru dic.ini (se vede asta in codul in care tocmai am ajuns)
        - functia de la 00406B9C e prea scurta si la 004DE1FC gasim un string ".tmp" care ar trebui sa ne puna pe ganduri, asa ca insistam aici. descoperim call-ul de la 004DE2A4 care pare a face citirea fisierului si decriptarea, asa ca punem un breakpoint aici si facem o rulare din IDA. cand intram in breakpoint punem unul si pe ReadFile, continue si aterizam in breakpoint. luam din callstack la rand adresele si citim codul
        - gasim in body la 004DD240 loop-ul de citire a fisierului (byte cu byte) la 004DD377-004DD3A2, cu rezultatul obtinut in edx urmat de call la 004DD214, care pare a fi functia de decriptare, dupa apelare facandu-se salvarea rezultatului cu un mov [eax+ebx-1], dl
        - pentru a verifica teoria, punem un breakpoint la 004DD39C, retinem valoarea lui eax, iesim din loop (la 004DD3A4) si ne uitam ce avem la adresa salvata. intr-adevar avem doar litere (altele decat la intrare) dar in continuare nu au sens. deci mai exista o decriptare (poate dezarhivare, un ROT sau cine stie)
        - trecem peste call-ul imediat urmator (de la 004DD3FF) si verificam rezultatul. de data asta suntem mai norocosi, in ebx setat de la 004DD40E avem ceva gen "Comun|interfata|0^Comun|nr_inreg_usr|0 etc. deci sectiune|parametru|valoare cu delimitator ^ (si in unicode). in codul ce urmeaza din functia curenta probabil se seteaza aceste variabile in mapa noastra
        - din lipsa de timp voi aborda o varianta de rezolvare rapida insa neeleganta: vom sari peste partea de decodare pentru a putea seta aceste variabile in clar. alternativele ar fi fost: gasit algoritmul de criptare (cu un break la WriteFile, cand se scrie fisierul de configurare criptat) sau alterate valorile dinamic (un jump undeva unde este spatiu, fiind dump e plin de garbage, verificat daca suntem apelati pentru dic.reg, adaugat parametrii doriti de noi, apoi restore de context si jump inapoi)
        - pentru a nu se mai face decriptarea mergem la loop-ul gasit anterior si modificam la 004DD38D in loc de call punem un "mov eax, edx; nop; nop; nop" si facem disable si la dezarhivare, modificand "mov edx,1; call 000406F6C" de la 004DD3FA in mov [ebp][-08],edx urmat de nop-uri in loc de call
        - revenim la functia de verificare depistata de noi anterior, 004DDAC4, punem un breakpoint si urmarim toti parametrii pentru care se cere pentru topicul Inregistrare. gasim a fi PRO, NumeClient si garantie
        - ne codificam variabilele dorite de noi, adica Inregistrare|PRO|1^Inregistrare|NumeClient|x^Inregistrare|garantie|1 si le scriem in clar in fisierul nou creat de noi data/dic.reg
        - pornim programul si ne scrie "Acest program a fost cumparat de x, Cod Program: 1", totusi cand apasam dictionar ne scrie ca nu e inregistrat.
        - revenim la o rulare din IDA, cu breakpoint in 004DDAC4. similar, de fiecare data cand se opreste in breakpoint pentru topic Inregistrare (vizibil in edx), ne uitam pentru ce parametru (in ecx). vedem ca se face un check si pentru Inregistrare|ENG (verificand memoria de la ecx aflam de fapt de mai multe posibile teste: ENG, DEU, FRA, HUN, ESP, RUS, ITA, INR, PRO)
        - incercam o noua rulare: in continuare zice neinregistrat. revenim deci la IDA in debug si din breakpointul unde se cere Inregistrare|ENG (din 004DDAC4) continuam rularea pas cu pas urmarind ce teste suplimentare se fac.
        - ajungem in 00552AA8 apelat din 0053AFF3, unde (se pare ca) se fac niste teste legate de formatul numarului de garantie si in functie de rezultat se merge pe ramura demonstrativ sau nu. ce trebuie sa facem e sa setam intotdeauna al pe 1 la iesirea din functie, mai precis la 00552DCB punem mov ax, 1
        - continuam step-by-step in functia de la 0053AFF3 (inca precauti legat de alte verificari care fac sa mearga pe traseul nedorit), si gasim un "dar NU ruleaz" la 0053B1FC. fiind un NU cu litere mari si traseul pe care o ia codul, decidem ca ar fi bine sa sarim si aceasta verificare.
        - analizam putin codul si ajungem la concluzia ca cel mai usor e sa modificam "sete [eax]" in "setne [eax]" la 0053B145
        - rulam din nou si, desi dupa deschiderea dictionarului avem un mesaj cu "dar NU ruleaza de pe memoria USB originala", totul pare sa mearga bine

        dezavantaj: setarile nu se vor mai citi din fisier. cu putin efort poti face ca sa nu se decripteze/dezarhiveze decat dic.reg, dic.ini sa fie tratat normal. sau sa construiesti un dic.reg convenabil folosind functia de criptare din program (cu breakpoint pe WriteFile am aflat ca ar fi la 004DD214).
        in forma prezentata aici exita sanse sa fie si alte efecte secundare datorita modului in care am sarit peste decriptare, dar nu este scopul meu sa iti fac un crack complet ci doar sa-ti arat cum s-ar putea face.


        --- On Sun, 2/22/09, Prenumele Numele <prenumele_numele@...> wrote:

        > From: Prenumele Numele <prenumele_numele@...>
        > Subject: [RoCrack] Rocrackers
        > To: rocrack@yahoogroups.com
        > Date: Sunday, February 22, 2009, 8:45 PM
        > ia gasiti fratilor un medicament pentru
        > ...
        > respecte,
        > Nick
      Your message has been successfully submitted and would be delivered to recipients shortly.