2

ゲーム自体の言語からスクリプト コマンドをフックし、それらに機能を追加するという意味で、 Skyrim Script ExtenderおよびFalloutNV Script Extender と非常によく似た、小さなゲーム用の C/C++ でスクリプト エクステンダーを作成したいと思います。まったく新しい方法。

残念ながら、どこから始めればよいかわかりません。私がどこに行けばよいか、または私が学ぶのに役立つ Google でできることを知っている人はいますか? 上記のプログラムのソースコードを読んでみましたが、だめでした。

どんな助けでも大歓迎です。

4

3 に答える 3

1

ゲームの拡張を可能にするこれらのツールのほとんどは、多かれ少なかれコンピュータ ウイルスのように機能します。彼らは自分のコードを注入するために元のコードを変更しますが、そのコードはコンピュータを破壊するような意地悪なことではなく、キャラクターの鎧を強化するなどの素晴らしいことを行います。ただし、原則として、使用される手法は同じです

残念ながら、コンピュータ ウイルスの作成方法を詳細に説明すると、明らかにスタック オーバーフローの利用規約に違反することになります。モッディング自体でさえ、法的に疑わしい問題を抱えている可能性があります。

リバース エンジニアリングの法的問題に関する FAQ:
https://www.eff.org/issues/coders/reverse-engineering-faq

しかし、できれば禁止されることなく正しい方向に向けるために、いくつかの一般論をお伝えできます.

他人がコンパイルしたソフトウェアを変更することは、基本的にオブジェクト コードをデバッグする技術です。コードの機能を理解できれば、コードの機能を変更できます。そのため、C デバッガーのドキュメントを読むことから始めるのが最善の方法です。デバッガーの学習の一環として、アセンブリ コードも学習する必要があります。専門家である必要はありませんが、基本を知っておく必要があります。デバッガーを真にマスターできれば、後は簡単です。

だから、これ以上苦労せずに...


改造者の禁止読書リスト

Shim (コンピューティング):
http://en.wikipedia.org/wiki/Shim_(コンピューティング)

DLL インジェクション:
http://en.wikipedia.org/wiki/DLL_injection

依存関係ウォーカー:
http://en.wikipedia.org/wiki/Dependency_Walker

ダイナミック リンク ライブラリの検索順序:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx

PE ファイル形式: (Windows)
http://en.wikipedia.org/wiki/Portable_Executable

Microsoft PE および COFF 仕様:
http://msdn.microsoft.com/en-us/windows/hardware/gg463119.aspx

ELF ファイル形式: (Linux、一部のゲーム コンソール、コイン操作)
http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

名前マングリング:
http://en.wikipedia.org/wiki/Name_mangling

DllMain で恐ろしいことをしてはいけないいくつかの理由: (あなたの場合を除いて...)
http://blogs.msdn.com/b/oldnewthing/archive/2004/01/27/63401.aspx

GetProcAddress 関数:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683212%28v=vs.85%29.aspx

手動によるスタックのウォーク:
http://msdn.microsoft.com/en-US/library/windows/hardware/ff552143(v=vs.85).aspx

Windows 用デバッグ ツール (DDK): http://msdn.microsoft.com/library/windows/hardware/ff551063(v=vs.85).aspx

メモリ ウィンドウ: (メモリの内容を表示)
http://msdn.microsoft.com/en-us/library/s3aw423e(v=vs.120).aspx


dllを使用してアドレス空間に入る代わりに...

バッファ オーバーフロー: (最近はソフトウェアよりも脱獄 ROM 向け)
http://en.wikipedia.org/wiki/Buffer_overflow

命令の再配置: (「古い学校」)
http://en.wikipedia.org/wiki/Relocation_%28computing%29

リベース: (「古い学校」)
http://en.wikipedia.org/wiki/Rebasing


アクセシビリティ API

より制限された選択肢ではありますが、クリーンで合法的な方法をお勧めします: アクセシビリティ フックです。アクセシビリティ機能の実装は、ブードゥー教や魔術の知識がなくても、有能なプログラマーなら誰でも実現できます。

Windows アクセシビリティ API:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd373592%28v=vs.85%29.aspx

Android アクセシビリティ サービス:
http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html

