[x64] Conseils sur la déobfuscation

Vous avez un problème pour cracker ou vous souhaitez parler de reversing en général...

Re: [x64] Conseils sur la déobfuscation

Messagepar baboon » 23 Mars 2015, 11:12

Désolé, je n'ai vraiment pas le temps de jeter un coup d'oeil pour le moment mais tiens nous au courant des avancées :)
Newbie mais ayant soif d'apprendre et étant motivé
Avatar de l’utilisateur
baboon
Modérateur
Modérateur
 
Messages: 3343
Inscription: 08 Juillet 2005, 17:49

Re: [x64] Conseils sur la déobfuscation

Messagepar eabcdx » 23 Mars 2015, 18:26

Salut,

t'en fais pas :p
Je te remercie pour ta participation !
eabcdx
Crackeur de bas niveau
Crackeur de bas niveau
 
Messages: 131
Inscription: 03 Novembre 2012, 14:44

Re: [x64] Conseils sur la déobfuscation

Messagepar eabcdx » 14 Avril 2015, 01:24

Re,

je reviens rapidement, je n'ai pas fait de recherches supplémentaires pour le moment mais j'ajoute ceci. Il y a quelques minutes, Little T***t Ship est sorti sur PC et une connaissance m'a partagé ses exécutables. J'ai rapidement regardé et la protection employée dans ce jeu est extrêmement similaire à celle que j'étudie depuis Février dernier. Similaire au point qu'il se passe la même chose au démarrage de ces 2 jeux...

Sachant que ce jeu et sa protection vont faire beaucoup parler d'eux, notamment sur la possibilité du modding, nous aurons peut-être des informations supplémentaires d'ici peu :)

A plus tard.
eabcdx
Crackeur de bas niveau
Crackeur de bas niveau
 
Messages: 131
Inscription: 03 Novembre 2012, 14:44

Re: [x64] Conseils sur la déobfuscation

Messagepar dionosis » 14 Avril 2015, 18:27

Salut eabcdx !

Ok bonne nouvelle alors :D
Je suis curieux d'en savoir plus.

++
Avatar de l’utilisateur
dionosis
Maître des ténèbres
Maître des ténèbres
 
Messages: 507
Inscription: 09 Octobre 2009, 21:43

Re: [x64] Conseils sur la déobfuscation

Messagepar eabcdx » 01 Mai 2015, 19:47

Salut à tous !

J'ai repris lentement mes recherches cet après-midi et je me suis particulièrement concentré sur le tout premier appel à la protection. J'ai trouvé quelque chose d'assez étrange, notamment au début de cet appel, un buffer de 20 octets est initialisé de la manière suivante :
Code: Tout sélectionner
state[0] = 0x67452301;
state[1] = 0xEFCDAB89;
state[2] = 0x98BADCFE;
state[3] = 0x10325476;
state[4] = 0xC3D2E1F0;


Il s'agit à première vue des constantes utilisées lors de l'initialisation de l'algorithme de hashage SHA1. J'ai aussi trouvé les données qui sont censées être hashées mais le résultat ne correspond pas à mes calculs, il faut dire qu'avec l'obfuscation par dessus, c'est dur de suivre le fil :p Je poursuis mes recherches et je reviendrais quand je saurais ce qu'il se passe vraiment.
eabcdx
Crackeur de bas niveau
Crackeur de bas niveau
 
Messages: 131
Inscription: 03 Novembre 2012, 14:44

Re: [x64] Conseils sur la déobfuscation

Messagepar Horgh » 04 Mai 2015, 09:22

Ca m'intéresserait si tu pouvais me transmettre également les binaires :)
Avatar de l’utilisateur
Horgh
Maître des ténèbres
Maître des ténèbres
 
Messages: 526
Inscription: 21 Janvier 2010, 16:24

Re: [x64] Conseils sur la déobfuscation

Messagepar eabcdx » 04 Mai 2015, 12:03

Salut,
c'est envoyé, merci pour ta participation :)

De mon côté j'ai un peu continué mais comme j'exploite plusieurs méthodes en même temps, je n'ai pas plus creusé concernant le premier appel.
Les 2 méthodes que j'utilise actuellement sont :
- Le parsing des instructions du premier appel à la protection avec une "émulation" de la pile d'appel pour simuler la vraie exécution du programme, évidemment au bout d'un moment ça ne fait pas vraiment ce que je souhaite.
- Recherche par pattern, j'en ai testé un ce matin très tôt et j'ai trouvé 46 correspondances, j'essaye de continuer de ce côté là en remplaçant le code obfusqué par du code plus succinct qui au final fait la même chose (je passe de 10 à 3 instructions sur le pattern de test)

