CMF作者が素晴らしいものを作ってくれました。HBPがつかえる解析方法です。
ASMコード(=アセンブラリ,日本ではプログラムコードと呼ばれる)の作成が非常に簡単にできます。早速使ってみました。
PSPLINK改 NEWPSPLINK(UMD対応,前のに上書き)
MFMirror
追記:PSPはMIP社のR4000てのがつかわれてるとのこと
R4000_PDF
PDF2
ぐぐる
例:PATA2
とりあえず数値サーチでチャリンのアドレスをわりだします。
0x516298
下のpluginを有効にしてUSBを接続したままゲームを始めます。
Remotojoy導入済みの人はTYPE-Bのインストールはいらないはず。
追記:うpでーとでCMFと共用できるようになりました。NitePR系も相性がいいみたいです。
UMD起動だとエラーがでてうまくいかないようです
☆は必須、上手くいかないときは☆だけでためしてください
//PSP用記述例
ms0:/CheatMaster/CMFusion.prx 1 ←R21より可能,ダメなときもある
ms0:/seplugins/mkultra.prx 1 ←こちらも互換あり、CMFがダメなとき試してみるといいかも
ms0:/seplugins/psplink.prx 1 ☆
ms0:/seplugins/usbhostfs.prx 1 記述は不要らしい
ms0:/seplugins/usbgdb.prx 1
ms0:/seplugins/remotejoy.prx 1 ←これも一応可能。
//POPS用記述例
ms0:/seplugins/popsloader.prx 1
flash0:/kd/usb.prx 1 ☆PSPLINKより上に記述して下さい
ms0:/seplugins/PSPLINK.PRX 1 ☆
ms0:/seplugins/cwcheat/cwcpops.prx 0
ms0:/seplugins/remotejoylite.prx 0
usbhostfs_pc.exeとpspsh.exeを実行します
追記:PSP以外の他のUSB周辺機が接続されてるとpspshがエラーを吐くようです
上手くいかないときは外すか管理ツールでドライヴレター変更などしてください。
usbhostの画面でblind(盲目)と出る場合何かのアプリと競合してる可能性が高いです(特にFTPデーモンやP2Pなど)。
msconfigやタスクマネージャーなどでアプリはなるべくきるようにしてください。ファイアーウォールでも除外したほうがいいかも?
prometeusやパッチ経由だとメモリ不足がおこるのかあまり起動率がよくないようなので,CFWのISOドライバー経由かUMD起動のほうが成功率が高いようです。
BLOG驚異のMAXFREE60未満とかのヤバい状態が発生した状況,HEN620TNE+PSPLINK+PIL(UBHOST)+1ぷらぐいんで発生
ステージ選択後bpをセットします。入力アドレスは絶対アドレスにする必要があります。
0x516298+0x8800000=0x8D16298
とりあえず書き込まれたときにしてみる
"host0/ bpset 0x8D16298 w" と入力してENTER
追記:"host0/ bpset 0x516298+0x8800000 w"と入力しても大丈夫みたい。
ゲームを進めてステージ終了後にチャリンを見るとPSPが突然止まるのでこれでおk。
pspshをみるとブレイクしたアドレスがわかりました。
この近辺(-10~20hあたりから)をディスアセンブラで見てみる。DUMPがあるならPS2DISで見てもかまいません
"host0/ disasm 0x88EEB00 30"でENTER
ズラーと出てきました。10でBREAKしたので直前をみてみると、addu(追加、unsighed=整数)になってます。
ブレイクした状況を考えると、v0が獲得チャリンかv1が現在チャリンではないかと推定します。
この辺を弄って改造できれば成功です、その辺はPS2改造サイトぐぐればいっぱい書いてあるので(ry。
bne(branch not equal,不一致+分岐)を潰すかadduのところのv1にat自体いれちまうとかいろいろあります。
おまけ
手前のa0をみるとlw(load word,4byte読込)なのでa0はどこから読み込まれてるのでs0+0x1068がポインタアドレス、a0が基準アドレスとわかります。
swではa0+0x6B18(27416)にv0を書き込むという意味です。a0を逆算すると0x50F780,PSPでサーチすると3つでてきました。1つ目基準アドレスをいじくってみるとチャリンが0、ここぽいか?
追記:hwpritやexprintでレジスタ値がまるみえなので↑のような面倒なことしなくてもいいです。
解析に使いそうなPSPLINKコマンド,PSP開発はやらないのでよくわかりません。他にもあるかも?
pdf
ぐぐる英訳
こまんど?
追記:↑キーを押すとコマンドの入力履歴が出てくる。
#オリジナル(PSPDEv) 0xで16進数,$でレジスタ値
memdump - メモリビューアー
loadmem - メモリに指定ファイルをパッチ
savemem - メモリダンプを保存
mhead - ポインターアクセス
pokew - 4byteの値を書き込む
pokeh - 2byteの値を書き込む
pokeb - 1byteの値を書き込む
pokes - 文字列を書き込む
peekw - 4byteの値を表示する
peekh - 2byteの値を表示する
peekb - 1byteの値を表示する
fillw - 4byteの値でいっぱいにする
fillh - 2byteの値でいっぱいにする
fillb - 1byteの値でいっぱいにする
copymem - メモリーブロックのコピー
findstr - 半角英数を検索する
findhex - 16進数で文字列を検索する
findw - 4byteの値を検索する
findh - 2byteの値を検索する
disasm - ディスアセンブラの使用
asm - アセンブラで挿入する
exprint - 例外情報の表示
exlist - 例外のリスト
exctx - 現在の例外設定情報
exprfpu - 浮動小数レジスタの表示
exprvfpu - ベクター(ベクトル)レジスタの表示,ただしLINKの表示だとマトリックス表になってないのでかなりみづらいのでVFPUHELPERを使って下さい
setreg - 例外がおきるレジスタの設定?
exresume - ゲームを再開する
bpset - ブレイクポイントを設置する -1h (BREAK ON EXECUTE)
bpdel - ブレイクポイントの削除
bpdis - ブレイクポイントを無効にする
bpena - ブレイクポイントを有効にする
bpth - 最初の中断のプロセス
bpprint - ブレイクポイント設置アドレスを表示
hwprint - デバッグレジスタ値の表示
% *.txt - マクロ機能、txtに書いたコマンドをまとめて実行
出力結果保存方>2CHより上のマクロ使うと入力がはぶけるかも
#CMF作者強化分、原文はアドレスマスクが間違ってる?
bpset 0x09000000 r ------ CPUが0x09000000の値を読んだとき中断される(BREAK ON READ)
bpset 0x09000000 w ------ CPUが0x09000000の値に書き込み(変更)したとき中断される(BREAK ON WRITE)
bpset 0x09000000 rw ------ CPUが0x09000000の値を読み書きしたとき中断される
bpset 0x09000000 rw 0x7 ------ アドレス範囲0x09000000-0x09000007,読み書き時
bpset 0x0900000c w 0x3 ------ アドレス範囲0x0900000c-0x0900000f,書き込み時
bpset 0x0900000c wv 0x3 0x8 ------ アドレス範囲0x0900000c-0x0900000f,値が0x8で、書き込み時
bpset 0x0900000c wv 0x3 0x8 0x7 ------ アドレス範囲0x0900000c-0x0900000f,値範囲0x8-0xf;0x3がアドレスのマスク, 0x7が値のマスク
他の例
アイテム使ったとき、下のsubでチャリンを減らすので真逆をぶちこめば増えるになる。アイテムの方はちょっと上の方にある。
フィーバーのアドレス、1回叩く→10回叩くにすればおk。peekwでアドレス確認する必要有、1も作るか
掘った時,ASMシリアル埋め込みに使用
#PSPLINKASM表示結果(一部)
zero,at,v0,v1,a0,a1,a2,a3
t0,t1,t2,t3,t4,t5,t6,t7
s0,s1,s2,s3,s4,s5,s6,s7
t8,t9,k0,k1,gp,sp,fp,ra
lvはどうもろーどべくたの略っぽい(勝手につけたらしい)。S133はS(21bit÷4)(21bit÷4の余り)(3bit)あどれすのれじすたは他と同じように25bit目を2ずつあげればおk。
0xC91C001F→0xC8000000 lv.s S000,0(zero)から計算
&0x01E00000 10/2=8 t0
&0x001F0000 1C÷4=7余り0
&0x00000003 3bitが3
&0x0000FFFC オフセット0x1C
よってlv.s S703,$1C(t0)
lv.q,sv.qは3bit分がないだけでS??0がC??0になる。
他にもいっぱいあるみたいだけど全部はわkらんです。
追記;vadd.sは0x1C+0x20*XXになるっぽい?
0x6000001C S700,S000,S000
0x60000020 S001,S000,S000
0x60001C00 S000,S700,S000
0x60002000 S000,S001,S000
0x601C0000 S000,S000,S700
0x60200000 S000,S000,S001
PSPはメモリのアドレスを0x08000000から割り当てて、アドレス手前に8がつくと特権ユーザー?
物理RAM=0x0A000000-0x08000000=33554432BYTE=32768KBBYTE=32MB
//カーネルラム(特権ユーザー専用)
0x88000000
|
|
0x887FFFFF
//ユーザーラム
0x08800000
|
|
0x0A000000
#0x0A000000がみpsだとj $08000000になるので再配置とかで使いやすいからkm
参考リンク
dev
表示バグもあるっぽい?
追記;msubノ表示にバグがあるようです