Jump to content
M2G

[Java] Mini tutorial cracking by M2G (register bypass la facebook friend adder pro)

Recommended Posts

Posted (edited)

Facebook friend adder pro registration bypass.

Autor: M2G @ Romanian Security Team

Data: 12. 01. 2013

In acest tutorial va voi prezenta un mod de a trece de verificarea de username si parola pentru programul facebook friend adder pro.

Inainte de a incepe vreau sa precizez ca aceasta metoda este una destul de simpla si ca sunt sanse sa nu mearga pentru produse software carora li s-a acordat mai multa atentie in ceea ce priveste capitolul securitate.

ehaxx0.png

O descriere a programului cum apare pe site-ul lor:

Facebook is a fast growing social network in which you can receive updates of information around the world in seconds. It has over 850 million members and is growing rapidly each day. Facebook FriendAdder Pro (FFAP) helps you reach out to people for personal and business purposes.

FFAP is the most professional facebook automation tool. It is the dream of facebook marketers who make full use of it will probably benefit a lot. It is an all in one automation marketing tool for facebook marketers. FFAP has more than 20+ features, from mass friend requests to mass wall posts, the ability to fill profile's information, upload profile pictures, find targeted friends, like/share/comment/post wall update and suggest events to friends, our software has the features available to allow you to place your marketing efforts on autopilot. Facebook FriendAdder Pro can spare no effort to help you to achieve your success.

Ce-i de la lively ofera o versiune trial, care limiteaza accesul la 3 rulari ale aplicatiei.

Pentru aceasta demonstratie am folosit varianta trial pentru windows: Facebook FriendAdder Pro Download - Lively 24*7 Service

f0bti0.png

Nota 1:

Userul pentru acest program este de forma: 650XXX iar parola de forma: UmNJOkVhB0iJ+jxAeiWocRZ6Lpg5ck6TP3gA9mgGDEFzAc7aORyKwGf1vHblq4AAPsC1bMzK+j0fegZTLR4g9A==

Asa ca o sa incercam sa facem register cu:

ID: 650XXX (unde xxx sunt numere, sau litere)

Pass: UmNJOkVhB0iJ+jxAeiWocRZ6Lpg5ck6TP3gA9mgGDEFzAc7aORyKwGf1vHblq4AAPsC1bMzK+j0fegZTLR4g9A== (orice string de forma asta va merge pentru register)

Dupa cum se vede, inregistrarea a esuat.

2py5ir8.png

Primul lucru pe care il facem este sa extragem arhiva si sa exploram structuda fisierelor si directoarelor.

Putem deduce usor ca aplicatia este scrisa in java si este folosit un launcher pentru a crea un executabil care sa lanseze aplicatia in executie.

Cu alte cuvinte, toata logica aplicatiei este incapsulata in fisierele .jar.

Vom folosii jd-gui pentru a incerca sa decompilam fisierele .class din arhiva .jar.

Despre fisierele jar: JAR (file format) - Wikipedia, the free encyclopedia

Despre fisierele .class: Java class file - Wikipedia, the free encyclopedia

Deschidem unul din fisierele .jar cu ajutorul jd-gui si surpriza: avem acces la tot codul sursa si mai ales neobfuscat al programului.

De aici incepem sa cautam clasele si metodele care sunt resposabile pentru determinarea unui register valid in sistem.

Dupa ceva cautari ajungem la fisierul com.lively.browser_6.0.0.201212262126.jar

Navigand prin pachete ajunge la clasa Preference din com.lively.browser.preference unde gasim niste metode care par sa contina ceva logica prin care se face autentificarea.

ruaaz6.png

Navigand prin aceasta clasa gasim 2 metode (isValidMemeber si verify) care aparent se ocupa cu inregistrarea si validarea userilor.

public static boolean isValidMember(int member, String id, String sn)
{
switch (member) {
case 0:
return true;
case 1:
return verify(id, sn);
case 2:
return (verify(id, sn)) && (id.length() <= 4);
case 3:
return (verify(id, sn)) && (id.length() <= 3);
}
return false;
}

