2010年03月05日一覧

ゲーム最新情報 2010年3月5日のニュース

●Engadget 日本版で、Wall Street Journalが伝えたある詳しい情報筋からの情報としてソニーが「プレイステーション携帯」と、新型モバイルハンドヘルド機を開発中らしいと伝えていました。かねてから噂のPSP携帯ではなくPS携帯のようで、初代プレイステーションのゲームを現在でいうところのPSNでダウンロードするPSエミュレータ搭載機(年内発売か)みたいなもののようです。モバイルハンドヘルド機については「ネットブックと電子ブックリーダー、PSPの境界をあいまいにする」ものらしく、よく分かりません。まもすけはiPadやDSi LL対抗大型ディスプレイ搭載タブレットPC型VAIO(3GサポートおよびPSP互換)と勝手な夢を語っておきます。

●exophaseで、昨日3月4日でプレイステーション2が日本で発売されてから10周年だと伝えていました。未だにPS2が現役であることに驚きを隠せません。10年前の携帯電話やPCが皆さんの回りで現役ですか?
あ、うちのPowerMac(95年製)現役だった…

●Xbox-sceneで、Juvenal1228氏がNandProを使ったGUIベースのXBR FlasherであるJ-xbr-gui v1.0をリリースしたことを伝えていました。”Full Auto XBR”という機能を実装したそうです。

●Xbox-sceneで、Axc97c氏がXbox 360のHomebrewのためのダッシュボードFreeStyle Dashがオープンソースとなったことを伝えていました。公式サイトはGoogle codeです。早速JQE氏がコンパイルバージョンをリリースしたようです。今後は工夫を凝らした亜種が続々と出てくるでしょう。

●WiiBREWで、Paulwagener氏がネットワーク経由で繋がっているPCの画面を仮想的に表示させることでそのPCを遠隔操作できるVNCのWii版となるWiiVNC 1.11をリリースしたことを伝えていました。フランス語に対応しただけのようですのでほとんど変更点がないも同様です。

●WiiBREWで、Lunatik氏とArikado氏がWiiにインストールする時にIOSを選択できるDop-IOSの改造版Dop-IOS MODから名前が変わったDOP-Mii v12をリリースしたことを伝えていました。名前が変わるだけあって大幅に変更点があるようです。

●Google Codeで、Oggzee氏がWanikoko氏のSD/USB LoaderなどをベースにしたWii のローダーConfigurable USB Loader v55をリリースしたことを伝えていました。Honeボタンに新たな値を割り付け、priiloaderメニューとWii Menuの呼び出しに対応したようです。

GameGazフォーラムで、j416氏がゲームのセーブデータを使ったexploitでHello Worldの表示に成功したことを伝えていました。j416氏さんGJです!

●Siliconeraで、ソニーがゲームの体験版で新しいパテントを取得し現在準備中であると伝えていました。どうやら体験版は最初はほぼ購入版と同等だが、プレイを回数が増えるにつれて例えば所持する武器かへなちょこになるなど正規に購入するまでどんどん内容が劣化していくといったもののようです。ある意味今より買う価値があるかどうかの見極めがきちんとできそうな気がしますが、問題は劣化の速度ですね。



J416氏がPSPのOFW 6.20でHello World表示に成功

GameGazフォーラムで、j416氏がPSPのOFW6.20でHello World表示に成功したことを伝えていました。【情報源:GameGazフォーラム

j416氏はHello Worldの写真を公開しています。

j416_helloworld

公式FW6.20で動作するようです。
ユーザーモードexploitです。GripshiftのSparta SDKをベースにしているようですのでHomebrewは動作すると思います。

これはあくまでもあるゲーム(UMDで販売されているだけではなくPSNでも販売されています)を利用したexploitであるため、PSP goでHomebrewが実現できる可能性は秘めています。

可能性?

できるんじゃないの??

そこが大きな問題で、ゲーム名を公開した時点でおそらくPSNから一旦消されてしまうでしょう。そのゲームが再びダウンロード可能になった時にはすでに対策が施された後だと思います。

同じゲームに海外版が存在するのかどうかについては言及しませんが、少なくとも初めて日本版でないと動作しないバイナリーローダー(Hello World)です。今までとは逆で、2バイト文字の日本版であるが故に海外版に同じゲームがあったとしても動作させることができないかもしれません。

そうそう、グリップシフト(日本版)でspartaaaaaaaaa…と入れまくっても$raはコントロールできる気配がありませんでした。まもすけのaaaaの数が足らない可能性もありますが(それでもかなり入れたけれど、あるところからレジスタの値が全く変化しなくなったので途中で嫌になって辞めた)US/EU/KR版でバイナリーローダーがリリースされて日本版だけ遂にリリースされることがなかったのはそれなりの理由があるのです。

そして今回のj416氏のHello Worldはグリップシフトの逆パターンになるかもしれません。(あくまでも想像です)
偽CFWなどで騒ぐより、より現実的な路線で騒ぎましょう。



PSPのexploitでBinary Loaderを作ろう 第2部

最近相次いで見つかっている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については問題ないでしょう?