Bref, je travaille encore dessus, j'espère que ça portera ses fruits.

EDIT 19h29 :
J'ai patché les 46 correspondances avec le code "normal" qui fait la même chose et bingo, ça fonctionne à merveille :) Du coup la protection ne "protège" pas l'obfuscation à première vue. Ça m'a aussi permis de trouver 15 appels à la protection durant le processus d'initialisation, je pense que je vais effectuer des "stats" sur chacune de ces correspondances pour savoir combien de fois elles sont appelées, à quel moment, etc...

EDIT 22h43 :
J'ai continué la déobfuscation par pattern et j'ai actuellement déobfusqué 150 fonctions et ça fonctionne toujours correctement ! Maintenant je compte m'attaquer à un nouveau type de pattern qui a la tête suivante :
Code: Tout sélectionner
lea rsp,
mov qword
jmp <randomAddr>
lea rbp, saut1
xchg rbp, rsp
lea rsp,
mov qword
jmp <randomAddr>
lea rbp, saut2
xchg rbp, rsp
lea rsp,
jmp [rsp - 8]


J'ai une bibliothèque en tête qui permet de traduire du bytecode en instructions x86_64, je vais tenter d'utiliser ça pour sauter aux bonnes adresses histoire de récupérer la valeur de mes 2 saut d'un seul coup.
D'ailleurs, tant que j'y pense, est-ce que quelqu'un sait s'il est possible de push directement une valeur de 64 bits ? Le désassembleur refuse radicalement de le faire du coup je suis obligé de traduire ça par un
Code: Tout sélectionner
mov r15, 0x140001337
push r15

Évidemment, je pers le contenu original de r15 en faisant ça mais même si ça fonctionne pour le moment, je me doute qu'à la longue ça va mal se terminer :p
eabcdx
Crackeur de bas niveau
Crackeur de bas niveau
 
Messages: 131
Inscription: 03 Novembre 2012, 14:44

Re: [x64] Conseils sur la déobfuscation

Messagepar dionosis » 05 Mai 2015, 23:57

Salut,

eabcdx a écrit:D'ailleurs, tant que j'y pense, est-ce que quelqu'un sait s'il est possible de push directement une valeur de 64 bits ?
[...]
Évidemment, je pers le contenu original de r15 en faisant ça mais même si ça fonctionne pour le moment, je me doute qu'à la longue ça va mal se terminer :p

D'après la doc intel que je viens de consulter, il n'existe pas de push imm64. La doc amd y fait référence mais l'opcode est le même que le push imm32 et la description parle d'un 32-bit.
Je pense qu'il faut en conclure que ça n'est pas possible.

Je viens d'essayer sous x64_dbg vu que c'est ce que tu utilises j'imagine, et en fait c'est faisable indirectement et en préservant les registres en jouant sur rsp.
D'ailleurs dans la version que je viens de récupérer toutes les commandes de navigation dans ou vers la stack ne fonctionnent pas ; il ne m'est plus resté qu'à scroller à chaque pas. Je sais pas si chez toi ça fait pareil mais si oui ça doit être rapidement très très lourd.

Donc la méthode la plus courte en octets que j'ai trouvée est la suivante :

Pour faire un :
Code: Tout sélectionner
push 0x1122334455667788

Tu peux faire un :
Code: Tout sélectionner
push 0x55667788
mov dword [rsp+4], 0x11223344

Ce qui fait 13 octets au lieu des 12 de ta solution.

++
Avatar de l’utilisateur
dionosis
Maître des ténèbres
Maître des ténèbres
 
Messages: 507
Inscription: 09 Octobre 2009, 21:43

Re: [x64] Conseils sur la déobfuscation

Messagepar eabcdx » 06 Mai 2015, 02:04

Salut,

du coup j'avais regardé rapidement et effectivement, ce n'est pas possible :/ Du coup j'ai gardé ma solution, ça ne gêne pas le programme que r15 soit modifié à droite et à gauche.
Pour le moment, j'ai patché environ 420 correspondances. C'est pas énorme mais au fur et à mesure je pense que ça va le faire. Pour le moment, ces modifications qui altèrent le code original ne posent aucun soucis. J'ai fait des tests de chargements de parties, aucun problème donc je suis confiant :wink:

