5503594 ランダム
 ホーム | 日記 | プロフィール 【ログイン】

たしなみガジェット

2010年03月05日
XML
テーマ:PSP発売!!!!(263)
カテゴリ:PSP Hack
最近相次いで見つかっているPSPのセーブデータexploitですが、Wagic, Magic the Gathering, and PSP homebrewsでwololo氏が次のステップとなるバイナリーローダーの作り方の記事を掲載していました。【情報源:Wagic, Magic the Gathering, and PSP homebrews

この記事はPSPのexploitでBinary Loaderを作ろう 第1部の続きになります。



バイナリーローダーをコンパイルする
このステップを実行する前にMatiaz氏とFreeplay氏のsparta_sdkをダウンロードすることをお勧めします。Gripshiftのexploitを利用したsparta_sdkはバイナリーローダーの参考例として非常に有用です。
バイナリーローダーはアセンブラで書いてしまうとそれ自体は非常にシンプルなものになります。SDKを利用してCをベースに書くこともできますが、sparta_sdkのバイナリーローダーはMIPSアセンブラで書かれているようです。アセンブラはC/C++よりもハードルが高いのですが、今回はMatiazs氏の作ったものを今回発見したexploitのケースに当てはめてみたいと思います。ですから何ヶ所かを置き換えるだけ、ということになります。
sparta_sdkのloader.Sのファイルを開いてみてください。

loader


基本的な作業内容はsparta binLoaderで使われているファンクションアドレスを置き換えることとなります。Matiaz氏はGripshiftで使えるようなアドレスを入れていますので自分が見つけたゲームexploitとはそこが異なります。記述してある4つのファンクション(sceIoOpen、sceIORead、sceIOClose、sceKernelDcacheInvalidateRange)を、先ほど作成したリストに沿ってGripshiftでの値を自分のゲームでの値に置き換えてください。先ほど私が作ったリストで言うと、sceIoCloseとなっている0x08A698540x08C88590に置き換える、などという感じです。
更に、ファイルネームがストアされているアドレスも変えてやる必要があります。ファイルネームとは自分で作ろうとしているバイナリのファイル名のことで、よく使われるのがms0:/h.binです。これをセーブデータのジャンプ箇所のあたりに文字列として記述しておかなければなりません。もちろんそのアドレスをasmコードとして出しておいてください。下記の例で言うと、ms0:/h.binというファイルネームをジャンプポイントより0xF0バイト後ろに置いたことになるので、spartaの0xC0をF0に書き換えます。注意しておきたいのはコンパイルしたバイナリーローダーの長さはF0より小さくしなければならないことです。そうしないとファイルネームのところがバイナリーローダーのコードで上書きされてしまいますよ。失敗

saveplain_inject


変えなければならないのはそのくらいです。ではこのファイルをコンパイルしてSDDATA.BIN(暗号化されていないセーブデータ)の中に書き込んであげましょう。
アセンブラのコンパイルはPSPSDKで提供されている各種ツールのなかでも特に難しいということはありません。ではsparta_sdkをヒントに、ここでコンパイルのためのコマンドを紹介します。

psp-as loader.s
psp-objcopy -O binary a.out a.bin


最初がコードをコンパイルするコマンドで、次がそれをバイナリー版にするコマンドです。

バイナリーローダーをセーブデータに書き込む
バイナリーローダーのコンパイルができればあとは簡単で、セーブデータに書き込むだけです。手でコピペしてもいいですし、お好きなスクリプト言語を使っても良いでしょう。注意してほしいのは先ほどこの記事でも書きましたが、$raにいれたアドレスから始まるよう正確に書き込むということです。

書き込みをするにあたり、SDDATA.BINファイルにexploitの読み込み+バイナリーローダーをコンパイルして書き込みを直接やってしまえるように私の場合はRubyでスクリプトを組みました。コードは自分で見つけたexploit用に大幅に書き換えなければならないので画像としてお見せしておきます。コードを書き込むための方法は自分がやり易いと思うやり方で実行していただいて構いません。

