ASMルーチンコード作成について[3DS改造解析]

※こちらの記事ではASMルーチンコードの作成について解説していきます。

 

LDR = 読込命令

LDRオペランドに指定されたアドレスの値を

デスティネーションレジスタに代入する。

STR = 書出命令

STR デスティネーションレジスタの値を

オペランドに指定されたアドレスに書き込む。

LDR/STRのバイト数リスト:

LDR 4byte / STR 4byte

LDRH 2byte / STRH 2byte

LDRB 1byte / STRB 1byte

 BX分岐と命令セットの切り替えを行う命令

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489ij/CIHGJAEJ.html

 

レジスタ(r)この記事では仮とします。

r0 = 00002FF9 r1 = 45ED55AF

r2 = 0815EEC0 r3 = 0987B700

r4 = 007816B0 r5 = 00000000

r6 = 00000000 r7 = 00000003

r8 = 00180F08 r9 = 00000001

r10 = 00AA41C8 r11 = 09879EEA

r12 = 0000188C sp = 0FFFF104

lr = 00291A58 pc = 006E1804

 lr = 分岐前のアドレス[Base] 0x291A58

pc = 分岐先のアドレス[Target] 0x6E1804

 

lr = 00291A58 E5920678 >> LDR r0, [r2, + #0x678]

[] = メモリ

# = 即値

[r2, + #0x678] は r2[0815EEC0] の基準値アドレスから #0x678 加算したアドレスを r0[00002FF9] に読み込んでいます。

pc = 006E1804 00000000 は 空きアドレスです。

 

ASMルーチンコードの作成に至っては、

00291A58 から 006E1804 へ分岐を行う必要があります。

※分岐については大体リンク付き分岐命令(BL)をおすすめします。

00291A58 から 006E1804 までの分岐値[加減値]を割り出すには、

16進数の計算機[電卓]を使います。

計算方法:

1. 6E1804 - 291A58 = 44FDAC

2. 44FDAC ÷ 4 = 113F6B

3. 113F6B - 2113F69

A_ 113F69

 分岐値が割り出せたら、

00291A58E5920678EB113F69 >> BL 0x6E1804 に 書き換えてください。

これで分岐は完了しましたが、ここからASMを組み立てていきます。

00291A58E5920678  分岐先アドレス[006E1804] でASMを組み立てる際または、組み立てた後に必ず配置してください。※もし配置しなかった場合はクラッシュします。

組み立て:

006E1804 E5920678 >> LDR r0, [r2, + #0x678]

006E1808 E3A00001 >> MOV r0, #0x1

006E180C E5820678 >> STR r0, [r2, + #0x678]

006E1810 E12FFF1E >> BX lr

00291A58 EB113F69 >> BL 0x6E1804

 r0 は 元々00002FF9 でしたが、MOV r0, #0x1 によって

r0 は 00000001 にコピーされました。

新しい r0 は、STR r0, [r2, + #0x678] によって

[r2, + #0x678] したアドレスに書き出しています。

プログラムを終了するため、今回リンク付き分岐命令によって分岐が成り立っているのでBX lr でリンクを返します

 

以上で解説を終了します。

お疲れ様でした(⌒∇⌒)