public static boolean verify(String id, String sn)
{
try
{
if ((id == null) || (id.equals("")) || (sn == null) || (sn.equals(""))) {
return false;
}
id = id.trim();
sn = sn.trim();
Signature sig = Signature.getInstance("SHA1withRSA");
sig.initVerify(getPublicKey());
sig.update(id.getBytes("UTF8"));
boolean result = sig.verify(Base64.decodeBase64(sn.getBytes("UTF8")));
if (result) {
getInstance().idDecryptCipherMap.put(id, getDecryptCipher(sn));
}
if ((result) && (
((Integer.parseInt(id) >= 650000) && (Integer.parseInt(id) <= 650073)) || (
(Integer.parseInt(id) >= 659990) && (Integer.parseInt(id) <= 659999)))) {
String mac = MacAddr.getMacAddr();
result = mac.equals(getLicenseMac(id));
}
return result; } catch (Exception localException) {
}
return false;
}

Primul lucru pe care il observam este ca aceste clase returneaza o valoare booleana. De aici putem sa deducem ca daca am forta cumva una din aceste metode sa returneze true de fiecare data, problema noastra cu inregistrarea ar disparea si am putea sa facem bypass la acel register.

Codul sursa pe care il vedem in jd-gui este defapt codul decompilat din fisierele .class din acea arhiva .jar.

Nu putem sa modificam metoda direct in jd-gui si sa speram ca in felul acesta o sa reusim.

Pentru a face asta ne vom folosii de Eclipse. Eclipse classic este perfect pentru ce avem noi nevoie.

Il descarcam si il rulam.

In eclipse vom crea un nou proiect java.

File -> new -> Java Project

2uegnjr.png

Ii dam proiectului un nume, nu conteaza ce nume. Pentru acest demo am ales: "ffap_RST_demo"

Apasam finish si putem sa observam ca proiectul a fost creat.

Din jd-gui avem optiunea sa salvam toate fisierele deschise ca si cod sursa.

Deci o sa alegem File -> Save all sources avand incarcat in prealabil jar-ul com.lively.browser_6.0.0.201212262126.jar

Dezarhivam fisierul .zip cu sursele, creat te catre jd-gui.

Acum trebuie sa tragem cu drag & drop folderul com peste folderul src din eclipse pentru a incarca sursele decompilate in proiectul nostru din eclipse.

Daca apare un dialog alegeti copy files and folders si apasati ok.

168sao4.png

Deschidem in editor clasa care ne intereseaza si observam ca avem foarte multe erori.

Aceste erori sunt din cauza ca exista dependente intre clasele pe care le-am decompilat si incarcat si celelalte clase din celelalte fisiere .jar.

Nu o sa putem modifica si compila fisierul atat timp cat acesta are erori asa ca aceste dependente trebuie rezolvate.

Pentru a face asta dam click dreapta pe proiectul java din eclipse si alegem properties.

Alegem din panoul din stanga "Java build path" iar in dreapta selectam tabul Libraries

Aici apasam pe "Add external jars" si selectam toate celelalte fisiere .jar din directorul programului.

20qgw8h.png

Observam ca o mare parte din erori s-au rezolvat si am mai ramas cu o singura eroare la un import:

import org.apache.commons.codec.binary.Base64;

29wmng8.png

O cautare pe google ne ajuta sa ajungem la libraria care mai lipseste.

Codec - Download Commons Codec

Descarcam ultima versiune, extragem arhiva si adaugam fisierele .jar la proiect la fel cum am facut si cu celelalte dependente si am scapat si de aceasta problema.

Acum putem sa modificam metoda si sa o compilam.

Navigam pana la metoda verify, ii stergem tot continutul si scriem "return true"

Deci metoda verify din:

public static boolean verify(String id, String sn)
/* */ {
/* */ try
/* */ {
/* 323 */ if ((id == null) || (id.equals("")) || (sn == null) || (sn.equals(""))) {
/* 324 */ return false;
/* */ }
/* 326 */ id = id.trim();
/* 327 */ sn = sn.trim();
/* 328 */ Signature sig = Signature.getInstance("SHA1withRSA");
/* 329 */ sig.initVerify(getPublicKey());
/* 330 */ sig.update(id.getBytes("UTF8"));
/* 331 */ boolean result = sig.verify(Base64.decodeBase64(sn.getBytes("UTF8")));
/* 332 */ if (result) {
/* 333 */ getInstance().idDecryptCipherMap.put(id, getDecryptCipher(sn));
/* */ }
/* 335 */ if ((result) && (
/* 336 */ ((Integer.parseInt(id) >= 650000) && (Integer.parseInt(id) <= 650073)) || (
/* 337 */ (Integer.parseInt(id) >= 659990) && (Integer.parseInt(id) <= 659999)))) {
/* 338 */ String mac = MacAddr.getMacAddr();
/* 339 */ result = mac.equals(getLicenseMac(id));
/* */ }
/* 341 */ return result; } catch (Exception localException) {
/* */ }
/* 343 */ return false;
/* */ }

