Page 1 sur 1

Contourner le Frameworks PAD

MessagePosté: 17 Juin 2015, 19:27
par Cirdo
Salut à tous,

Aujourd'hui, dans ce tuto on va contourner le Frameworks PAD très facilement.

Voici le lien du Frameworks PAD :
Code: Tout sélectionner
https://www.paddle.com


J'utilise un faux nom :)



Qu'est que c'est le Frameworks PAD ? A quoi sert-il ? Comment se présente-il ?

Le Frameworks PAD est un Frameworks qui permet de déverrouiller son application contre une clé de license. Il permet aux développeurs de gérer facilement leur license. Il est développé indépendamment des logiciels qui l'utilisent.

Image
Voici une petite image.

Comment le contourner ?

Le problème avec ce Frameworks, c'est qu'il est très facile à implémenter.

Téléchargeons un logiciel qui l'utilise et appelons Orange.
Code: Tout sélectionner
http://www.macupdate.com/app/mac/54408/squish


Ouvrons le et au lancement il nous demande de rentrer un couple nom/serial.
On s'aperçoit que le logiciel charge au début, il utilise forcément internet.

Maintenant ouvrons le avec Hopper.

On cherche la fonction : -[ApplicationDelegate applicationDidFinishLaunching:]
Dans la Doc de PAD, le setup se fait dans cette fonction.
Lien de la doc :
Code: Tout sélectionner
https://www.paddle.com/docs/sdk/mac


Et on peut voir que les développeurs qui ont développé Orange sont fidèles à la doc.
Le code de la fonction :
Code: Tout sélectionner
000022a0 55                              push       rbp               ; Objective C Implementation defined at 0x100094da8 (instance)
0x00000001000022a1 4889E5                          mov        rbp, rsp
0x00000001000022a4 4157                            push       r15
0x00000001000022a6 4156                            push       r14
0x00000001000022a8 4155                            push       r13
0x00000001000022aa 4154                            push       r12
0x00000001000022ac 53                              push       rbx
0x00000001000022ad 4881EC08010000                  sub        rsp, 0x108
0x00000001000022b4 488D45C0                        lea        rax, qword [ss:rbp+var_40]
0x00000001000022b8 48897DD0                        mov        qword [ss:rbp+var_30], rdi
0x00000001000022bc 488975C8                        mov        qword [ss:rbp+var_38], rsi
0x00000001000022c0 48C745C000000000                mov        qword [ss:rbp+var_40], 0x0
0x00000001000022c8 4889C7                          mov        rdi, rax          ; argument #1 for method imp___stubs__objc_storeStrong
0x00000001000022cb 4889D6                          mov        rsi, rdx          ; argument #2 for method imp___stubs__objc_storeStrong
0x00000001000022ce E879D20700                      call       imp___stubs__objc_storeStrong
0x00000001000022d3 488B059E390900                  mov        rax, qword [ds:objc_cls_ref_Paddle] ; objc_cls_ref_Paddle
0x00000001000022da 488B35FF350900                  mov        rsi, qword [ds:0x1000958e0] ; @selector(sharedInstance), argument #2 for method imp___stubs__objc_msgSend
0x00000001000022e1 4889C7                          mov        rdi, rax          ; argument #1 for method imp___stubs__objc_msgSend
0x00000001000022e4 E839D20700                      call       imp___stubs__objc_msgSend
0x00000001000022e9 4889C7                          mov        rdi, rax          ; argument #1 for method imp___stubs__objc_retainAutoreleasedReturnValue
0x00000001000022ec E855D20700                      call       imp___stubs__objc_retainAutoreleasedReturnValue
0x00000001000022f1 488D15981B0900                  lea        rdx, qword [ds:cfstring_cd5a7a7e18948f05757309ae47030e56] ; @"cd5a7a7e18948f05757309ae47030e56"
0x00000001000022f8 488945B8                        mov        qword [ss:rbp+var_48], rax
0x00000001000022fc 488B45B8                        mov        rax, qword [ss:rbp+var_48]
0x0000000100002300 488B35E1350900                  mov        rsi, qword [ds:0x1000958e8] ; @selector(setApiKey:), argument #2 for method imp___stubs__objc_msgSend
0x0000000100002307 4889C7                          mov        rdi, rax          ; argument #1 for method imp___stubs__objc_msgSend
0x000000010000230a E813D20700                      call       imp___stubs__objc_msgSend
0x000000010000230f 488D059A1B0900                  lea        rax, qword [ds:cfstring_10136] ; @"10136"
0x0000000100002316 488B55B8                        mov        rdx, qword [ss:rbp+var_48]
0x000000010000231a 488B35CF350900                  mov        rsi, qword [ds:0x1000958f0] ; @selector(setVendorId:), argument #2 for method imp___stubs__objc_msgSend
0x0000000100002321 4889D7                          mov        rdi, rdx          ; argument #1 for method imp___stubs__objc_msgSend
0x0000000100002324 4889C2                          mov        rdx, rax
0x0000000100002327 E8F6D10700                      call       imp___stubs__objc_msgSend
; suite


Grace aux commentaires de Hopper (et au pseudo code ;) ), à la ligne 0x00000001000022da le Frameworks utilise le @selector qui permet d'instancier le Frameworks : sharedInstance. Et à la ligne 0x00000001000022e4 on appelle la fonction qui l'instancie.

Ce qui est pratique en objective-c, c'est qu'on peut envoyer des messages (équivalents à des appels de fonction en C) à des objects vides sans que ça provoque une erreur.

Ex :
Code: Tout sélectionner
MaClass *c = [[MaClass alloc] init] //Mon objects est bien vivant, il est instancié
[c fonctionQuiFaitBeep]; // Ma fonction va faire Beep car il est vivant

MaClass *h; //Ma class n'est pas instancié, c'est une variable vide
[h fonctionQuiFaitBeep]; //Ma variable est vide, il ne se passe absolument rien (pas d'erreurs de compilation, etc...)


Alors nous allons nooper le call qui instancie le Frameworks (Hopper peut faire ce genre de manip sans créer un nouvel executable)
Et ça fonctionne très bien, il nous demande plus de couple nom/serial.
Il nous reste plus qu'a patcher Orange.

Merci de votre lecture.
N'hésitez pas à critiquer ;)