[Tiptoi] binaries im Weltatlas

Joachim Breitner mail at joachim-breitner.de
So Jan 17 17:58:17 CET 2021


Hi,

Am Sonntag, den 17.01.2021, 13:33 +0100 schrieb Matthias Weber via
tiptoi:
> ich wollte nochmal fragen, welches Binary du dir da genauer angesehen
> hast. Im Spiel befinden sich ja drei Binaries, die bisherige Vermutung
> ist iirc, dass die für die jeweilige Stift/CPU-Generation stehen:
> 
> Offset,Size
> 0x0AF48873,22248
> 0x0AF5B273,22244
> 0x0AF6DC6B,22252
> 
> Wobei die enthaltene Spiele-Logik denke ich gleich sein sollte.

richtig, das sollte man immer dazusagen. Für meinen Stift bearbeite ich
stets die zweite Version (also die für den ZC3202N).

Weiter Fortschritt: Ich konnte die OidMain.bin von WWW Europa so
ändern, dass er beim Anschalten einen anderen Ton ausgibt.

Konkret scheint die Funktion an Offset 140 des main-Arguments die zu
sein, die einen Ton ausgibt. Die vier Argumente sind (in diesem Binary)
immer Elemente der Arrays an Offsets 228, 232, 236 und 240. Das sieht
in Ghidra (ein paar Felder schon umbenannt) so aus:

    (*(code *)self->play_sound)
              ((uint)(ushort)self->playarg0[uVar8],(uint)(ushort)self->playarg1[uVar8],
               (uint)(byte)self->playarg2[uVar8],(uint)(ushort)self->playarg3[uVar8]);

Normalerweise spielt der Stift beim Anschalten die Audio-Dateien 0 und
1 ab. Wenn ich beim richtigen Aufruf den Array-Index (hier uVar8)
verändere, kann ich das ändern (etwa die Reihenfolge, doer zweimal
P(1), oder so).

Was nicht geht ist uVar8 = 2. Daraus schließe ich dass
so nur ein Element einer Playlist abgespielt wird, also nicht direkter
Zugriff auf die Media-Dateien. (Eine Skript-Zeile im GME-Format enthält
ja auch so eine Indirektion).

Was leider nicht ging ist den folgenden Code laufen zu lassen, in der
Hoffnung, dass dann die erste Audio-Datei ausgeführt wird. Also
vermutlich muss noch mehr initialisiert werden, oder zumindest
irgendwie die richtige “Playlist” geladen:

    typedef void (*foo)(short, short, char, short);
    int32_t _24_a(int32_t a1) {
       (*(foo*)(a1 + 140))(
         **((short **)(a1 + 228)),
         **((short **)(a1 + 232)),
         **((char **)(a1 + 236)),
         **((short **)(a1 + 240))
        );
        // die folgende Zeile ist nötig damit der Stift
        // danach noch tut.
        *(char *)(*(int32_t *)(a1 + 52) + 3564) = -1;
        return 255;
    }

Aber trotzdem, es gibt Fortschritte!

Cheers,
Joachim

-- 
Joachim Breitner
  mail at joachim-breitner.de
  http://www.joachim-breitner.de/







Mehr Informationen über die Mailingliste tiptoi