Ainsi, pour éviter la contrefaçon, celui-ci a été protégé, mais voici les explications sur ces diverses protections.
Merci PS3 addict pour la traduction :
Flynn m'a envoyé ce texte expliquant cette protection du Cobra, j'espère que cela servira à ceux intéressés par un reverse dump.
COBRA RTOC TRICK EXPLAINED
Le JIG Cobra possède différentes mesures de protection pour s'assurer que son code ne puisse pas être utilisé correctement en cas de Dump.
Cette protection dans le registre RTOC est la première utilisée, en plus de compliquer l'analyse.
Le registre RTOC est initialement sauvegardé dans la pile pour conserver le RTOC du LV2 et pouvoir le récupérer postérieurement.
# =============== S U B R O U T I N E
cobra_syscall_sm_shutdown_hook: # CODE XREF: syscall_379 j
.set arg_20, 0x20
.set arg_28, 0x28
.set arg_30, 0x30
.set arg_38, 0x38
.set arg_40, 0x40
mflr %r0
std %r0, arg_20(%sp)
std %rtoc, arg_28(%sp)
A ce stade, expliquons ce qu'est le DELTA OFFSET.
Le DELTA OFFSET est une méthode utilisée sur l'x86, avec comme création "originale" certains virus informatiques, pour calculer l'adressage de la mémoire dans la RAM.
Aux origines, un virus informatique ne connaissait pas, lors de son exécution, à quel endroit il se trouvait dans un exécutable. Dépendant de l'exécutable, il pouvait se situer en zone initiale de démarrage...ou ailleurs..., c'est pour cette raison que fut inventé le DELTA OFFSET.
Le DELTA OFFSET peut être utilisé sur n'importe quel système, la procédure est la suivante :
- En utilisant le registre qui indique la direction actuelle d'exécution (ou la suivante, dépendant du système)
- En soustrayant la taille du code précédemment utilisé à cette valeur obtenue depuis le registre.
Sachant cela, et en prenant l'exemple du processeur x86, dont le registre EIP ne peut pas être lu directement, le "trick" a été inventé, d'appeler une "subfonction" qui est simplement la ligne suivante de l'appel fonction :
call x
x:
pop eax
L'instruction call en x86, garde dans la partie supérieure de la pile, la direction de l'instruction qui la suit.
De cette façon, en utilisant pop, nous extrayons de la partie supérieure de la pile, cette valeur, et nous la conservons dans eax, par exemple, en ayant déjà l'adresse de la mémoire.
A ce point, il suffirait de soustraire la valeur antérieure, pour obtenir le calcul exact.
Sur PowerPPc, nous pouvons utiliser cette techique, en utilisant l'instruction équivalente BL (BRANCH LINK), laquelle pointe sur une "subfonction" mais en conservant dans le registre LR l'adresse suivante à BL. .
bl _delta_offset
_delta_offset:
A ce stade, nous voyons le "truc" utilisé pour la création du RTOC du Cobra à ce moment.
Remarquez que r0 et RTOC sont à 0 :
li %r0, 0
li %rtoc, 0
Postérieurement, nous donnons la valeur 0x11DE0 à rtoc:
oris %rtoc, %rtoc, 1
ori %rtoc, %rtoc, 0x1DE0
A r0 on donne la valeur 0x920:
oris %r0, %r0, 0
ori %r0, %r0, 0x920
On soustrait à r0 la valeur de rtoc:
subf %r0, %r0, %rtoc
A la différence du x86, en PowePPC le registre LR peut se lire directement avec l'instruction mflr, nous mettons dans le rtoc la valeur obtenue par le delta offset :
mflr %rtoc
Pour calculer le delta offset final, nous soustrayons les opérations antérieures effectuées au delta offset, à savoir 4, c'est-à-dire 16 bytes :
addi %rtoc, %rtoc, -0x10
Finalement, nous additions la valeur de r0 au rtoc final du delta offset, en gardant le résultat dans le rtoc, étant le rtoc cobra adéquat pour ce "hook".
add %rtoc, %rtoc, %r0
En ayant le cobra rtoc, on garde dans la pile les 3 arguments que le "hook" a reçu :
std %r3, arg_30(%sp)
std %r4, arg_38(%sp)
std %r5, arg_40(%sp)
On appelle la fonction du Cobra où se vérifiera le premier argument à la recherche de la commande 0x8202 (une commande spéciale comme d'habitude... :
bl cobra_syscall_sm_shutdown
Après avoir fait le nécessaire avec le Cobra, on récupère de la pile le rtoc original, de même que les arguments reçus par le "hook", on exécute l'instruction originale qui a été réécrite dans l'entrée du syscall 379 (dans ce cas), pour avoir notre "hook", et on appelle la syscall originale du LV2 :
ld %rtoc, arg_28(%sp)
ld %r3, arg_30(%sp)
ld %r4, arg_38(%sp)
ld %r5, arg_40(%sp)
mfcr %r12
bl original_syscall_sm_shutdown
Au retour, on récupère le LR original depuis la pile, et on retourne à ce qu'il pointe :
ld %r0, arg_20(%sp)
mtlr %r0
blr
# End of function cobra_syscall_sm_shutdown_hook
Source : http://jaicrab.blogspot.com/2011/07/ps3-cobra.html
Source : http://www.ps3-addict.fr/forum/viewtopic.php?f=15&t=3642