ruby


この時点でバイナリーローダーの代わりにhello worldをアセンブラで作って入れておけば良いことにお気づきでしょう。ただ、バイナリーローダーなどではなくもっと簡単なコード(例えばsceKernelExitGameを呼び出すなど)を試してみるようなことはする必要ありません。自分の書いたコードを確実に動作させることに専念してください。

SDKの作成
一見難しそうに思えますが、実はそうでもありません。ファンクションをセーブデータにインポートできていればお茶の子さいさいです。必要なのはprxtoolを使って入手したインポートするファンクションのリストだけで、sparta_sdkのサンプルフォルダにあるsdk.hをアップデートするだけです。迷うようなことは全くありません。今回の例でいうと、0x08C885900x08A69854に置き換える、などです。先ほどの".S"ファイルと同じです。

sdk


実は、sparta_sdkのsdk.hファイルはベストな例とは言えません。それよりもMOHH exploitのsdk.Sを一度見てみた方が良いでしょう。これもアセンブラですが超シンプルで、ファンクションがどうとかを探す必要すらありません。

sdk_asm


ここで、sdk.Sのファンクションの中での"functions imports"ファイルを分析するための簡単なRubyのスクリプトを作りました。ただ、prxtoolにもこの操作をする上で役立つオプションはあるようです。
MOHH exploitにあるsdk.hを探してみてください。".S"と".h"というファイルがそうです。

Hello worldの作成
SDKの作成ができれば、Hello Worldは本当に簡単です。実際sparta SDKにあるサンプルを書き換えや流用できたわけですからね。最初はできるだけ小さなファイルを作るところから始めて下さい。 簡単に実証するためのCのコードは"sceKernelExitGame()"をコールすることです。作成したSDKとバイナリーローダー(先ほど作成したもの)がきちんと動作することを確認する分にはそれで十分です。

hello


sparta_sdkのイベントをすべて自作sdk用に置き換えるだけだと考えてください。代わりにMOHH sdk.Sを使った場合はmakefileに若干変更を加えなければなりません(その場合はspartaのMakefileではなくMOHHのMakefileを見て考えてみてください)。
コンパイル後に出力するファイル名はh.binにします。バイナリーローダーがms0:/h.binを読み込むようにしてあるので、そのh.binをメモリースティックのルートに配置します。バイナリーローダーが入っているSDDATA.binはSAVEPLAINというフォルダ名のサブフォルダ内に配置します。以上の準備が完了したらゲームを起動してください(もちろんSaveGameDeemerとPSPLinkのプラグインは有効にしておきましょう)。exploitが発動して自作Hello Worldが表示されるはずです。スマイル


トラブルシューティング
exploitの動作がうまく行かない場合、いくつかの原因が考えられます。コンピューターのプログラムは書かれた流れ通りに実行されるだけなので、動作環境が不十分であってもバカ正直に間違った動作をしてしまいます。そんな時はPSPLinkの利用が成功の鍵となります。クラッシュしてしまったらRAMの状態を調べてみてください。正しいアドレスにきちんとジャンプしていますか?バイナリーローダーはそこにちゃんとありますか? すべて正しい場所にあって、おかしな理由で途切れたりしていませんか?実際に動作しているかを確認するためにバイナリーローダーにブレイクポイントを追加してみてください。バイナリーローダーの動作が確認できたら次はRAMに読み込まれるはずのHello Worldが設定したアドレスに読み込まれているかを確認してください。それができていれば今度はまた同様にHello Worldでブレイクポイントを設けてみてください。あとはいかに簡素化するかです。
操作をある程度自動化しないで一つ一つのステップを手動で行っているとかなり苦痛に感じるかもしれません。私は作業を自動化するようなスクリプトを作ることにまず時間を割いた方が良いと思います(バイナリーローダーのコンパイルやそれをセーブデータに書き込む作業など)。これなら自信があると言う言語でスクリプトを作りましょうスマイル

