shark8 Membre
Messages : 3 Date d'inscription : 26/12/2014
| Sujet: Et bien , tous ça c'est trop top passionnant ! mais tant pis pour moi , je suis en CEX , mais c'est tous cela qui m'aurrai intéréssé de comprendre et de pratiquer . Lun 19 Jan - 20:25 | |
| - tekman a écrit:
- Salut à tous,
Certains membres se demandent comment je trouve ces fameux codes que l'on peut appliquer aux EBOOT/PKG. Ce sujet n'est pas vraiment un tuto, mais plutôt des bases à comprendre et à connaître pour se lancer. Je ne vais pas m'attarder sur la recherche des codes mémoires que l'on trouve avec un debugger (style "Netcheat"), vu que ce sujet à été abordé plusieurs fois, je vais surtout m'attarder sur le langage de notre chère PS3, le "PPC" ("Power PC" ou encore "ASM").
Pour rappel, il vous faut absolument une "PS3 DEX" (full ou "Rebug REX" en mode DEX), un "EBOOT Debug" de votre jeu, "Target Manager" ainsi que son "Debugger", une "calculatrice décimal/hexadécimal" (celle de windows fait parfaitement l'affaire), "ASMwiird" et "un cerveau" en état de marche (lol). Tout les programmes dont je parle sont bien sûr dispo en DDL via les liens de ma signature, là, c'est à vous de chercher.
Sur ce, c'est parti!
1) Les registres:
Au nombre de 32 et en 8 bytes, c'est ici que sont stocké les valeurs et les adresses mémoires. Les jeux utilisant les 8 bytes sont rares (c'est le cas des jeux "LEGO", les pièces ou monnaie sont en 8 bytes), voici comment les lire: - 8 bytes: 8888 8888 8888 8888. - 4 bytes: 0000 0000 4444 4444. - 2 bytes: 0000 0000 0000 2222. - 1 byte: 0000 0000 0000 0011. Dans la plupart des cas, c'est le 4 bytes qui est utilisé, même si votre registre indique la valeur: 0000 0000 0000 0063. Une adresse mémoire sera par exemple: 0000 0000 34AB 420C. Bref, il est très important de surveiller ces registres, un simple changement de registre dans votre opération et bingo, vous aurez votre code!
2) Les "breakpoints":
Il faut utiliser l'adresse mémoire trouvé par "Netcheat" (ou autre) pour poser un "breakpoint" dans le debugger de "Target Manager". Vous pouvez le mettre en "lecture" ou "écriture", sachant que le deuxième est le plus souvent utilisé. Si vous cherchez par exemple les munitions, tirez une balle dans votre jeu et vous aurez un freeze, pas de panique, c'est normal, c'est que le "breakpoint" fonctionne. Vous verrez l'opération en question dans l'onglet "Disassembly". NOTE: Sachant que l'opération se traduit comme ceci: - ??? r1, 0x?(r2) > r1 = la valeur, 0x?(r2) = l'adresse mémoire
a) Lecture: Voici les différentes formes que vous trouverez en mode lecture, sachant que la valeur contenue à l'adresse "0x0(r2)" sera chargée dans le registre "r1": - ld r1, 0x0(r2) > 8 bytes - lwz r1, 0x0(r2) > 4 bytes - lhz r1, 0x0(r2) > 2 bytes - lbz r1, 0x0(r2) > 1 byte
b) Ecriture: Et les différentes formes que vous trouverez en mode écriture, sachant que la valeur contenue dans le registre "r1" sera écrite à l'adresse "0x0(r2): - std r1, 0x0(r2) > 8 bytes - stw r1, 0x0(r2) > 4 bytes - sth r1, 0x0(r2) > 2 bytes - stb r1, 0x0(r2) > 1 byte
3) Ecrire une valeur dans un registre:
Alors ici, ce n'est que faisable en 4 bytes maximum (pour du 8 bytes, il faudra jouer avec l'option "a)", mais ca, c'est une autre histoire). Donc, partons sur cette base: 0000 0000 XXXX YYYY, vous ne pouvez écrire que 2 bytes maximum par opération (XXXX ou YYYY): - Pour XXXX ce sera une opération "lis". - Pour YYYY ce sera une opération "li". Exemple: - li r1, 0x12 > r1 = 0000 0000 0000 0012 - li r1, 0x1200 > r1 = 0000 0000 0000 1200 - lis r1, 0x12 > r1 = 0000 0000 0012 0000 - lis r1, 0x1200 > r1 = 0000 0000 1200 0000 Après, il y a des opérations d'addition: - Pour XXXX ce sera "addis". - Pour YYYY ce sera "addic". Exemple, encore: - li r1, 0x1200 > r1 = 0000 0000 0000 1200 addic r1, r1, 0x12 > r1 = 0000 0000 0000 1212 - li r1, 0x10 > r1 = 0000 0000 0000 0010 addic r1, r1, 0x12 > r1 = 0000 0000 0000 0022 Et l'opération classique, quand vous voulez écrire la valeur "99999999" donc, "05F5E0FF" (en hexa, très souvent utilisé pour de l'EXP ou de l'argent), la facon la plus courante de l'écrire est comme ceci: - lis r1, 0x5F5 > r1 = 0000 0000 05F5 0000 ori r1, r1, 0xE0FF > r1 = 0000 0000 05F5 E0FF(correspond plus ou moins au "addic") Une autre opération souvent utilisé pour des munitions (r1 étant vos munitions): - addic r1, r1, -0x1 (addition de -1) peut s'écrire aussi comme ceci: - subbic r1, r1, 0x1 (soustraire 1) En gros, dès que l'on tire une balle, bah, ça fait moins 1, suffit de mettre "0x0" et dans la plupart des cas... "Infinite Ammo/No Reload"
4) Exemples:
Bon, vu mes galères de pc actuelles je vais essayer tant bien que mal de faire des exemples. Attention, tout les jeux sont différents, je vais juste démontrer la/les réflexions à faire devant des lignes de codes. Je reprend donc sur une de mes série préférée "Resident Evil", "Code Veronica" ici. Exceptionnellement, recherche de A à Z pour ce premier code:
A) Infinite Ammo/No Reload:
Pour résumer, début du jeu, ruban encreur dans ma première case de l'inventaire et je viens de recevoir mon flingue avec 12 balles. - Donc recherche de la valeur "12" via Netcheat, oubliez les décimals est tapez dans les hexa, "0C" pour 12 balles: - netcheat1:
- Je vais tirer une balle histoire de chercher la valeur 000B (11 balles pour ceux qui suivent lol):
- netcheat2:
- Un seul résultat, impecc pour passer à la suite, direction le debugger de "Target Manager", histoire de placer 00BC3A96 en breakpoint et en mode écriture. Je retourne dans le jeu, tire une nouvelle balle, le jeu freeze (normal, c'est que le breakpoint fonctionne) et voici le résultat:- ps3debugger1:
- Petite analyse, sachant que mon chargeur doit maintenant contenir 10 balles soit 0A en hexa: * Dans la fenêtre "disassembly" je trouve l'opération "stwx r7,r6,r8" (en bas), compliqué lol, la solution de facilité serait de * mettre une valeur "NOP" comme ceci "001B3E10 60000000", ce qui supprimerait l'opération, mais pas sur que ca marche. * Dans la fenêtre "memory" j'ai ce code "00BC3A94 0009000B", 0009 étant mon flingue et 000B (ou 11) étant mon nombre de munition avant le breakpoint. * Enfin dans la fenêtre "registers", 2 registres attirent mon attention, r7 qui contient la valeur de mon flingue 00090000 et le plus important, r5 qui contient mon nombre de munition actuel 0A. - Je vais refaire 2 essais en surveillant bien ma fenêtre mémoire ainsi que le registre 5, pour voir si mes déductions sont correct. Je retourne dans le jeu, faire feu une fois de plus, freeze:
- ps3debugger2:
- Je suis dans la bonne voie, la mémoire m'indique 0A et le registre 5 m'indique mes munitions actuelles soit 09. Jamais 2 sans 3, je retourne dans le jeu pour activer une troisième fois mon breakpoint:
- ps3debugger3:
- Tout est ok, je suis maintenant sur que c'est le registre 5 qui influe sur mes munitions. Je vais donc devoir trouver une opération qui contient ce registre. - Pas besoin d'aller très loin, il suffit de remonter un peu dans les opérations, il y en a 3 pour le registre 5 est c'est la première qui me saute aux yeux, encaré en rouge:
- Disassembly1:
- "addic r5,r5,-0x1" qui peut également sécrire "subbic r5,r5,0x1", je vous en ai parlé plus haut dans le sujet mais pour traduire, la valeur 1 est soustraite à la valeur stocké dans le registre 5 et le résultat est stocké dans le registre 5. Encore une fois, vous pouvez tenter une valeur NOP comme ceci "001B3DDC 60000000" mais pour les besoin de l'exemple, nous allons en faire un code propre, le but étant de modifier "-0x1" en "0x0" (ce qui voudra dire que les munitions ne sont pas décomptées). - J'ouvre le prog "ASMwiird" est rentre mon addic, un petit clique sur la flêche qui pointe vers la droite:
- ASM1:
- Sur la fenêtre de droite je vois bien le code tel qu'il apparait dans le debugger, il me suffit de remplacer "-0x1" par "0x0" et encore un petit clique sur la flèche droite:
- ASM2:
- Mon code "cheaté" est donc "30A50000", je désactive mon breakpoint et je retourne sur netcheat pour le test. - Par sécurité, je fais toujours un code "OFF" et un code "ON", car contrairement aux codes mémoires, un codes EBOOT restera actif tant que vous ne quittez pas le jeu. En cas de bug ou de freeze, il vous suffira dans la plupart des cas d'activer le OFF et de relancer le jeu (flèche verte lecture dans netcheat TMAPI et/ou flèche lecture dans prodg), en cas de gros bug, le redémarrage sera obligatoire. Bref, 2 captures supplémentaire:
- netcheat3:
- Et le résultat du test est positif. Le gros avantage de se casser la tête à chercher un code EBOOT est que dans ce cas, cela vaut pour toutes les armes du jeu, contrairement aux codes mémoires ou chaques armes a un offset différent, de plus vous pouvez patcher votre EBOOT et le code sera opérationnel sans avoir besoin de connecter netcheat à chaque fois. - Tant que j'y suis, voici comment faire, je vais faire l'impasse sur le décryptage de l'EBOOT.BIN en EBOOT.ELF, il y a des sujet sur le fofo expliquant la procédure. - Ouvrez votre ELF avec un éditeur hexadécimal et rechercher votre offset, mais ATTENTION, une petite opération est à faire. Vous devez soustraire 10000 à votre offset netcheat pour avoir la bonne adresse dans l'EBOOT, ici, "001B3DDC" devient donc "001A3DDC":
- hxd1:
- Vous pouvez constater que le code est bon, il vous suffit de le réécrire:
- hxd2:
- Sauvegardez, quittez, réencryptez et remplacez votre EBOOT.BIN cheaté dans votre jeu et "Infinite Ammo/No Reload" activé . - Pour ceux qui partagent, vous pouvez aussi faire des paternes de codes compatibles avec le prog de "codemasters project", "CMPAutoTools", en copiant une série de code autour, exemple ici en 32 bytes:
- hxd2:
- Pensez également à vérifier si ce paterne est unique dans l'EBOOT, dans le cas contraire, cela peut entrainer des conflits et donc des bugs:
- hxd3:
Et là, cela veut dire que c'est bon, vous avez votre code et de plus sous tout les formats utilisables sur PS3, résultat ici: RE Code Veronica "Infinite Ammo/No Reload"
B) Infinite Ink Ribbon:
Malheureusement, le code précédent ne fonctionne que pour les armes, le ruban encreur étant un item, il lui faut sont propre code. Petite astuce pour ce jeu, ce ne sont pas les différents objets ou armes qui ont leurs offsets mais les cases de l'inventaire. - Si mon arme est dans la seconde case et que mon ruban encreur est dans la première, pas besoin de recherche par netcheat, mon offset est juste au dessus de celui de mon pistolet:
- Memory1:
- Ce qui nous donne "00BC3A90 001F0001", donc les 2 premiers bytes "001F" sont pour mon ruban et les 2 seconds "0001" sont pour la quantité dont je dispose. - Comme breakpoint, je vais donc poser "00BC3A92" (en 2 bytes), mais il est conseillé de faire minimum 2 essais de breakpoint pour pouvoir faire des comparaisons (avec 1 seul ruban, je ne peux faire qu'un seul essai) , je vais donc sous netcheat remplacer "0001" par "0063", ce qui me donne 99 rubans encreur. - Retour dans le debugger de Target Manager, j'active mon breakpoint en mode lecture, je retourne dans le jeu pour faire une sauvegarde, bim, freeze:
- ps3debugger4:
- Analyse, sachant que ma valeur à du passer de "0063" à "0062": * Dans la fenêtre "disassembly" je trouve l'opération "stw r3,0x0(r4)" (en bas), opérationen 4 bytes, la encore, mettre une valeur "NOP" comme ceci "001D9128 60000000", devrait suffire, mais je vais quand même pousser lol. * Dans la fenêtre "memory" pas de surprise, mon ancienne valeur est affiché "001F0063". * Enfin dans la fenêtre "registers", pas besoin de se casser la tête, le registre 3 m'indique bien ma nouvelle valeur "001F0062". - Retour dans le jeu pour sauvegarder à nouveau histoire de faire un deuxième essai:
- ps3debugger5:
- Tout est ok niveau valeur et petit bonus, une opération addic qui influe directement sur mon registre 3, "001D9118 3063FFFF", qu'il me suffit de modifier comme pour mes munitions en "001D9118 30630000". - Je désactive mon breakpoint et go dans netcheat pour rentrer mes codes "OFF/ON" et faire le test:
- netcheat4:
Et... Fonctionnel, je vais pouvoir passer à la suite.
A suivre au prochain épisode... lol | |
|