2007年6月18日月曜日

DSブラウザ パッチ

中身が Opera だけあって使えないこともない
NintendoDS のウェブブラウザ "DSブラウザ" ですが、
DSメモリー拡張カートリッジを挿さないと立ち上がらないところが非常にうざいです。

無線LANが使える環境で縛られるのでほとんど使用しないのは確かですが、
いざというとき(?)のために何とかならないものかと思っていましたが、
国内最大の某掲示板(のキャッシュ)にパッチを発見しました。
なんでもDSブラウザのROMイメージにこのパッチをあて R4 から起動すると、
M3 Perfect Lite を拡張カートリッジ代わりに利用することができるそうです。
内容は以下のとおりです。

アドレス 00004800 - 00004803
EE 30 05 EA

アドレス 00150BC0 - 00150C9F
B4 00 9F E5 1A 1B A0 E3 B0 10 C0 E1 68 00 8F E2
00 20 A0 E3 02 30 90 E7 B0 30 D3 E1 04 20 82 E2
3C 00 52 E3 FA FF FF 1A 88 00 9F E5 AA 1C A0 E3
55 10 81 E2 B0 10 C0 E1 80 10 9F E5 80 00 8F E2
00 20 A0 E3 02 30 90 E7 02 30 81 E7 04 20 82 E2
10 00 52 E3 FA FF FF 1A 74 10 9F E5 02 01 A0 E3
01 00 40 E2 00 00 81 E5 68 10 9F E5 01 00 A0 E3
00 00 81 E5 01 C3 A0 E3 F1 CE FA EA 00 00 00 08
02 00 E0 08 0E 00 00 08 FC 1F 80 08 4A 10 00 08
12 06 80 08 00 00 00 08 66 1B 80 08 0C 00 80 08
0E 08 00 08 00 00 00 08 E4 01 00 08 E4 01 00 08
88 01 00 08 88 01 00 08 FE EF FF 09 04 02 00 04
B0 00 00 08 FF FF 00 00 00 24 24 24 FF FF FF FF
FF FF FF 7F FC FF 01 08 00 00 24 08 00 00 00 00

これだけだとなんなのでちょっと中身を確認してみました。
NintendoDS のCPUはARM系なのですが、
ARMの場合、データの羅列を見ているだけで命令とデータの区別がある程度つきます。

DSブラウザのROMイメージを眺めていると、
0x480000 からプログラムが始まっているようで、
パッチでもここを変更しています。
つまり、0x480000 からどこかにジャンプして何らかの処理をした後、
もともと0x480000で行っていた処理を実行し、
ARM(32ビット)モードなので 0x480004 に戻してあげれば、
何事もなかったかのようにオリジナルの動作をすることとなります。
もちろん追加処理部分はオリジナルで未使用なメモリ領域に格納する必要があります。

さて、上記を逆アセンブルすると以下のような感じになります。

0x00004800:
    b 0x150bc0