Concernant x64_dbg, effectivement j'utilise ça et il est assez perturbant au niveau de l'usage, mais pour une version 24, c'est plutôt bien, il y a 2-3 versions de ça, c'était un vrai calvaire :p

Merci pour ta réponse, je reviendrai ici dès que j'aurais un peu plus avancé.
eabcdx
Crackeur de bas niveau
Crackeur de bas niveau
 
Messages: 131
Inscription: 03 Novembre 2012, 14:44

Re: [x64] Conseils sur la déobfuscation

Messagepar dionosis » 06 Mai 2015, 10:43

Re,

eabcdx a écrit:Concernant x64_dbg, effectivement j'utilise ça et il est assez perturbant au niveau de l'usage, mais pour une version 24, c'est plutôt bien, il y a 2-3 versions de ça, c'était un vrai calvaire :p

Je veux bien te croire, je l'avais déjà choppé une fois pour essayer de t'aider justement et il m'était impossible de rester plus d'une minute max sans que ça ne crash.
Là au moins ça n'a plus l'air d'être le cas, en tout cas pas chez moi.

eabcdx a écrit:Du coup j'ai gardé ma solution, ça ne gêne pas le programme que r15 soit modifié à droite et à gauche.

msdn a écrit:rax, rcx, rdx, r8-r11 are volatile.
rbx, rbp, rdi, rsi, r12-r15 are nonvolatile.
[...]
Volatile registers are scratch registers presumed by the caller to be destroyed across a call.
Nonvolatile registers are required to retain their values across a function call and must be saved by the callee if used.

Ok, peut-être quand même alors que r11 serait plus approprié.
A toi de voir. :)

++
Avatar de l’utilisateur
dionosis
Maître des ténèbres
Maître des ténèbres
 
Messages: 507
Inscription: 09 Octobre 2009, 21:43

Re: [x64] Conseils sur la déobfuscation

Messagepar eabcdx » 06 Mai 2015, 22:25

Salut !

Ah j'ignorais l'histoire des registres, effectivement, il faudrait que je pense à passer sur r11.
J'ai un peu continué la déobfuscation. Je me suis battu toute la journée pour remplacer quelques mov conditionnels et boom. Ça fonctionne bien sur le principe, mais je suis tombé sur l'anti-tamper du jeu. L'avantage, c'est que je sais exactement où il opère. Pour le moment, j'ai regardé rapidement (ça fait 5 minutes que je suis dessus) et l'anti-tamper lit quelques octets (des fois 4, des fois 20, etc...). Après quoi, il doit faire un mix de ces octets (j'ai pas encore regardé) pour donner un résultat sur 20 octets (cf l'histoire du SHA1).

A un certain moment, le programme va lire un uint64_t dans RCX et y ajouter les 4 derniers octets du tableau de 20 (en tant qu'uint32_t). Si après l'addition, RCX n'est pas égal à 0, ça saute à une adresse random et évidemment ça crash. Je viens de faire plusieurs tests, ce résultat de 20 octets est recalculé à plusieurs reprises. En mettant les bons résultats à la main, l'exécution continue mais il le fait tellement de fois qu’évidemment, je ne vais pas passer ma vie à le faire à la main :p

Je vais essayer de retranscrire l'algorithme qui calcule les bons résultats, avec le surplus d'instructions que j'ai déjà enlevé, j'espère pouvoir y parvenir plus facilement. Je vous tiens au jus ;)

EDIT 00h55 :
Je pense avoir réussi à dumper toutes les adresses où vont être lus les différents octets durant l'initialisation de l'anti-tamper. Si mes calculs sont corrects, la première fonction parse 6238 octets répartis en 328 routines. Bon, je vais voir si ça colle, faut que je continue l'écriture de l'algorithme...
eabcdx
Crackeur de bas niveau
Crackeur de bas niveau
 
Messages: 131
Inscription: 03 Novembre 2012, 14:44

Re: [x64] Conseils sur la déobfuscation

Messagepar dionosis » 07 Mai 2015, 08:47

Salut,

Le plus simple semble à première vue de patcher le 'add rcx, sha1_digest[4]' final par un 'xor rcx, rcx'.
C'est pas faisable ?

++
Avatar de l’utilisateur
dionosis
Maître des ténèbres
Maître des ténèbres
 