va deveni:

/*     */   public static boolean verify(String id, String sn)
/* */ {
return true;
/* */ }

Aceasi chestie o putem face si cu metoda isValidMember dar nu e necesar aici.

O chestie importanta care trebuie stiuta este ca eclipse compileaza fisierele in momentul in care acestea sunt salvate asa ca tot ce trebuie sa facem este sa salvam modificarile si sa mergem in directorul in care am creat proiectul java.

23ivt3r.png

Aici putem sa observam ca avem clasa de care avem nevoie gata compilata.

Stiind ca un fisier .jar este defapt o arhiva putem sa luam fisieru compilat de noi si sa-l inlocuim cu cel existent in directorul programului.

34soyds.png

Acum rulam programul in speranta ca ideea noastra a functionat si ca putem sa trecem de acel register.

Dar surpriza:

wqr0qb.png

Se pare ca avem o problema dar aplicatia a creat un fisier de log.

!SESSION 2013-01-12 22:01:06.880 -----------------------------------------------

eclipse.buildId=unknown

java.version=1.5.0_16

java.vendor=Sun Microsystems Inc.

BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US

Command-line arguments: -os win32 -ws win32 -arch x86 -clean

!ENTRY org.eclipse.osgi 4 0 2013-01-12 22:01:11.535

!MESSAGE Application error

!STACK 1

java.lang.UnsupportedClassVersionError: Bad version number in .class file

at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClass(Unknown Source)

at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188)

at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:601)

at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:567)

at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:490)

at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassLoader(ClasspathManager.java:478)

at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:458)

at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)

at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400)

at org.eclipse.osgi.internal.loader.SingleSourcePackage.loadClass(SingleSourcePackage.java:35)

at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:473)

at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)

at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)

at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)

at java.lang.ClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClassInternal(Unknown Source)

at com.facebook.friendadder.pro.launcher.Application.start(Unknown Source)

at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)

at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)

at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)

at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)

at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)

at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)

at org.eclipse.equinox.launcher.Main.run(Main.java:1410)

De aici putem observa ca aplicatia a fost compilata cu java 1.5 dar noi am compilat cu versiunea curenta 1.7 si aceasta pare sa fie cauza crash-ului.

Ne intoarcem in eclipse dam click dreapta pe proiect si alegem properties.

De aici alegem java compiler din panoul din stanga.

In panoul din dreapta setam "Compiler compliance level la 1.5"

25yudkh.png

Acum e nevoie de un rebuild al proiectului. Pentru asta este necesar doar sa tastam un spatiu in editor si sa salvam (ctrl+s). Daca nu merge asa dati Project si Build project.

Dupa build luam fisierul si il punem in arhiva jar, ca si mai sus.

Ruland aplicatia suntem intampinati de acelasi dialog de register.

Incercam o inregistrare cu credentialele de mai sus(vezi nota 1) si:

2qlbsp4.png

Nota 2:

Stiu ca aplicatia e simplu de pacalit pentru ca nu isi stocheaza valori de configurare prin registrii sau alte locuri mai ascunse ci doar in folderul ei dar scopul acestui tutorial este de a prezenta o metoda, o tehnica si trebuie privit strict pentru metoda si partea tehnica si nu pentru altceva.

Desigur cred ca sunt functionalitati care nu merg si trebuie sapat mai mult in aplicatie pentru a rezolva aceste probleme dar acesta a fost doar un demo pentru a prezenta metoda

Edited by M2G
corectare
  • Upvote 3
Posted (edited)

Scuze pentru x2 post.

Am inteles tot mai putin partea asta : Acum trebuie sa tragem cu drag & drop folderul com peste folderul src din eclipse pentru a incarca sursele decompilate in proiectul nostru din eclipse.

Daca apare un dialog alegeti copy files and folders si apasati ok. "

Edited by poterasal
Posted

Din jd-gui dai save all sources si o sa ai ca rezultat un fisier de tip arhiva cu toate sursele din acel .jar.

Daca dezarhivezi, o sa gasesti acolo un folder care se numeste "com".

Pur si simplu tragi folderul com peste folderul src din eclipse pentru a incarca sursele in proiectul eclipse.

Nu mai face dublu post ca iei warn. Ai buton de edit.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...