Editiamo l'intro del prof [Dirottare le sub-routine]

« Older   Newer »
 
  Share  
.
  1.     Top   Dislike
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,092
    Crediti HRF
    +2

    Status
    Offline
    Salve a tutti ragazzi :)
    Oggi vorrei postare un piccolo tutorial su una ricerca che sto svolgendo in questi giorni per la mia hack riguardante l'intro del professore ^^
    infatti pochissime hack modificano l'intro del prof (quasi tutti solo la parte grafica)
    oggi quindi vi insegnerò come modificarla in alcuni passaggi che a mio avviso risultano fastidiosi :)
    per questo tutorial ci basterà un semplice Hex editor in quanto dovremmo cambiare solamente alcuni byte ^^

    PASSO N°1:
    aprite la rom con il vostro hex editor :)
    (CONSIGLIO HxD)
    PASSO N°2:
    Come seconda cosa recatevi al seguente offset:
    A3C4
    in questo offset c'è l'offset della routine che fa apparire azzurill nell'intro
    in questo caso i byte che ci ritroveremo saranno questi:
    C9 A3 00 08
    per togliere azurill dobbiamo sovrascrivere l'offset A3C4 con i valori "29A5"
    perchè proprio con questi valori?
    guardiamo la routine nel dettaglio:
    0800A3B6 LDR R0, =(c3_HiSorryToKeepYouWaiting+1)
    0800A3B8 STR R0, [R4]
    ---------------------------------------------
    0800A3C4 off_800A3C4: .long c3_HiSorryToKeepYouWaiting+1 @ DATA XREF: sub_800A358+5Er

    la prima parte di routine carica in r0 la routine dove fa apparire azurill
    alla fine di ogni routine ci sono gli offset utilizzati a noi ci interessa quello della routine di azzurill in questo caso 0800A3C4
    Per chi non lo sapesse per richiamare le routine bisogna aggiungere +1 all'offset in cui è collocata la routine
    quindi:
    0800A528 +1 = 0800A529 ---> 29A50008
    abbiamo aggiunto 1 e ribaltato a gruppi da 2 i byte :)
    questa è la routine richiamata:
    0800A528 sub_800A528: @ DATA XREF: sub_800A4B8+28o
    0800A528 @ ROM:off_800A520o
    0800A528 PUSH {R4,LR}
    0800A52A LSLS R0, R0, #0x18
    0800A52C LSRS R4, R0, #0x18
    0800A52E MOVS R0, #0x18
    0800A530 BL sub_8072CF4
    0800A534 LSLS R0, R0, #0x18
    0800A536 CMP R0, #0
    0800A538 BEQ loc_800A552
    0800A53A LDR R0, =aThisWorldIsWidelyInhabitedByCre @ "This world is widely inhabited by creat"...
    0800A53C MOVS R1, #3
    0800A53E MOVS R2, #0xE
    0800A540 BL sub_8072010
    0800A544 LDR R1, =callback3
    0800A546 LSLS R0, R4, #2
    0800A548 ADDS R0, R0, R4
    0800A54A LSLS R0, R0, #3
    0800A54C ADDS R0, R0, R1
    0800A54E LDR R1, =(c3_AndYouAre_maybe+1)
    0800A550 STR R1, [R0]

    anche chi non conosce l'asm può intuire che abbiamo richiamto la routine che fa apparire il testo successivo ad azurill che esce dalla pokeball :)
    un'altro punto a mio parere fastidioso è la scelta del personaggio "BOY GIRL"
    in questo caso io ho fatto in modo che la routine della scelta del nome partisse automaticamente dopo aver finito il discorso del professore, ma andiamo con ordine:
    Rechiamoci all'offset A5A8 e li sovrascriviamo con i valori "ADAA"
    ci ritroveremo con questi byte:
    AD A5 00 08
    questa è la routine che ci è d'intralcio:
    0800A564 c3_AndYouAre_maybe: @ DATA XREF: sub_800A528+26o
    0800A564 @ ROM:off_800A560o
    0800A564 PUSH {R4,LR}
    0800A566 LSLS R0, R0, #0x18
    0800A568 LSRS R4, R0, #0x18
    0800A56A MOVS R0, #0x18
    0800A56C BL sub_8072CF4
    0800A570 LSLS R0, R0, #0x18
    0800A572 CMP R0, #0
    0800A574 BEQ loc_800A59A
    0800A576 MOVS R0, #2
    0800A578 MOVS R1, #0xD
    0800A57A MOVS R2, #0x1B
    0800A57C MOVS R3, #0x12
    0800A57E BL sub_8071F08
    0800A582 LDR R0, =aAndYouAre @ "And you are?"
    0800A584 MOVS R1, #3
    0800A586 MOVS R2, #0xE
    0800A588 BL sub_8072010
    0800A58C LDR R1, =callback3
    0800A58E LSLS R0, R4, #2
    0800A590 ADDS R0, R0, R4
    0800A592 LSLS R0, R0, #3
    0800A594 ADDS R0, R0, R1
    0800A596 LDR R1, =(sub_800A5AC+1)
    0800A598 STR R1, [R0]

    questo sarebbe l'offset che andremo a modificare collocato all'offset A5A8:
    0800A5A8 off_800A5A8: .long sub_800A5AC+1 @ DATA XREF: c3_AndYouAre_maybe+32r

    la routine per rinominare il player è collocata all'offset AAAC
    in questo caso il ragionamento è analogo :)
    quindi:
    0800AAAC +1 = 0800AAAD ---> ADAA0008
    quindi ci basterà sostiuire i byte per dirottare la routine :)
    Un'ultima cosa che potrebbe essere utile è quella di partire da un pointer diverso del testo :)
    in questo caso l'offset da cui partono i message e i seguenti offset sono questi:
    081C6E1A .ascii "s POKeMON._We humans live alongside POKeMON, at tim"
    081C6E1A .ascii "es as friendly playmates, and_at times as cooperati"
    081C6E1A .ascii "ve workmates._And sometimes, we band together and b"
    081C6E1A .ascii "attle others like us._But despite our closeness, we"
    081C6E1A .ascii " don`t know everything about POKeMON._In fact, ther"
    081C6E1A .ascii "e are many, many secrets surrounding POKeMON._To un"
    081C6E1A .ascii "ravel POKeMON mysteries, I`ve been undertaking rese"
    081C6E1A .ascii "arch._That`s what I do._"

    ci bastera cambiare pointer nella routine che abbiamo richiamato al posto di azurill ^^
    recatevi all'offset A558 vi ritroverete con questi byte:
    1A 6E 1C 08
    Per cambiare il pointer del testo non vi resta che invertire il vostro offset della tabella sopra e incollarlo al posto di quello vecchio.
    Spero di essermi spiegato il più chiaro possibile ^^ se avete dubbi, consigli, critiche lasciate un commento :)
     
    Top
    .
0 replies since 8/3/2014, 15:57   46 views
  Share  
.