Contourner le Frameworks PAD

Salut à tous,
Aujourd'hui, dans ce tuto on va contourner le Frameworks PAD très facilement.
Voici le lien du Frameworks PAD :
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.

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.
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 :
Et on peut voir que les développeurs qui ont développé Orange sont fidèles à la doc.
Le code de la fonction :
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 :
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
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.
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

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
