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
avatar
Zeroblog

« 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

61

Merci pour les explications Zero ! smile
avatar
----- SNK Forever -----
Association Retro-gaming Connexion : http://www.retro-gc.fr/
http://www.consoles-portables.com

62

De rien smile
avatar
Zeroblog

« 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

63

Putain c'est beau merci Zerosquare ! Du coup si on arrive à résoudre le problème de la cartouche qui n'est pas lue on peut imaginer faire un dump juste en mettant à la masse le PT 79 sans avoir besoin d 'autre chose (que le lien série j'entends) ? Le but est effectivement de faire le truc le moins intrusif possible pour les modèles rares en effet

En tout cas le timing est marrant, c'est la saison des dumps on dirait : il y a eu l'appel aux dumps des CRT Sony BVM il y a 10 jours puis celui de Byuu juste après (ou alors c'est juste l'effet de ma bulle cognitive 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 Meilleur smiley = #helico# Obligatory XKCD

64

Excellent ! On parlait justement des tweets de Trap15 avec Byuu de cette lecture de bouton-qui-existe-pas.
J'étais prêt à essayer ça demain sur la Crystal qu'on m'envoie, en collant le programme de dump à 4000:0000 avec le FPGA.

Bien ouej avec le 0xCD fourni "en dur", c'est la classe grin
avatar
Je fais des trucs. Des fois ça marche, des fois ça marche pas.

65

Nhut (./58) :
Sérieux j'ai absolument rien compris mais bravo pour votre travail cheeky

Idem grin
avatar
MK !
Collectionneur, retrogamer.
Enfin, un peu moins maintenant.

66

Bon ben les gars, ils ne vous reste plus qu’à dumper la zone des certifs sur la 89, hein ? cheeky

67

C'est deja fait tu sais? grin
avatar
Proud 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.

68

QUOI ??? J’ignorais grin