wololo.netで、hgoel0974氏がVHBLにも流用できるPSPのexploitをPSPを使わずに探すためのチュートリアルを公開していました。
PSPのexploitをPSPなしで探すことは今までは不可能だとされてきました。これはPSPLinkが必ず必要だったことと、セーブデータの復号化や暗号化がPSPなしではできなかったためです。
ところが、最近はPC上でPSPをエミュレートするPSPエミュレータの完成度がかなり高まり、本物のPSPとまるで同じ動作ができるようになってきています。動作が正確であればあるほど、PC上のPSPエミュレータでexploitの動作も正確にエミュレートが可能になります。
つまり、現在のPSPエミュレータであればexploitを探すことも可能なのです。
今まではゲームのセーブデータをPSPで作成し、PCで編集してPSPへ戻してPSPLinkで確認するという、PSPとPCの間のデータコピーが頻繁に必要でしたが、PSPエミュレータに集約できれば作業がかなり楽になります。上手く行けばUMDの吸い出し時と最終的な動作確認だけPSPで行い、あとはPCで、ということも不可能ではなさそうです。
必要なのは、PPSSPPやJPCSPといったPSPエミュレータと、HEXエディタです。HEXエディタにはいくつも種類がありますが、チュートリアルを書いたhgoel0974氏のおすすめはHxDだそうです。チュートリアルではPPSSPPとJPCSP、HxDを使います。それぞれのダウンロード先は以下です。
PPSSPP :http://buildbot.orphis.net/ppsspp/
JPCSP :http://buildbot.orphis.net/jpcsp/
HxD :http://mh-nexus.de/en/hxd/
今回は、2.06 VHBLで利用された『Apache Overkill』exploitを例に用いて、hgoel0974氏が書いたPPSSPPとJPCSPとHxDでexploitをPCだけで探すためのチュートリアルの翻訳をベースに記事の再構成をしてお伝えします。
本当は自分で試して書きたかったのですが、そもそも愛用のIntelMacは初代CoreDUOでしかもOSX10.5.8と、最新PSPエミュレータの動作条件が揃っておらず、試そうと思うとまず「さあ、パソコン買い替えようか」というところから始まるので断念しました。ですのでフォルダ構成やディレクトリ名、ファイル名が正しいのかどうかが実は確認できていません。ま、違ってたらコメントお願いします。とりあえず、PPSSPPとJPCSPのセーブデータ名がSECURE.BINなのかSAVEDATA.BINなのかが元記事からで判断つきません。仕方がないのでSAVEDATA.BINで統一しました。違っていたら読み替えてください。
セーブデータの復号化
PSPのセーブデータを改造する際に必ず必要になるのはセーブデータの復号化です。これはセーブデータは通常の状態では暗号化されているためです。セーブデータを改造する際最初にすべきことは、セーブデータの復号化、つまりは暗号化を解除し元の生データに戻してやることです。
では、PPSSPPを使った場合を例にとってセーブデータの復号化を行うための手順を確認しましょう。PPSSPPはPCに既にインストールされているものとします。
PPSSPPフォルダの中に’ppsspp.ini’という初期設定ファイルがあります。テキストエディタで’ppsspp.ini’を開くと、下記のテキスト設定項目が並んでいるのが確認できます。’ppsspp.ini’はPPSSPPを最初に起動した時に自動で作成されます。
最後の方に‘EncryptSave’とある項目がセーブデータを暗号化するかどうかの設定項目です。暗号化するかどうかですので
EncryptSave = True
の場合は「暗号化を行う」
EncryptSave = False
の場合は「暗号化を行わない」= データを復号化する
です。
EncryptSave = False
にしておけば、基本的には(不具合でうまく行かないものも存在する可能性がある、という意味です)新しく作られるセーブデータは復号された状態で作成されます。
ゲームを起動してセーブデータを作成する
『Apache Overkill』を例にとって説明します。海外版のゲームの場合は○と×が逆だったりするのでそのへんは適当に読み流してください。特に今回の『Apache Overkill』の場合海外版しか存在しませんので説明は海外版になります。
また、ゲームによってセーブデータの作成方法は異なります。『Apache Overkill』はハイスコアを記録するためのプロファイルをセーブデータとして保存しています。最初の起動時に「セーブプロファイルがありません。セーブプロファイルを作成すればゲームのハイスコアを記録することができます。セーブプロファイルを作成しますか?」と聞いてくるので「はい」(×ボタンを押す)を選択します。英語版の場合この×ボタンがPPSSPPでは’Z’キーに割り当てられていますので’Z’を押してセーブプロファイル(セーブデータ)を作成します。
ゲームによってはある程度プレイを進めないとセーブデータが作成できないものもあります。セーブデータが作成できればとりあえずPPSSPPは終了させてしまって構いません。
セーブデータを編集する
復号されたセーブデータが作成されたので、HEXエディタで編集します。
ppssppフォルダの中のメモリースティックフォルダを開き、
PSP/SAVEDATA/NPUZ00098PROFILE/
のフォルダを開きます。
NPUZ00098PROFILE/ は『Apache Overkill』のフォルダですのでゲームによってフォルダ名は異なります。
なお、メモリースティックフォルダはPPSSPPを最初に起動した時に自動で作成されます。
開いたセーブデータフォルダの中に復号化済セーブデータ本体であるSAVEDATA.BINというファイルがあります。それをHxDで開くとこのようになっています。
ここからはPSPでexploitを探してHello World、そしてHalf-Byte Loader移植までのチュートリアルを見ながら、セーブデータを改造します。適当にaaaaa….とか入力しちゃってください。作業的には今までもPCで行っていた内容ですので特に変わりません。
『Apache Overkill』の場合は240文字程度 ‘a’ を入れるとバッファーオーバーフローで$raレジスタが書き変わるようです。
データを書き換えたら保存して、次に再びミュレータで起動させて動作を確認します。
セーブデータの動作確認
セーブデータの動作確認は、信頼性を重視するとJPCSPで行った方が良いでしょう。
暗号化データはConfigrationの暗号化タブの中に設定があります。改造したセーブデータをJPCSPの
ms0:/PSP/SAVEDATA/
にコピーして『Apache Overkill』を起動させます。JPCSPの動作は遅いですが、exploitのテストをする分には十分です。
セーブデータによってはゲームがフリーズします。実機を用いる場合にはPSPLinkを使うところですが、
“Debug(デバッグ)” -> “tools(ツール)” にデバッガがあり、各種レジスタの値が表示されていますのでそれを見てexploitかどうかを判断できます。
最初に書きましたが、自分で試せてはいないのでどの程度作業の簡略化が図れるのかが分かりません。もちろん最終的にはPSPでの動作確認は必要になりますし、PS Vitaで動くかどうかも(普通は動きますけどね)確認は必要になりますので実機がまったく要らないということにはなりません。ただ、少なくともセーブデータを書き換えるたびにメモリースティックをPSPに入れたりPCに入れたりといった作業がないだけでもかなり楽な気はします。