ページ 11

HBLをPatapon以外に対応させる

未読記事Posted: 2010年9月10日(金) 11:00
by neur0n
・import.configの編集
import.configは、StubテーブルのアドレスとHBLで使われる関数のNIDから構成されています。

・Stubライブラリの編集
あらかじめStubアドレスを探し出しておいてどこかにメモしておきます。
それに合わせてimport.configを書き換えます。
Stubアドレス数はゲームによって数が変わってきます。また、同じゲームでもFWによってアドレスが変わる場合があるので注意が必要です(HBLでimport.configがFWごとに複数あるのはそのため)。

ここではStubアドレス数が5つだった場合について解説します。

編集する前のimport.configです(画像はみんごるの物です)
緑色で囲った所がStubアドレス数で、青色で囲った所がStubアドレスのリストです。
画像ではStubアドレス数が8つあるので、青色で囲った部分のサイズは(4×8=)32バイトとなっています。
config.png


Stubアドレス数が5つだった場合は緑色で囲った所の数値を「8」から「5」に書き換えます。
次に、青色で囲ったStubアドレスのリストにメモしておいたStubアドレスを書き込んでいきます。
注意することは、一番始めに書き込むアドレスはゲームのMainModuleのStubアドレスになるようにしてください。
うまく書き込めればこのようになるはずです(ここでは分かりやすいように0xAAAAAAAAと書き込みました)。
config-2.png


もともとStubアドレス数が8つだった所を5つにしてしまったのでゴミが出てきてしまいました。ここは詰めてしまいましょう。
リストのサイズが(4×8=)32バイトから(4×5=)20バイトに減ったので、12バイト分詰めます。
config-3.png


これでStubアドレスの編集は完了です。しかしリストのサイズが変わったので、NIDリストのオフセット値がズレてしまっています次はこれを修正します。

Re: HBLをPatapon以外に対応させる

未読記事Posted: 2010年9月10日(金) 15:59
by neur0n
NIDリストのオフセット値の修正を解説をする予定でしたが、ちょい面倒なので編集が容易になるツールを作りました。

"import.comfig -> TextFile"をクリックするとimport.comfigからテキストファイルを作成します。
"TextFile -> import.comfig"をクリックするとテキストフィアルからimport.comfigを作ります。
ConfigEditor.zip
Win7にて動作確認済み(GUIアプリです)
(91.68 KiB) ダウンロード数: 660 回


変換したテキストファイルを開いて「StubTable.*」となっている所を編集すればStubアドレスリストを編集できます。(右の数字はStubアドレスの数です)
ce.png


たとえば8つから5つに変えるときはこのようにします(アドレスは適当です)
ce2.png


NIDリストのオフセット値の修正は勝手にやってくれるので特に気にする必要は無い・・・はずです

Re: HBLをPatapon以外に対応させる

未読記事Posted: 2010年9月10日(金) 17:57
by teck4
便利なツールをありがとうございます。
とても簡単にconfigファイルが作ることができました。
おかげで先に進むことができます。

Re: HBLをPatapon以外に対応させる

未読記事Posted: 2010年9月27日(月) 10:23
by neur0n
ConfigEditorに「ファイルへのパスが長いとエラーが出てアプリが終了する」バグがあったので修正。
特にエラーが起きていなければ作り直す必要は無いです。

ConfigEditor.zip
(198.17 KiB) ダウンロード数: 697 回

Re: HBLをPatapon以外に対応させる

未読記事Posted: 2010年10月11日(月) 13:20
by neur0n
追記:

このツールを使うよりもHBLに同梱されてるRubyスクリプトを使ったほうが効率がいいです。
このツールはPCに事情があってRubyが使えない人向けですね。

Re: HBLをPatapon以外に対応させる

未読記事Posted: 2010年10月19日(火) 00:16
by neur0n
table.c の int build_nid_table() をパッチします。

コード: 全て選択
         // Get actual call
         cur_call = pentry->jump_pointer;
         good_call = get_good_call(cur_call);

の下の行に以下のコードを埋め込んでみてください。


コード: 全て選択
#ifdef BUILD_NID_UTILITY_FIX
         if( strcmp( (char *)pentry->library_name , "sceNet") == 0)
         {
            LOGSTR0(" is killed here\n ");
            good_call =0xFFFFFFFF;
         }
         else if( strcmp( (char *)pentry->library_name , "sceMp3") == 0)
         {
            LOGSTR0(" is killed here\n ");
            good_call =0xFFFFFFFF;
         }
         else if( strcmp( (char *)pentry->library_name , "sceMpeg") == 0)
         {
            LOGSTR0(" is killed here\n ");
            good_call =0xFFFFFFFF;
         }
         else if( strcmp( (char *)pentry->library_name , "sceNetAdhocMatching") == 0)
         {
            LOGSTR0(" is killed here\n ");
            good_call =0xFFFFFFFF;
         }
         else if( strcmp( (char *)pentry->library_name , "sceNetAdhoc") == 0)
         {
            LOGSTR0(" is killed here\n ");
            good_call =0xFFFFFFFF;
         }
         else if( strcmp( (char *)pentry->library_name , "sceNetAdhocctl") == 0)
         {
            LOGSTR0(" is killed here\n ");
            good_call =0xFFFFFFFF;
         }

#endif


あとは exploit_config.h に #define BUILD_NID_UTILITY_FIX と追記すればおk

追記:
こうしたほうが見やすいかも
コード: 全て選択
#ifdef BUILD_NID_UTILITY_FIX
         if( strcmp( (char *)pentry->library_name , "sceNet") == 0
            || strcmp( (char *)pentry->library_name , "sceMp3") == 0
            || strcmp( (char *)pentry->library_name , "sceMpeg") == 0
            || strcmp( (char *)pentr->library_name , "sceNetAdhocMatching") == 0
            || strcmp( (char *)pentry->library_name , "sceNetAdhoc") == 0
            || strcmp( (char *)pentry->library_name , "sceNetAdhocctl") == 0 )
         {
            LOGSTR0(" is killed here\n ");
            good_call =0xFFFFFFFF;
         }

#endif


追記:この問題はr102で修正されたようです。r102以降ではこのパッチは必要ないと思われます。