セーブデータを暗号化し直す
最後のステップは公式ファームウェアでexploitを動作させるようにすることです。SEDというツールでセーブデータexploitを暗号化できます。SEDでの暗号化にはgamekeyが必要です。gamekeyはSaveGameDeemerで作られるSAVEPLAINデータの中にあります。XXXX.bin(XXXXはゲーム自体のコードです)というデータの一番最後の部分がgamekeyです。ファイルの一番最後の20バイトは必ずゼロとなっています。その前の16バイトがそのゲームのgamekeyですスマイル
SEDの使い方についてはググってください。ちょっといい加減な説明ですね。使い方さえ分かればSEDについては問題ないでしょうスマイル





←応援お願いします→
GameGaz_icon情報共有プロジェクト GameGazフォーラム






最終更新日  2010年03月06日 00時38分04秒
コメント(9) | コメントを書く

PR

サイド自由欄



第5回楽天アフィリエイト選手権銀賞受賞サイト
大人のためのゲーム講座は第5回楽天アフィリエイト選手権で銀賞を受賞しました


当ブログの全身「大人のためのゲーム講座」は第5回楽天アフィリエイト選手権のコンテンツ部門銀賞を受賞しました
投票してくださった皆様には感謝!

[追伸]
楽天の事務局さんからメールがきました。

『今回「電化製品・おもちゃジャンル」にて、銀賞を受賞されました
「http://plaza.rakuten.co.jp/mamosuke2008/」のサイトに関して
ですが、ユーザーの方より、業界の違法を助長する内容とのご指摘を受け、
検討させて頂いた結果、受賞の内容に変更はございませんが一旦、
http://affiliate.rakuten.co.jp/campaign/cup/0810/result/?l-id=aftop_04
こちらのページへの露出は控えさせて頂く事となりました。』

君子危うきに近寄らず?
想像するにマジコンという固有名詞が掲載されている時点でNG?
このサイトの内容は正義感にあふれてると思いますけど。
どこが業界の違法を助長する内容なのか納得いきませんが、石橋たたいて渡られたらそりゃ壊れますって。





カテゴリ

日記/記事の投稿

ほしいものリスト

カレンダー

バックナンバー

2017年11月
2017年10月
2017年09月
2017年08月
2017年07月
2017年06月
2017年05月
2017年04月
2017年03月
2017年02月

キーワードサーチ

▼キーワード検索

コメント新着

 通りすがりのbiblio@ Re:光るPSP用クレードル CHARGER STAND 4in1 for PSP-2000(10/21) こんにちは、かなり昔のブログ記事へのコ…
 mkeeeeeeeeiiiiiiopp@ Re:Gecko OS v2.0のスクリーンショット公開~でも開発は遅れ気味(02/05) lovemehbb7i7iyuu76f786tvr6yr76tycfythtf…
 威哥王@ 威哥王 中絶薬:http://www.xxkanpo.com/product/1…
 silver1202@ フリーワーク募集 私はやっているフリーワークを紹介します…
 silver1202@ フリーワーク募集           私はやっているフ…
 Nos@ 「CFW 6.35 Custom beta v3 for PSP2000」 「CFW 6.35 Custom beta v3 for PSP2000」…
 qwertyu@ Re:ゲーム最新情報 2011年1月16日のニュース kgsws氏ってMOHHの人ですよね!?懐かしい。…
 天然パーマ@ PSN PSNからゲームってどうやってダウンロード…
 天然パーマ@ (・_・)さん どういう場ってゲーム機のハック情報を紹…

お気に入りブログ

★美容&おすすめコス… autodustboxさん
大人のPS3 ひげぱわーさん

Copyright (c) 1997-2017 Rakuten, Inc. All Rights Reserved.