Newserator Posté(e) le 17 juillet 2008 Posté(e) le 17 juillet 2008 Nous continuons notre série de documentation technique dans la langue de Molière avec aujourd'hui une traduction d'un article de Sven à propos du contournement de certains restrictions au niveau du lecteur DVD, contournement qui nous emmènera également du côté du fonctionnement de l'IOS. Comme précédemment lors de la présentation du IOS HAX et du PatchMii (_core) de Bushing, cet article est d'un niveau technique assez avancé et ne sera donc pas forcément explicite pour tout le monde : Après la publication du 1er IOS hacké et du Dumper en mode Wii de Nitrotux, Bushing a expliqué les bases du hack IOS et publié PatchMii (_core). Voici une explication des modifications réalisées par Nitrotux et pourquoi l'IOS30+ nécessite une modification différente. Lorsque vous lancez n'importe quel logiciel sur la Wii, une certaine version de l'IOS est chargé dans le Starlet. L'application (par exemple le System Menu, un jeu Wiiware ou un jeu commercial) peut décider quelle version de l'IOS doit être chargée dans le Starlet via un champs situé dans son TMD. La Chaine Homebrew utilise une ancienne version afin d'assurer qu'elle se lancera même sur une console qui n'a jamais été mise à jour. Cependant, il est également possible de recharger une nouvelle version de l'IOS un utilisant un appel ES. Libogc essai même de charger la plus récente version de l'IOS (sauf pour l'IOS37 qui l'est actuellement). L'IOS en fonction contrôle tous les accès à tout le hardware nouvellement ajouté ainsi que le lecteur DVD. Comme vous pouvez le deviner à la vue du titre de cet article, le pilote DVD de l'IOS intègre une fonction appelée DVD_LowUnencryptedRead et (assez évident) également DVD_LowRead. La différence entre ces deux fonctions est que la première vous permet de lire directement les données telles qu'elles sont écrites sur le DVD tandis que la seconde fonction fonctionne uniquement avec les données cryptées et signées et décrypte ces données à la volée afin de rendre "invisible" la couche de cryptage lorsque les données arrivent au PPC. La plupart des homebrews devraient juste utiliser la première fonction s'il n'y avait pas une limitation existante. Celle-ci n'autorise la lecture que jusqu'au bytes 0x50000. Cette fonction est normalement utiliser pour lire la table de partition du DVD afin d'utiliser ensuite DVD_LowRead une fois la partition ouverte. Le hack de Nitrotux retire cette limitation dans l'IOS21 et voici comment vous pouvez vous même trouver et désactiver cette limitation sur l'IOS30+ qui a été légèrement modifié. La 1ére différence est que l'IOS30+ est divisé en fichier ELF pour chaque pilote. Cela aide vraiment lorsque vous faite du reverse engineering puisque vous n'avez qu'à ouvrir un de ces fichiers dans votre désassembleur préféré et de trouver un de ces pilotes. Si vous charger le fichier ELF du pilote DI dans IDA et attendez que celui-ci termine l'analyse automatique vous vous trouverez face à beaucoup de code et cela demandera un temps conséquent avant de trouver le code qui limite la vérification pour la fonction DVD_LowUnencryptedRead. Il existe cependant des chaines (string) de deubg forte utile dans l'IOS : vous pourriez par exemple trouver une chaine telle que "handleDiCommand: Unknown DI command %x". En traçant cette chaine en retournant au call debug_printf vous trouverez déjà la fonction handleDiCommand. Cette fonction en elle même est minuscule et basiquement vérifie uniquement la valeur ioctl, soustrait 0x12 (car 0x12 correspond au premier bit de ioctl) et les vecteurs vers une adresse depuis une jumptable dependant de la valeur en question. DVD_LowUnencryptedRead possède la valeur ioctl 0x8d, exemple l'adresse 123 (0x8d - 0x12 = 123) dans la jumptable. Il y avait deux vérifications dans les anciennes version de l'IOS directement au début de cette fonction. La première vérifiait si l'offset lu était en dessous la limite et la seconde si l'offset lu plus la longueur était toujours en dessous. Nitrotux a désormais remplacé la première partie avec une instruction NOP et transformé la deuxième d'une partie conditionnel (si plus bas que -> jump) en une partie non conditionnel (effectué un jump tout le temps). Dans l'IOS30+ ceci a cependant été modifié : en lieu et place de ces deux vérifications statiques il a désormais une fonction qui vérifie quelque chose de similaire à ce code C : int check_limit(int offset, int len){ int limits[] = {0x0, 0x14000, 0x460a0000, 0x8, 0x7ed40000, 0x8}; int i; len >>= 2; for(i = 0; i < 3; i++) { if(offset > limits[2*i] && offset < limits[2*i] + limits[2*i+1] && offset + len > limits[2*i] && offset + len < limits[2*i] + limits[2*i+1]) return 1; } return 0;} Cette fonction vérifie si l'ensemble des données que le PPC souhaite lire ce trouve entre un des offsets autorisés dans la table. Vous pouvez déjà deviner maintenant comment autoriser la lecture complète du DVD : simplement en patchant la table afin d'utiliser 0xffffffff à la place de 0x1400 en tant qu'offset maximal et la fonction réussira systématiquement. Un patch a déjà été soumis et a été intégré au patchmii_core si vous êtes intéressés à la manière dont la table se présente dans le binaire IOS. Ce patch était bien entendu inspiré du patch original publié par Nitrotux pour les versions précédent l'IOS30 et il ne reste plus qu'à espérer l'implémentation de celui-ci dans le patchmii. Site officiel : http://svenpeter.blogspot.com Lien vers article original : http://wii.gx-mod.com/modules/news/article.php?storyid=1322
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant