30

Ha bah ça ne devrait plus tarder grin



Décidemment il y en a certains qui sont plus productifs que moi le dimanche helico
avatar"If you see strict DRM and copy protection that threatens the preservation of history, fight it: copy the work, keep it safe, and eventually share it so it never disappears. [...] no one living 500 years from now will judge your infringing deeds harshly when they can load up an ancient program and see it for themselves."

Benj Edwards - Why History Needs Software Piracy

- - -
Achat ou échange: topic de mes recherches

31

(Ça fait un moment qu’il est dessus, je l’avais poussé un peu il y a longtemps)
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

32

Ça reste incroyable love

(Merci Zerosquare pour les explications. Je vois mal comment tu peux faire ça juste l'espace d'une instruction ceci dit confus)
avatarHighway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

33

Ça se fait en remplaçant le quartz d'horloge par quelque chose qui peut générer un signal contrôlable et à fréquence suffisamment élevée, par exemple un FPGA :

1) reset du CPU
2) génération d'un signal d'horloge normal pendant N cycles
3) génération d'un signal d'horloge accéléré pendant 1 ou plusieurs cycles pour créer une race condition interne
4) retour à la normale

Toute la difficulté est de déterminer les paramètres qui donnent quelque chose d'exploitable (et d'avoir de la chance, parce qu'il n'y a pas de garantie que ça fonctionne).
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

34

Jonas (./30):Décidemment il y en a certains qui sont plus productifs que moi le dimanche helico
Tu veux dire qu'on est censé bosser en semaine et glander le w-e ? J'ai tout inversé encore triso

@Godzil m'en avait parlé il y a 120 ans oui, je m'en souviens bien !

Post à rallonge ici plutôt qu'un article sur mon site car je pense que Yaronet tiendra plus longtemps, puis ça fait moins "appropriation".

C'est une variante de ce qu'avait fait Costis pour extraire la ROM de la Gameboy Color, à savoir: faire glitcher le CPU pendant un court instant afin de lui faire sauter l'étape qui désactive l'accès à la ROM interne.
Trap15 (et peut être d'autres) ont documenté le fait que la désactivation se faisait certainement comme sur la Gameboy: en soft, en changeant un bit dans un registre juste avant de passer la main au jeu.
Pas moyen de refaire passer le bit à son état initial à moins de balancer un reset, donc lecture impossible depuis le programme en cartouche.
Protection de PI ? Courtoisie pour laisser le jeu prendre tout l'espace mémoire ? Who knows.

Comme sur la GB Color, les accès dans la ROM interne n’apparaissent pas sur le bus cartouche, donc pas moyen de savoir exactement quand la désactivation se fait.
Pas bien grave puisque ça doit théoriquement se produire juste avant les premiers accès à la cartouche, qui eux sont bien sur visibles.

Avec un bout de logique dans le FPGA pour simuler le "ok signal" du mapper nécessaire au boot (et la vérif supplémentaire des registres 0xC2 et 0xC3 que la Wonderswan Color fait... grrr), j'ai utilisé un compteur sur les fronts de CLK (master clock / 32) pour ignorer les quelques accès cartouche qui se produisent pendant que la ROM interne récupère des infos/flags du jeu.

Après ce délai, il reste quelques µs avant que le jeu démarre. La logique passe dans un autre mode, où la master clock passe de 12.5MHz à 100MHZ (yolo !) tant que le bus d'adresse est au dessus de $F0000 (segment $F, où la ROM doit forcément être mappée, du moins en partie).
Dès que l'adresse est en dehors, c'est qu'on a passé l'étape de désactivation donc plus la peine de pousser le CPU aux fesses.

Avec un petit bout de code "servi" par le FPGA, j'ai pu vérifier si le CPU fonctionnait toujours et si la désactivation se faisait ou non en affichant l'état du bit via les icones de l'écran.
Ça prend quelques octets, pas chiant à copier.

Comme j'avais mal au doigt à force d'éteindre et d'allumer la console pour chaque essai, j'ai collé un FET récupéré sur une carte mère de laptop (vive l'e-waste...) pour piloter l'alimentation depuis le FPGA.
Direct le 3.3V sans passer par le petit module d'alim. Pas de tensions pour l'écran mais bizarrement les icônes fonctionnaient toujours.

Après pas mal d'ajustements sur la valeur limite du compteur et le switch de fréquence, joie: les icônes fixes s'allument mais l'icone correspondant au bit de verrouillage ne s'allume plus. C-à-d le code a été exécuté et la ROM interne n'a pas été désactivée.

A partir de là c'est allé bien plus vite: j'ai changé le "payload" pour balancer le contenu de $FF000~$FFFFF sur le port link. Je lui ai collé un câble USB-série reprogrammé pour inverser RXD, log dans Teraterm et hop.
J'ai misé sur une taille de 4ko en commençant le dump à $FF000. Coup de bol c'était bien ça, toutes les adresses en dehors (mis à part celles pour la RAM) retournaient mon programme.


Pour la Wonderswan Color, même recette sauf que j'ai bêtement calé sur le module d'alim différent et sa capacité à se couper sur commande du CPU.
Après avoir essayé de le contrôler "proprement" via le FPGA, je l'ai dégagé pour fournir directement le 3.3V et le reset. Je n'ai pas pu le laisser comme sur la WS car il n'aimait pas le 3.3V à sa sortie alors qu'il n'était pas en marche -> court circuit à la masse.

Passé ça, je vérifie que ma "cartouche" démarre à vitesse normale comme précédemment: c'est pas le cas. Je me rends compte après trop de temps qu'il y a des vérifs supplémentaires sur WS Color (d'où le grrr plus haut), je met les réponses attendues en dur et ça finit par se lancer. Toutes les icônes sont allumées, normal.

Nouvelle phase d'ajustements pour trouver le bon moment où commencer l'overclock. Les résultats se font attendre, jusqu'à ce que je me rende compte que la console continuait de tourner même après avoir coupé le FET. Il restait un joli 2.5V sur le rail 3.3V, stable, pas une décharge de condo lente. Pour cause, le FPGA qui forçait à 1 quelques bits du bus de données cartouche car il voyait le signal nRD (read) bas. Le 3.3V des bits passait dans les diodes de protection et finissait par maintenir le rail d'alim suffisamment haut pour que le CPU continue de tourner ! C'est dingue, ce truc consomme RIEN o_o

Bref, j'ai corrigé la logique pour que le FPGA se taise tant que nRESET n'est pas haut et ça a fini par fonctionner. L'alim tombait bien à 0V entre les essais et le reset se faisait correctement.
Dump à partir de $FF000, le premier saut indique que l'entry point est en fait à $FE000. Re-dump à partir de $FE000 cette fois et voilà, une ROM de 8ko.

Full disclosure: j'ai dit à Byuu que je n'allais pas accepter l'intégralité de la somme proposée. Ne me tapez pas merci.

Pas encore trop gore:
P1140167.JPG

Gore avec la Wonderswan Color:
P1140168.JPG

Le transistor pour l'alim et le cable série soudé sur le connecteur ext façon goret:
P1140169.JPG

Oscillateur remplacé par le FPGA (condo 100pF en série):
P1140170.JPG

Quelqu'un en Allemagne va me prêter une Crystal pour faire pareil smile
Byuu s'attend à ce que ce soit pratiquement la même ROM que sur Color.
avatarJe fais des trucs. Des fois ça marche, des fois ça marche pas.

35

Félicitations, c'est top ! top

Tu accepterais de partager le dump en privé ? Y'a des choses dedans que Godzil et moi aimerions décortiquer smile

Pour le fric, si ça fait trop pour toi, pourquoi ne pas dans l'achat de matos WS rare à reverse-engineerer ? ^^
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

36

En tout cas, je confirme que ce n'est pas une blague :
cdr5 egMs

Indice pour ceux qui veulent faire pareil : à l'offset 0x32, remplacer 75 03 E9 06 par 90 90 90 90 smile
Pour la ROM de la WSC, ce n'est pas suffisant, il y a d'autres choses à patcher (pas encore analysé).
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

37

top

38

Oui pas sur de comprendre pourquoi tu n'accepterais pas la somme ? smile
avatarHighway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

39

Félicitations pour ton travail et aussi pour la vitesse a laquelle tu l a fait trophy

40

bravo !

41

Yep tu mérites carrément la somme et même si tu ne veux pas la prendre pour toi perso tu peux l'accepter pour qu'une partie serve pour l'achat de Wonderswans à dumper! Dans tous les cas félicitations, c'est une belle étape de franchie !
avatar"If you see strict DRM and copy protection that threatens the preservation of history, fight it: copy the work, keep it safe, and eventually share it so it never disappears. [...] no one living 500 years from now will judge your infringing deeds harshly when they can load up an ancient program and see it for themselves."

Benj Edwards - Why History Needs Software Piracy

- - -
Achat ou échange: topic de mes recherches

42

elles sont différentes
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

43

Zerosquare (./35) :

Pour le fric, si ça fait trop pour toi, pourquoi ne pas dans l'achat de matos WS rare à reverse-engineerer ? ^^

Je plussois il y a le sonar que je cherche depuis un moment
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

44

J’avais documenté ce qui reste dans l’IRAM avant le saut vers l’inconnu:

avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

45

Pffft ils passent même pas un coup de balais quoi.

Je discute avec Byuu pour voir comment répartir la somme pour en faire +, je vais lui parler du sonar aussi.
avatarJe fais des trucs. Des fois ça marche, des fois ça marche pas.

46

Je vais créer un hotel autel du reverse engineering et mettre une figurine coyote avec des cierges helico

Merci pour les explications en tout cas !
avatar"If you see strict DRM and copy protection that threatens the preservation of history, fight it: copy the work, keep it safe, and eventually share it so it never disappears. [...] no one living 500 years from now will judge your infringing deeds harshly when they can load up an ancient program and see it for themselves."

Benj Edwards - Why History Needs Software Piracy

- - -
Achat ou échange: topic de mes recherches

47

Jonas (./46) :
Je vais créer un hotel du reverse engineering
Autel, pas hôtel (ou alors tu vois vraiment les choses en grand grin).
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

48

Genre comme les retraites d'écrivains mais pour les hackers?
avatarQue cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

49

cheeky
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

50

Zerosquare (./47) :
Jonas (./46) :
Je vais créer un hotel du reverse engineering
Autel, pas hôtel (ou alors tu vois vraiment les choses en grand grin).

Voilà ce que c'est d'écrire la nuit quand on a besoin de sommeil grin
avatar"If you see strict DRM and copy protection that threatens the preservation of history, fight it: copy the work, keep it safe, and eventually share it so it never disappears. [...] no one living 500 years from now will judge your infringing deeds harshly when they can load up an ancient program and see it for themselves."

Benj Edwards - Why History Needs Software Piracy

- - -
Achat ou échange: topic de mes recherches

51

Fait chier, j'ai normalement toutes les pièces du puzzle pour faire quelque chose, mais ça marche pas. Vais aller dormir.

(indice obscur : "79").
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

52

T'es sur quel fuseau en ce moment ?
avatarQue cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

53

UTC+0²
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

54

Zerosquare (./51) :
Fait chier, j'ai normalement toutes les pièces du puzzle pour faire quelque chose, mais ça marche pas. Vais aller dormir.

(indice obscur : "79").
C est parceque tu fais des projets Wonderswan dans le feutré et sans rien dire sur ce que c est cool

55

Dans wondersouane il y a wonder après tout !
avatarJe fais des trucs. Des fois ça marche, des fois ça marche pas.

56

Y a Souane aussi cheeky
avatarSpartine, la fille que ce soir elle dîne en enfer: http://www.spartine.com

Pockett Videogames, le site de toutes les consoles portables!: http://www.pockett.net

J'aime beaucoup faire des dessins aux petites filles! C'est ma passion.

57

Et hop ! J'ai chopé la ROM interne de la Swan Crystal, et sans clock glitch cette fois smile

qc5Q uHCj

Sans surprise, elle est très similaire (mais pas identique) à celle de la Color.

Merci à Furrtek pour le boulot sur les Swan N&B et Color, sans qui ça n'aurait pas été possible.
Merci également à Godzil pour le prêt de son Wonderwitch et pour le Wonderlyzer, sans qui ç'aurait été beaucoup plus casse-pieds smile
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

58

Sérieux j'ai absolument rien compris mais bravo pour votre travail cheeky
avatarSpartine, la fille que ce soir elle dîne en enfer: http://www.spartine.com

Pockett Videogames, le site de toutes les consoles portables!: http://www.pockett.net

J'aime beaucoup faire des dessins aux petites filles! C'est ma passion.

59

Bravo , félicitations !
Peut tu par curiosité, expliquer vite fait la methode ?

60

Merci smile

Le point de départ, c'est que les dumps effectués par Furrtek ont permis de découvrir quelque chose de très intéressant : il y a une backdoor intégrée dans la ROM de boot, et ce sur toutes les versions de la Wonderswan !

Voici le début de la ROM désassemblé :
cli
std
clc
mov     ax, 0
mov     bx, ax
mov     cx, ax
mov     dx, ax
mov     ss, ax
mov     ds, ax
mov     es, ax
mov     sp, 2000h
mov     bp, ax
mov     si, ax
mov     di, ax
mov     al, 4
out     0A0h, al        
mov     al, 0           ┓
out     0B5h, al        ┃
in      al, 0B5h        ┃        
test    al, 1           ┃ backdoor ici !
jz      short loc_2E    ┃
jmp     far ptr 4000h:0 ┃
loc_2E:                 ┛
Si le test de la backdoor réussit, le code présent dans la cartouche à l'adresse 4000h:0000h est exécuté immédiatement, sans vérification ni verrouillage de la ROM de boot.

Pour comprendre comment ça marche, il faut savoir que la lecture des boutons sur WonderSwan fonctionne en deux temps :
1) on active un groupe de 4 boutons à lire
2) on lit l'état de ces 4 boutons
3) rebelote pour le groupe de boutons suivant, jusqu'à avoir lu tous les boutons

Le test fait quelque chose d'à priori absurde : il désactive tous les groupes de boutons, puis lit l'état pour voir si un bouton est enfoncé. En fonctionnement normal, c'est bien sûr impossible.
Mais on peut faire réussir le test avec un peu de triche : en court-circuitant directement l'entrée correspondante à la masse, le bouton est toujours détecté comme enfoncé, même sans avoir de groupe sélectionné. C'est ce à quoi fait référence (sans le dire explicitement) trap15 dans sa série de tweets. Et c'est aussi pour ça que je parle de "79" dans le post ./51 : c'est le numéro du point de test de la Wonderswan Crystal qu'il faut mettre à la masse pour activer la backdoor smile

Sachant qu'on peut exécuter du code, dumper la ROM est assez trivial... en théorie. J'ai d'abord essayé la méthode la plus simple : écrire le code de dump dans la mémoire Flash d'un WonderWitch à la bonne adresse (4000h:0000h). Sauf que je n'ai jamais réussi à faire exécuter le code... je ne sais pas pourquoi exactement, peut-être un effet secondaire du fait que la cartouche n'est pas initialisée quand on active la backdoor, contrairement à un boot normal.

Du coup, j'ai fini par trouver une autre méthode. C'est très low-tech sur le plan matériel : il n'y a pas besoin de FPGA, ni même de puce mémoire smile