0x00150bc0:
    ldr r0,0x00150c7c ; = #0x04000204
    mov r1,#0x6800
    strh r1,[r0,#0]
    add r0,pc,#0x68  ; #0x150c3c
    mov r2,#0
    ldr r3,[r0,r2]
    ldrh r3,[r3,#0]
    add r2,r2,#4
    cmp r2,#0x3c
    bne 0x150bd4
    ldr r0,0x00150c78 ; = #0x09ffeffe
    mov r1,#0xaa00
    add r1,r1,#0x55
    strh r1,[r0,#0]
    ldr r1,0x00150c80 ; = #0x080000b0
    add r0,pc,#0x80  ; #0x150c84
    mov r2,#0
    ldr r3,[r0,r2]
    str r3,[r1,r2]
    add r2,r2,#4
    cmp r2,#0x10
    bne 0x150c04
    ldr r1,0x00150c94 ; = #0x0801fffc
    mov r0,#0x80000000
    sub r0,r0,#1
    str r0,[r1,#0]
    ldr r1,0x00150c98 ; = #0x08240000
    mov r0,#1
    str r0,[r1,#0]
    mov r12,#0x04000000
    b 0x4804
0x00150c3c:
    0x08000000
    0x08e00002
    0x0800000e
    0x08801ffc
    0x0800104a
    0x08800612
    0x08000000
    0x08801b66
    0x0880000c
    0x0800080e
    0x08000000
    0x080001e4
    0x080001e4
    0x08000188
    0x08000188
    0x09ffeffe
    0x04000204
    0x080000b0
    0x0000ffff
    0x24242400
    0xffffffff
    0x7fffffff
    0x0801fffc
    0x08240000
    0x00000000
0x00150ca0:

追加処理部分をC言語風に書くと以下のようになります。

    (volatile unsigned short int*)0x04000204=0x6800;
    volatile unsigned short int* data1[]={
        0x08000000,0x08e00002,0x0800000e,0x08801ffc
        0x0800104a,0x08800612,0x08000000,0x08801b66
        0x0880000c,0x0800080e,0x08000000,0x080001e4
        0x080001e4,0x08000188,0x08000188};
    unsigned int data2[]={0x0000ffff,0x24242400,0xffffffff,0x7fffffff};
    int i;
    unsigned short int s;

    for(i=0;i<sizeof(data1)/sizeof(data1[0]);i++)
        s=*(data1[i]);
    (volatile unsigned short int*)0x09ffeffe=0xaa55;
    memcpy((volatile unsigned int*)0x080000b0,data2,sizeof(data2));
    (volatile unsigned int*)0x0801fffc=0x7fffffff;
    (volatile unsigned int*)0x08240000=0x00000001;
    return;

よくわかりませんが 0x04000204 はDSの内部レジスタ、
0x08000000台 は M3 Perfect Lite のレジスタなのでしょうか、
いろいろレジスタを操作しているようです。
で、実際パッチを当てると見事動作。
これで完璧です。

ちなみにG6を拡張カートリッジ代わりにする場合のパッチは以下だそうです。

アドレス 00004800 - 00004803:
EE 30 05 EA

アドレス 00150BC0 - 00150C9F
B4 00 9F E5 1A 1B A0 E3 B0 10 C0 E1 68 00 8F E2
00 20 A0 E3 02 30 90 E7 B0 30 D3 E1 04 20 82 E2
38 00 52 E3 FA FF FF 1A 88 00 9F E5 AA 1C A0 E3
55 10 81 E2 B0 10 C0 E1 80 10 9F E5 80 00 8F E2
00 20 A0 E3 02 30 90 E7 02 30 81 E7 04 20 82 E2
10 00 52 E3 FA FF FF 1A 74 10 9F E5 02 01 A0 E3
01 00 40 E2 00 00 81 E5 68 10 9F E5 01 00 A0 E3
00 00 81 E5 01 C3 A0 E3 F1 CE FA EA 00 00 00 09
E0 FF FF 09 EC FF FF 09 EC FF FF 09 EC FF FF 09
FC FF FF 09 FC FF FF 09 FC FF FF 09 4A FF FF 09
4A FF FF 09 4A FF FF 09 0C 00 20 09 F0 FF FF 09
E8 FF FF 09 88 01 00 08 FE EF FF 09 04 02 00 04
B0 00 00 08 FF FF 00 00 00 24 24 24 FF FF FF FF
FF FF FF 7F FC FF 01 08 00 00 24 08 00 00 00 00

2 件のコメント:

  1. wow gold!All wow gold US Server 24.99$/1000G on sell! Cheap wow gold,wow gold,wow gold,Buy Cheapest/Safe/Fast WoW US EU wow gold Power leveling wow gold from the time you wWorld of Warcraft gold ordered!

    wow power leveling wow power leveling power leveling wow power leveling wow powerleveling wow power levelingcheap wow power leveling wow power leveling buy wow power leveling wow power leveling buy power leveling wow power leveling cheap power leveling wow power leveling wow power leveling wow power leveling wow powerleveling wow power leveling power leveling wow power leveling wow powerleveling wow power leveling buy rolex cheap rolex wow gold wow gold wow gold wow gold -20149530999064

    返信削除
  2. Hi,Do you need digital signages, advertising displays, digital sign, advertisement displays and advertising players? Please go Here:www.amberdigital.com.hk(Amberdigital).we have explored and developed the international market with professionalism. We have built a widespread marketing network, and set up a capable management team dedicated to provide beyond-expectation services to our customers.
    amberdigital Contact Us
    website:www.amberdigital.com.hk
    alibaba:amberdigital.en.alibaba.com[gfcagfifeihddb]

    返信削除