アクセシビリティ機能は、オペレーティング システムによって配置される "フック" であり、目の不自由なユーザーや麻痺したユーザーなどの障害のあるユーザーが、ソフトウェアを一般的に "変更" するツールを使用できるようにします。これは、ユーザーが見ることができないため UI を読み上げるスクリーン リーダーなどの機能を追加するためです。

フックは特にボタンの押下などに応答することを目的としていますが、多くの創造的な方法でこれらを悪用できます。たとえば、ホットキー機能が組み込まれていないプログラムにホットキーを追加するアクセシビリティ フックを作成できます。

アクセシビリティ フックは、最もクリーンで責任ある方法です。プログラム バイナリを変更する必要はありません。アクセシビリティ フックは、ソフトウェアの動作を変更できるようにすることを目的としています。最も重要なことは、アクセシビリティ フックを設計どおりに使用する場合、元のソフトウェアをリバース エンジニアリングしたり、EULA に違反したりする必要がないことです。

ただし、制限があります。一部の (多くの) ゲームは、オペレーティング システムを介してボタンをバックエンドすることなく、画面に直接描画します。または、マウスイベントなどを介さずにハードウェアに直接アクセスします。通常、障害を認識している企業は、これをオフにするモードまたは代替手段を提供します。たとえば、AMD Cataylst では、CCC コントロール パネルのウィンドウ ドレッシングをオフにして、アクセシビリティ ツールと連携させることができます。一部のゲームは画面に直接描画しますが、ボタン イベントとテキスト ラベルでオペレーティング システムに通知するため、スクリーン リーダーは動作します。Valve は直接アクセスを行いますが、独自のクローズド キャプションを実装しました。それはコード品質の問題です。残念ながら、多くの人は障害者について考えていません。それは本当にゲームに依存します。

そのため、可能であれば、ゲームがサポートしているオペレーティング システムのアクセシビリティ機能を使用してください。

于 2014-12-06T13:45:40.730 に答える
0

あなたが言及した両方のプロジェクトはオープンソースであり、それらのソースは開始するのに最適な場所です. 拡張しようとしているスクリプト言語によって、必要な作業がある程度変わります。オープン ソース (Lua、v8 など) のスクリプト言語は、独自のクローズド ソース言語 (SC2 ギャラクシー スクリプトや NWNScript など) よりもはるかに簡単に拡張できます。 )。

また、拡張しようとしているスクリプトのゲームを調査することもできます。他の誰かが (NWNScript のように) 必要なビットを既に実行している可能性があるためです。

最悪のシナリオに陥った場合、OllyDBG や IDA などのツールを使用して、アセンブラーとデバッグ/リバース エンジニアリングのスキルを開始するのが最適です。

于 2012-04-17T12:24:50.380 に答える
0

残念ながら、SKSE および関連プログラムで使用される手法は単純ではなく、完全に理解するのが難しい場合があるため、すぐに「理解」できなくても心配する必要はありません。私の非常に基本的な理解は、Skyrim の関数、メソッド、およびデータをメモリ内で見つけて、必要に応じて変更するということです。新しいコードを追加するには、ゲームのデータ構造とクラスを逆アセンブリからリバース エンジニアリングし、EXE 内にどのようなデバッグ情報を残す必要があります。

最終的に、最良の情報源はソース コードそのものです。それがどのように行われるかを学ぶことに本当に興味があるなら、私は大まかに次のように問題に取り組みます:

  1. すべての SKSE クラスをすばやく確認し、クラス構造を描画します。
  2. 各クラスで、それが何をすることを意味するかについての基本的な理解を得る.
  3. SKSE の開始点を見つけ、プログラムの実行を手動でトレースします。「手動でトレースする」とは、実際にコードを読んで、コードが何をしているのかを理解しようとすることです。
  4. コードを十分に理解したら、SKSE コードを使用していくつかのテスト プロジェクトを作成してみてください。

その他のオプションとして、 OblivionまたはMorrowindスクリプト エクステンダーを検討することもできます。これらはより成熟していますが、同様の手法を使用しています。時間があれば、公式のSkyrim Mods フォーラムで「ianpatt」およびその他の SKSE 開発者フォーラムのトピックをすべて確認することもできます。彼はさまざまな低レベルのトピックについて時折議論しています。

于 2012-04-17T12:19:48.370 に答える