Les ingrédients :
- une Wonderswan dont on veut dumper la ROM
- le code de dump kivabien
- une cartouche qui permet d'exécuter ce code (WonderWitch ou tout autre linker, même une simple cartouche officielle dont on a remplacé la ROM par une mémoire Flash programmée d'avance)
- deux boutons-poussoir
- un circuit intégré avec 8 buffer tri-state (j'ai utilisé un SN74LVC245A, mais on doit pouvoir faire pareil avec un 74HC244/245 ou équivalent par exemple)
- un câble série pour relier la Wonderswan au PC

La recette :
- souder le premier bouton poussoir entre le point commun aux boutons X1 et Y1 d'un côté, et la masse de l'autre. Ça se repère facilement au multimètre.
- souder le second bouton poussoir entre la broche /RESET du port cartouche et la masse.
- exécuter le code de dump, qui va faire plusieurs choses :
1) se copier en RAM interne
2) faire pointer les 256 vecteurs d'interruption vers une routine qui lit la ROM interne et envoie le résultat sur le port série
3) attendre dans une boucle infinie
- enlever la cartouche (oui, à chaud. Je sais, c'est pas bien embarrassed), et connecter le buffer au connecteur cartouche. J'ai utilisé le WonderLyzer de Godzil parce que c'est pratique, mais on peut aussi utiliser une cartouche quelconque dont on a retiré la ROM. Le buffer doit être connecté comme suit : broches d'alim reliées à 3.3 V et à la masse, broche /OE reliée au signal /RD, broches de données reliées à de façon à envoyer la valeur 0xCD sur les lignes D0 - D7.
4) lancer le programme qui va réceptionner le dump sur le PC
5) tout en maintenant le premier bouton enfoncé, appuyer brièvement sur le second bouton.
6) la console reboote. Note importante : la RAM interne n'est pas effacée !
7) la console détecte que la backdoor est activée, et exécute le JMP 4000h:0000h
8) le CPU lit la première instruction sur le bus. Grâce au buffer, il récupère 0xCD et un second octet quelconque (vu que rien n'est connecté à D8 - D15).
9) le CPU décode l'instruction : INT xxx, xxx étant la valeur du second octet
10) le CPU lit le vecteur correspondant dans la table d'interruption et saute à l'adresse indiquée. On ne sait pas quel est le vecteur qui sera utilisé, mais ça n'a aucune importance vu qu'ils pointent tous à la même adresse smile
11) le code de dump (qui est resté dans la RAM interne) s'exécute et dumpe la ROM sur le port série
12) profit !
13) optionnel : si la WonderSwan est un modèle rare qu'on a emprunté à un collectionneur, on dessoude proprement les deux boutons-poussoir, on remonte le tout soigneusement et on nettoie consciensieusement la coque avec une lingette microfibres pour qu'il ne s'aperçoive de rien tongue

PS : si on veut être encore plus minimaliste, il est possible que ça fonctionne en remplaçant le buffer par de simples résistances, ou même carrément en reliant directement D0 à D7 à VCC/GND... mais j'ai pas osé pousser le vice jusque là grin
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo