disarmというソフトをご存知でしょうか?
こちらで公開されている,ARMの逆アセンブラソフトです.
勿論GBAのROMを解析する時に良く使うわけですが・・・.
このソフトは数字の出力が「10進数」なんです!
で,それを書き換えて16進で表示させてやろうと.
適当に落としてきてgccでコンパイルしてみました.
***>make
gcc -O2 -mno-cygwin -c disarm.c
cc1.exe: Invalid option `no-cygwin'
In file included from disarm.c:19:
dis-asm.h:65: field `type name' has incomplete type
dis-asm.h:67: field `type name' has incomplete type
dis-asm.h:73: field `type name' has incomplete type
disarm.c: In function `dislarm_init':
disarm.c:143: warning: assignment from incompatible pointer type
disarm.c:144: warning: assignment from incompatible pointer type
disarm.c:146: warning: assignment from incompatible pointer type
make: *** [disarm.o] Error 1
工エエェェ(´д`)ェェエエ工
ちゃんとGCCつかったお!?
うーん・・・逆汗でもするか・・・?
と思ってとりあえずソースでも覗いてみたところ,16進数か10進数かの変更は関数の書式設定で設定されている模様.
こちらに書式に関する情報があります.
ということは,逆汗で覗いてもフォーマット情報は残っているはず.
逆アセンブラで覗いてみたところ,案の定こんな感じでした.
00403524 . F7C1 00008000 TEST ECX,800000
0040352A . 75 05 JNZ SHORT DISARM.00403531
0040352C . B8 2E2E4000 MOV EAX,DISARM.00402E2E
00403531 > 50 PUSH EAX
00403532 . 68 432E4000 PUSH DISARM.00402E43 ; ASCII "], %s#%d"
00403537 > 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
0040353A . 51 PUSH ECX
0040353B . FFD7 CALL EDI
0040353D . 83C4 10 ADD ESP,10
00403540 . E9 50030000 JMP DISARM.00403895
00403545 > 68 4C2E4000 PUSH DISARM.00402E4C
0040354A . E9 86010000 JMP DISARM.004036D5
ちゃんと残っています.ということは,バイナリエディタで書き換えれば良いんじゃないの?
ということで書き換えたところ・・・.
***>disarm "POKEMON EMER.gba"
00000000 ea00007f b $00000204
00000004 51aeff24 movpl pc, r4, lsr #1e
00000008 21a29a69 movcs r9, r9, ror #14
0000000c 0a82843d beq $fe0a1108
00000010 ad09e484 stcge 4, cre, [r9, -#210]
00000014 988b2411 stmlsia fp, {r0, r4, sl, sp}
00000018 217f81c0 cmncs pc, r0, asr #3
0000001c 19be52a3 ldmneib lr!, {r0, r1, r5, r7, r9, ip, lr}
00000020 20ce0993 smullcs r0, lr, r3, r9
00000024 4a4a4610 bmi $0129186c
00000028 ec3127f8 ldc 7, cr2, [r1], -#3e0
0000002c 33e8c758 mvncc ip, #1600000
00000030 bfcee382 swilt 0x00cee382
00000034 94dff485 ldrlsb pc, $000004c1
00000038 c1094bce tstgt r9, lr, asr #17
0000003c c08a5694 umullgt r5, sl, r4, r6
00000040 fca77213 sfmnv f7, 4, [r7], #4c
00000044 734d849f cmpvc sp, #9f000000
00000048 619acaa3 orrvss ip, sl, r3, lsr #15
0000004c 27a39758 undefined
00000050 769803fc undefined
16進数キタ━━━━━━(゜∀゜)━━━━━━ !!!!!
成功です!
こんなんじゃ駄目だ!
GBA用ならベースアドレスを0x08000000にしなきゃ!ということで,
BCC Developer
を使って適当にやろう(駄 と画策したところ,やっぱり同じところでエラー.
どうもヘッダファイル中にenumで何かを宣言しているところで駄目な模様.ってか,enumって何?
というわけで検索してきました.Javaとは案外ちがうもんですね.
こちらの最後の方にあります.
どうもint型で並び方に関係する型らしい.
・・・でも,ソース中にあるのは
enum arch;
普通の変数みたいな宣言です.上のページで紹介されていたような宣言の仕方じゃない.
エラーが出ている所をすべてenum型からint型に変えれば・・・.
わーい通ったー!!
大体の感覚はJavaと一緒なのでカスタマイズするぐらいなら簡単にできますね.
早速完成.以下にうpします.
http://briefcase.yahoo.co.jp/bc/ryotsukankichi2/lst?.dir=/Soft
今後の課題
システムコールを表示してくれると便利かも?
そのためにはソースの解読が必要みたいですね・・・.