homebrewsでwololo氏が次のステップとなるバイナリーローダーの作り方の記事を掲載していました。第1部の続きになります。バイナリーローダーをコンパイルするこのステップを実行する前にMatiaz氏とFreeplay氏のsparta_sdkをダウンロードすることをお勧めします。Gripshiftのexploitを利用したsparta_sdkはバイナリーローダーの参考例として非常に有用です。バイナリーローダーはアセンブラで書いてしまうとそれ自体は非常にシンプルなものになります。SDKを利用してCをベースに書くこともできますが、sparta_sdkのバイナリーローダーはMIPSアセンブラで書かれているようです。アセンブラはC/C++よりもハードルが高いのですが、今回はMatiazs氏の作ったものを今回発見したexploitのケースに当てはめてみたいと思います。何ヶ所かを置き換えるだけ、ということになります。sparta_sdkのloader.Sのファイルを開いてみてください。binLoaderで使われているファンクションアドレスを置き換えることとなります。Matiaz氏はGripshiftで使えるようなアドレスを入れていますので自分が見つけたゲームexploitとはそこが異なります。記述してある4つのファンクション(sceIoOpen、sceIORead、sceIOClose、sceKernelDcacheInvalidateRange)を、先ほど作成したリストに沿ってGripshiftでの値を自分のゲームでの値に置き換えてください。先ほど私が作ったリストで言うと、sceIoCloseとなっている0x08A69854を0x08C88590に置き換える、などという感じです。ファイルネームがストアされているアドレスも変えてやる必要があります。ファイルネームとは自分で作ろうとしているバイナリのファイル名のことで、よく使われるのがms0:/h.binです。これをセーブデータのジャンプ箇所のあたりに文字列として記述しておかなければなりません。そのアドレスをasmコードとして出しておいてください。下記の例で言うと、ms0:/h.binというファイルネームをジャンプポイントより0xF0バイト後ろに置いたことになるので、spartaの0xC0をF0に書き換えます。注意しておきたいのはコンパイルしたバイナリーローダーの長さはF0より小さくしなければならないことです。しないとファイルネームのところがバイナリーローダーのコードで上書きされてしまいますよ。変えなければならないのはそのくらいです。このファイルをコンパイルしてSDDATA.BIN(暗号化されていないセーブデータ)の中に書き込んであげましょう。アセンブラのコンパイルはPSPSDKで提供されている各種ツールのなかでも特に難しいということはありません。sparta_sdkをヒントに、ここでコンパイルのためのコマンドを紹介します。a.bin最初がコードをコンパイルするコマンドで、次がそれをバイナリー版にするコマンドです。バイナリーローダーをセーブデータに書き込むバイナリーローダーのコンパイルができればあとは簡単で、セーブデータに書き込むだけです。手でコピペしてもいいですし、お好きなスクリプト言語を使っても良いでしょう。注意してほしいのは先ほどこの記事でも書きましたが、$raにいれたアドレスから始まるよう正確に書き込むということです。書き込みをするにあたり、SDDATA.BINファイルにexploitの読み込み+バイナリーローダーをコンパイルして書き込みを直接やってしまえるように私の場合はRubyでスクリプトを組みました。コードは自分で見つけたexploit用に大幅に書き換えなければならないので画像としてお見せしておきます。コードを書き込むための方法は自分がやり易いと思うやり方で実行していただいて構いません。worldをアセンブラで作って入れておけば良いことにお気づきでしょう。バイナリーローダーなどではなくもっと簡単なコード(例えばsceKernelExitGameを呼び出すなど)を試してみるようなことはする必要ありません。自分の書いたコードを確実に動作させることに専念してください。難しそうに思えますが、実はそうでもありません。ファンクションをセーブデータにインポートできていればお茶の子さいさいです。必要なのはprxtoolを使って入手したインポートするファンクションのリストだけで、sparta_sdkのサンプルフォルダにあるsdk.hをアップデートするだけです。迷うようなことは全くありません。今回の例でいうと、0x08C88590を0x08A69854に置き換える、などです。先ほどの”.S”ファイルと同じです。実は、sparta_sdkのsdk.hファイルはベストな例とは言えません。exploitのsdk.Sを一度見てみた方が良いでしょう。これもアセンブラですが超シンプルで、ファンクションがどうとかを探す必要すらありません。imports”ファイルを分析するための簡単なRubyのスクリプトを作りました。prxtoolにもこの操作をする上で役立つオプションはあるようです。exploitにあるsdk.hを探してみてください。”.S”と”.h”というファイルがそうです。Worldは本当に簡単です。SDKにあるサンプルを書き換えや流用できたわけですからね。最初はできるだけ小さなファイルを作るところから始めて下さい。簡単に実証するためのCのコードは“sceKernelExitGame()”をコールすることです。作成したSDKとバイナリーローダー(先ほど作成したもの)がきちんと動作することを確認する分にはそれで十分です。sparta_sdkのイベントをすべて自作sdk用に置き換えるだけだと考えてください。sdk.Sを使った場合はmakefileに若干変更を加えなければなりません(その場合はspartaのMakefileではなくMOHHのMakefileを見て考えてみてください)。コンパイル後に出力するファイル名はh.binにします。バイナリーローダーがms0:/h.binを読み込むようにしてあるので、そのh.binをメモリースティックのルートに配置します。バイナリーローダーが入っているSDDATA.binはSAVEPLAINというフォルダ名のサブフォルダ内に配置します。以上の準備が完了したらゲームを起動してください(もちろんSaveGameDeemerとPSPLinkのプラグインは有効にしておきましょう)。Worldが表示されるはずです。トラブルシューティングexploitの動作がうまく行かない場合、いくつかの原因が考えられます。コンピューターのプログラムは書かれた流れ通りに実行されるだけなので、動作環境が不十分であってもバカ正直に間違った動作をしてしまいます。そんな時はPSPLinkの利用が成功の鍵となります。クラッシュしてしまったらRAMの状態を調べてみてください。すべて正しい場所にあって、おかしな理由で途切れたりしていませんか?実際に動作しているかを確認するためにバイナリーローダーにブレイクポイントを追加してみてください。Worldが設定したアドレスに読み込まれているかを確認してください。Worldでブレイクポイントを設けてみてください。あとはいかに簡素化するかです。操作をある程度自動化しないで一つ一つのステップを手動で行っているとかなり苦痛に感じるかもしれません。私は作業を自動化するようなスクリプトを作ることにまず時間を割いた方が良いと思います(バイナリーローダーのコンパイルやそれをセーブデータに書き込む作業など)。これなら自信があると言う言語でスクリプトを作りましょうセーブデータを暗号化し直す最後のステップは公式ファームウェアでexploitを動作させるようにすることです。SEDというツールでセーブデータexploitを暗号化できます。SEDでの暗号化にはgamekeyが必要です。gamekeyはSaveGameDeemerで作られるSAVEPLAINデータの中にあります。XXXX.bin(XXXXはゲーム自体のコードです)というデータの一番最後の部分がgamekeyです。ファイルの一番最後の20バイトは必ずゼロとなっています。その前の16バイトがそのゲームのgamekeyですSEDの使い方についてはググってください。いい加減な説明ですね。v0.09リリースDCemuで、Windows用のPSPエミュレータ、JPCSPがバージョンアップして市販のゲームが動くようになったことを伝えていました。GENが語る今後PSPGENで、PSPのCFWのこれまでとこれからの展望に関する記事を掲載していました。0PASS:>J416さん>ローダーの.Sファイルで書き換える際>sceKernelDcacheInvalidateRange>は存在しないゲームの場合実行しなくても動きます>もちろんsceIo系は必須です貴重な情報ありがとうございます。これを見て取り組んでみよう、と思う方が続々出てきてくれることを願っています。すればフォーラムがもっと盛り上がるかな、なーんて。0PASS:>neuronさん参考にしてくださいね。私は翻訳しただけで内容はwololoさんです。彼が一番の立役者です。0PASS:はじめましてまもすけさん。Errorになってしまいます。それで、prxtoolでeboot.pbpを開いたとき、sceIoOpenなどの関数の実アドレスが0x08000000番台ではないこと(prxtoolで表示されている関数のアドレスが正しくないこと)が原因かと思いましたがこれは違いますよね?他の原因としては何が考えられるでしょうか?同じ名前でGameGazフォーラムに登録してこの質問をしようとしたのですが、アクティベートのメールが1日経っても届かなくてログインができないのでとりあえずここに書き込みました。0PASS:>pshkさんたぶんpshkさんだろうと思われるアカウントがスパムらしき連中に混じって無効アカウントに入っていましたので、再度アクティベーションメールを送信しましたのでご確認ください。それから、exploit発見おめでとうございます。prxtoolで表示される関数リストのアドレスは0x08800000以降のユーザーメモリー領域のアドレスになるはずですので、0x08800000より前のアドレスしか出てこないであれば出力結果が間違っています。リストが出たと言うことは復号はできているはずですが、可能性があるとすればSYSDIRフォルダのEBOOT.BINではなく同じISOイメージ内の違うEBOOT.BINを復号化してしまったのかもしれません。(私も1回それやったことあります)うまくいったらGameGazフォーラムで報告してくださいね。0PASS:まもすけさん、回答ありがとうございます。Worldが(たぶん)不完全ながらも動作するところまでこぎつくことができました!あのあと何度も正しいeboot.pbpを使用しているかなどを確認してprxtoolでアドレスの取得を試みたのですが、prxtoolでは正しいアドレスが見つかる気配がなかったため、NIDSの関連付けが一緒に表示されないので手間がかかりますがpsplinkのmodimpコマンドを利用して必要な関数のアドレスを調べました(そちらではちゃんと0x08800000〜のアドレスが表示されていました)。0PASS:すみません、GameGazのメール届いていました。0PASS:>pshkさん>すみません、GameGazのメール届いていました。他にも迷惑メール扱いになってしまっている方がいそうだなぁ。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。「適度な違い」が最もふさわしいと思います。入出力ポートの詳細が明らかに適度の違い。入出力ポートの詳細が明らかに新型コロナウィルスの話ですね。タイムリーな話題です。咳や発熱等の症状があり発病が疑われる場合には、マスクを着用するなどして速やかに医療機関を受診してください。