Messages: 507
Inscription: 09 Octobre 2009, 21:43

Re: [x64] Conseils sur la déobfuscation

Messagepar eabcdx » 07 Mai 2015, 11:39

Salut,

pour être honnête, ça ne m'a même pas traversé l'esprit :aie: Effectivement, très bonne remarque de ta part dionosis !
Je viens donc te tester et effectivement ça fonctionne. En regardant vite fait, il passe 5 fois par ce 'add rcx, sha1_digest[i]'. En patchant par 'xor rcx, rcx' l'exécution continue, mais il revient pratiquement au début de la fonction qui correspond au premier appel à la protection et vraisemblablement, ça reparse d'autres octets (si j'ai bien cerné le truc, il parse 64 octets par 64 octets, à chaque fois 20 nouveaux octets, qui correspondraient au digest SHA1 sont regénérés et il doit faire des checks dessus).

Je poursuis mon enquête..

EDIT 14h40 :
J'ai réussi à bypass les 4 premiers appels à la protection en patchant les comparaisons (une dizaine seulement). Bon c'est une bonne chose de faite mais on arrive à la deuxième partie de la protection, à savoir le déchiffrement de code à la volée qui lui, ne pardonne pas :p

Je vais voir comment m'y prendre, je vais sûrement faire du patching statique dans un premier temps et plus tard envisager le patching dynamique à travers différentes versions, si j'y parviens :)
eabcdx
Crackeur de bas niveau
Crackeur de bas niveau
 
Messages: 131
Inscription: 03 Novembre 2012, 14:44

Re: [x64] Conseils sur la déobfuscation

Messagepar eabcdx » 17 Mai 2015, 21:03

Salut !

Je double-poste pour vous dire que j'ai un peu plus avancé ces 10 derniers jours. Je n'ai malheureusement pas pu y consacrer autant de temps que je le voulais mais ça avance petit à petit. Je viens de patcher dynamiquement environ 750 portions de code obfusqué qui concernent les sauts conditionnels. Ça patche pas mal de code mais pas encore tout (je ne me suis pas encore occupé des instructions du type "test eax, eax").

Il faut aussi savoir que je patche seulement la section .text, donc il y en a pas mal dans la dernière section mais je ne sais pas pourquoi, mes algorithmes de parsing/patching sont très très lents dessus (< 1min sur la section .text avec 4 threads, > 15min sur la dernière section, toujours avec 4 threads).

Bref, plus ça va, plus je commence à y voir clair dans tout ça. Étrangement, les patchs appliqués dans la sections .text (NOP et insertion manuelle des jumps) ne sont pas détectés par les 9 premiers appels à la protection (je ne peux pas aller plus loin, le jeu ne démarre pas, DX10 ftw :aie: )

A+
eabcdx
Crackeur de bas niveau
Crackeur de bas niveau
 
Messages: 131
Inscription: 03 Novembre 2012, 14:44

Re: [x64] Conseils sur la déobfuscation

Messagepar dionosis » 18 Mai 2015, 12:39

Salut,

eabcdx a écrit:je ne sais pas pourquoi, mes algorithmes de parsing/patching sont très très lents dessus (< 1min sur la section .text avec 4 threads, > 15min sur la dernière section, toujours avec 4 threads)

Tu les cherches comment tes séquences ? En désassemblant ou en recherchant des suites d'octets définies ?
Parce qu'effectivement c'est trop long (même pour la première solution).
Après ça dépend beaucoup de l'implémentation, dès que tu colles des regexp sur des volumes comme ça...

eabcdx a écrit:Bref, plus ça va, plus je commence à y voir clair dans tout ça.

C'est souvent comme ça sur les cibles complexes. Au début tu comprends rien et puis petit bout par petit bout tout devient limpide.

eabcdx a écrit:Étrangement, les patchs appliqués dans la sections .text (NOP et insertion manuelle des jumps) ne sont pas détectés par les 9 premiers appels à la protection

Plusieurs protections choisissent de ne pas tout scanner mais plutôt des secteurs prédéfinis plus ou moins longs et plus ou moins critiques. Parfois même les hashs sont communiqués au serveur.

++
Avatar de l’utilisateur
dionosis
Maître des ténèbres
Maître des ténèbres
 
Messages: 507
Inscription: 09 Octobre 2009, 21:43

PrécédenteSuivante

Retourner vers Reversing

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités

cron