
SSGを投稿したり、ゲーム解析について語るスレ
投稿日 |
: 2016/07/09(Sat) 16:45 |
投稿者 |
: amateur◆kR..xsXL6RU |
参照先 |
: |
猫缶Indexが閲覧不可になった際に開設された難民用の臨時掲示板が閉鎖されることになりましたので、
上記掲示板にあったスレの続きをこちらに立てました。
基本、前のスレと同じ感じで進行できればと思います。
前のスレでお世話になった方々、こちらでもよろしくお願いいたします。

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.261)
投稿日 |
: 2016/10/29(Sat) 02:28 |
投稿者 |
: amateur◆kR..xsXL6RU |
参照先 |
: |
>>260 yunさん
SSGありがとうございます。ついにセルフ変数追加ですか。
結局、コモンイベント系も全部yunさん頼みになってしまいました・・・
これでウディタの残っていた課題も解決、でしょうか。
項目表示をずらす機能についてですが、
基本的な構造は結構単純で、例えば、表示するタイプ(ID)をを30個ずつずらすには、以下のように書けばよいと思います。(関数的構文を使う場合の例です)
//空きメモリを確保(最初の「0」は確保したメモリ領域の番号。次の「100」はサイズですが何を書いても結局0x1000になるそうです。「RW」は書換え可能領域という意味っぽいです)
[allocate]0, 100, RW
//上記で確保した空きメモリに任意の数値を書き込む(この値によってずれる表示タイプの数が変わる)。「Memory::0」は確保した空きメモリの番号0の先頭アドレス。「Memory::0+0x4」だと先頭から+0x4。
[subject]表示するタイプを【書込み値*30】個ずつずらす【 '+' _mem, _Memory\:\:0, 4,num ,??,%d '+' 】/書込み値/_:calc, _Memory::0, 0, 99999, unsigned
//【書込み値*30】個ずつずらす、のずらす表示数を定義。
[define DP] [:Memory::0:]*30
//各データベースの項目の値のアドレスを関数的構文で記述($typeがタイプのIDを示す)
[define db_value] [:[:[:(ベースアドレス):]+0x14+$type*0x28:]+0x04+$data*0x20:]+0x00+$chap*0x4
//上記で定義したDBのアドレスの「$type」の部分に、「 (タイプのID値)+{DP}(=空きメモリへの書込み値*30) 」の値を代入。
[subject]項目名/現在値/_:calc, _(タイプのID値)+{DP}=>type; {db_value}, 最小値, 最大値, unsigned
(1000文字制限に抵触するので書込みを分割します)

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.262)
投稿日 |
: 2016/10/29(Sat) 02:29 |
投稿者 |
: amateur◆kR..xsXL6RU |
参照先 |
: |
(↑の続き)
ダラダラと書きましたが、要するに、「 (タイプのID値)=>type 」と代入する箇所を、
「 (タイプのID値)+(空きメモリへの書込み値*30) =>type 」と変更すればよいだけだと思います。( 0x[! $Val !]+(空きメモリへの書込み値*30)=>type など)
(空きメモリへの書込み値*30) は上の例だと「 [define DP] [:Memory::0:]*30 」で定義して、{DP}と書くことになります。
データのIDや、項目の番号(ID)についても同様です。=>data や、=>chap と代入する箇所を上記と同様に変更することになります。
以前は空きメモリを確保する[allocate]が無かったので、勝手に値を書き込んでよい空きアドレスを自分で見つける必要がありましたが、
今は変態紳士さんのSpoilerAL修正パッチで[allocate]が実装されましたので、項目ずらし技が使いやすくなりました。
関数的構文を使わず、普通にアドレスを書く場合は、下記のように書けばよいと思います。(ウディタではなく一般的な例)
[allocate]0, 100, RW
[subject]表示項目を【書込み値*30】個ずつずらす【 '+' _mem, _Memory\:\:0, 4,num ,??,%d '+' 】/書込み値/_:calc, _Memory::0, 0, 99999, unsigned
[subject]項目番号[[! L$Val !]+'+' _mem, _Memory\:\:0, 4,num ,??,%d '+'*30]/現在値/_:calc, _0x1000000 +(0x[! $Val !]+[:Memory::0:]*30)*0x20, 最小値, 最大値, unsigned
(アドレス部分が本来、「 _0x1000000 +0x[! $Val*0x20 !] 」である場合に、項目表示を30個ずつずらす場合の例)
参考に、項目ずらしのサンプルSSGを添付します。(対象プロセスはSpoilerAL.exe。SpoilerALを起動するだけでOK)
うさみみ等でアクセスアドレスとその値を確認すれば分かりやすいと思います。

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.263)
投稿日 |
: 2016/10/30(Sun) 04:44 |
投稿者 |
: 大七星◆y3el2XfkmCg |
参照先 |
: |
>>259 amateurさん
+0x50という事はやはりmono_root_domain->static_data_arrayですね
幾らかソースを読み進めたのでUnityインスペクタを仮組してみました
α+β×みたいな項目は件のずらし用のページャ電卓です
mono_root_domainではstatic_data_arrayとstatic_data_class_arrayから
staticフィールドを持つクラスのフィールド一覧を表示します(たぶん
値にアクセス出来るフィールドがstaticフィールドのはず…です
値型(構造体)の場合はアクセスアドレスに構造体内容がありますが、
参照型の場合はアクセスアドレスにあるのは参照ポインタ値です
gc_handles[HANDLE_PINNED]はアドレス固定されたインスタンスの一覧?
対象プロセスが>>58の DustShooters試遊版になっています、適宜変更してください

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.264)
投稿日 |
: 2016/10/30(Sun) 15:57 |
投稿者 |
: (仔猫)◆KCezBilYINU |
参照先 |
: |
>>263
大七星さん提供ありがとうございます。
と言うわけで恥ずかしながら、添付1が『DustShooters試遊版』の(以前作った)サンプルSSGです…いつものやり方で解析したので不完全です。ゲーム中にESCでタイトルへ戻るとアドレス(クラスのフィールド?)が再配置されてしまって。
うーんまだ勉強不足です(安定した経路ができませんでした。)
(このアドレスが変わる現象は、メモリー再利用のためかな?RPGとかSLGのゲームなら固定されてることが多いのですが。。。)
>>260
yunさん更新ありがとうー。
ウディタSSG制作補助用SSGを使って色々とウディタ製ゲームの解析やってます。
添付2が『とつげきダンジョン!2(Rush Dungeons!β)』のSSGです。
ちなみにこの2つのゲーム…窓の杜で知りました(窓の杜をみて解析やることが多くなってしまった汗)
追記:
>>265
amateurさん
>イグニッシアサーガ
おわ!っとイグニッシアサーガ第六幕(IS6)がまだ途中でした〜。終わり次第、IS14へ行きたいです。
提供ありがたや〜。


編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.265)
投稿日 |
: 2016/10/30(Sun) 18:36 |
投稿者 |
: amateur◆kR..xsXL6RU |
参照先 |
: |
>>263 大七星さん
SSGありがとうございます。
早速使ってみたのですが、件のベースアドレスが「0x101F42C4」のゲームで、
「mono_root_domain」の方で、色々なデータの種類(何のデータか)がほぼ丸分かりになりました。
自力解析では何のデータか分からなかった箇所もほぼ判明・・・これは物凄く便利です・・・!
ベースアドレス「mono.dll+0x1F30AC」のゲームは、gc_handles[HANDLE_PINNED] の方で情報表示されました。
これは、Unity解析の強力な武器になりそうです。
本当にありがとうございます。
>>264 (仔猫)さん
yunさんの提供くださったウディタの解析結果やSSGのお陰で、ウディタのSSG作成が飛躍的に楽になりましたね。
NEExploiTさんや臨時板管理人さんの解析結果もそうですが、お三方のお陰でウディタ解析は大部分達成された感じです。
そういえば、夏ごろから何度か中断しながら作っていたウディタ製ゲームのSSGが漸く完成したので、
需要無さそうですが、こちらにこっそりアップしておきます。
前に名前を出したゲームですが、 イグニッシアサーガ第十四幕-穢れし神に捧ぐ詠-です。
単に自分好みの作品なので作っただけですが。

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.266)
投稿日 |
: 2016/10/31(Mon) 05:02 |
投稿者 |
: 大七星◆y3el2XfkmCg |
参照先 |
: |
>>263をちょいと整形してインスタンスフィールドも弄れるようにしました
[undef]の便利さはシャレになry という事で両方のフィールドを出し
整数値が大半を占めると思うので、4バイトの電卓項目になっていますが
論理値は1バイト、実数はIEEE754だったりと、そぐわない物もあります
フィールドオフセット右の0x10ビットがstaticを示し、その場合
インスタンスアドレスではなく、vtable->data値へのオフセットになります
ついでにページャ(&で始まる)電卓をページ番号から行番号入力に変更して
インスタンスアドレスの入力で対象をinspectする&MonoObject項目を実装しました
>>52ほど詳細ではないものの、CreateRemoteThreadではないので安心・安全!
ちなみにSpoilerALでは再帰が難しいのでスーパークラスのフィールドは出ません
DustShooters試遊版は仔猫さんの経路だと&entries[569]や&entries[468]としても
直通で同程度の精度っぽいですが、それ故にタイトル画面へ戻るとやはりダメですね
対象の破棄後、というよりgc_handles[HANDLE_PINNED].entriesでは保証されない気が
static_data_arrayならクラスがロードされた順序にはなる?…しかし全て辿れるか否か


編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.267)
投稿日 |
: 2016/10/31(Mon) 17:34 |
投稿者 |
: (仔猫)◆KCezBilYINU |
参照先 |
: |
>>266
大七星さん更新ありがとうございます。
画像でわかりやすいメモリ配置、毎回参考になります(C#もいつの間にか理解できるようになってきてます。今度C#の本も買ってこよう。)
>DustShooters試遊版
情報ありがとうございます(アクションやシューティングゲームでは変数の保持?が必要ないからか初期化されちゃうのかなぁ)
また時間があるときにでもチャレンジしたいと思います。
追記:
>>270
>ちょっと記事が古いけど
めちゃ参考になりました図解でわかりやすい!(this.XXXXとか吉里吉里でも使ってるケースがありましたし、メモリ内部でこんな事が起きてたのかと参考になりました…。)

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.268)
投稿日 |
: 2016/10/31(Mon) 22:26 |
投稿者 |
: amateur◆kR..xsXL6RU |
参照先 |
: |
>>266 大七星さん
SSG更新ありがとうございます。
これは、>>52でアップしてくださったmono用ツールの機能を統合したという感じですかね。
既に入力すべきアドレス(インスタンスアドレス?)が分かってる場合は、
こちらの&MonoObject項目を使った方が早そうですね。
>>52のツールの方が詳しく表示されるとのことで、併用して使わせていただきます。

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.269)
投稿日 |
: 2016/10/31(Mon) 22:30 |
投稿者 |
: yun◆6As0zdMqREo |
参照先 |
: |
>>261-262 amatureさん
いろいろとありがとうございます。
普段使わない部分の頭をごりごり使ってなんとか実装できるようにしていきます。
実装できたらまた投稿します。
ウディタは項目表示が多すぎてずらしをつかわないと全部を表現しにくいのがなんとも…。
>>264 (仔猫)さん
>yunさん更新ありがとうー。
いえいえ。のんびりじっくりSSGに落とし込んでいったので超スローペースでしたがなんとか実装できました。
ちょっと時間が取れるようにはなってきたので、昔のバージョンのベースアドレスもたどれたら別口でどうにかしたいですね。

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.270)
投稿日 |
: 2016/11/01(Tue) 02:21 |
投稿者 |
: 大七星◆y3el2XfkmCg |
参照先 |
: |
>>267 仔猫さん
メモリモデルはMono公式から拝借…、ただC#というと本家.NETと互換Monoで若干実装は異なりますね
ちょっと記事が古いけど、 TypeHandleとSyncblkが逆位置で、参照位置もオフセットされていたり
「C#プログラマのための.NETアプリケーション最適化技法」とかJIT後のx86コードにまで踏み込んだ
変態的な訳書とかも有りましたが、いずれも巷には具体的な内部実装の解説はなかなか少ないよう
おそらくタイトル画面へ戻ると破棄され、再生成されても同位置になる保証はない感じですかね
今の経路だとentries[4]から相対でEnergyBarを持つEnergyBarToolkit.FilledRendererGUIへですが
インスタンスが固定解除や破棄されるとエントリから外れ、メモリも空き、そこへ別物が配置されると…
初回の相関関係は生成順序によって配置に規則性が生まれ、辿り着けているという具合だと思います
>>268 amateurさん
ツールの方はMonoが予め備えるデバッグ機能に働きかけるので、内部変更に強く一応重宝するものの
あれでは正確なアドレスが必要で、しくじるとアクセス違反、64bit両対応に実装がカオスになったり…
SSGでもメタ情報は追えそうなので、これを確立した後、補えない機能を開発するか保留になりそうです
しかし多少は煮詰まってきたし、AL修正パッチのおかげでポツポツとアイデアも浮かんできたので
そろそろAGE・MV・Unityあたりの汎用解析専用(意味不明)スレッドを立てる頃合いでしょうか
そういえばChromeのアップデートでMVのリモートConsoleと合わなくなったりしたのかな…動かない('A`

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.271)
投稿日 |
: 2016/11/01(Tue) 22:13 |
投稿者 |
: amateur◆kR..xsXL6RU |
参照先 |
: |
>>270 大七星さん
おお、まだSSGやツールの方も更新していただける可能性が・・・
現状でも自力解析するしかなかった以前と比べて格段にUnity解析の効率はアップしてますが、楽しみです。
>そろそろAGE・MV・Unityあたりの汎用解析専用(意味不明)スレッドを立てる頃合いでしょうか
このスレ自体が私があまりにテキトーに立ててしまったせいで闇鍋みたいになってますからね・・・
管理人さんからも情報まとめろ的なご指導もいただきましたし。
話題が多岐にわたりすぎて何のスレなのか意味不明に・・・

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.272)
投稿日 |
: 2016/11/03(Thu) 01:32 |
投稿者 |
: NEExploiT◆1I03EIw9l9M |
参照先 |
: |
当方環境でもMVが54.0でデバッグできない事を確認
Chromiumの過去版を適当に
(自分はなんとなくで381909)引っ張ってきたらおkだった
ティラノスクリプトはデバッグできないと思ってたが、
localhost:port/json でURLを入手すればデバッグできるかも?
変数保管場所まだ分からないので特に何もできないが

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.273)
投稿日 |
: 2016/11/04(Fri) 03:17 |
投稿者 |
: 七星◆y3el2XfkmCg |
参照先 |
: |
Unityのメモリ解析SSGもジェネリック型パラメータや
配列情報の表示に対応したので専用スレッドを作りました、大がもげました
ただ設計的にstatic_data_arrayから辿れない場合も有りそうなので
全てのゲームで汎用的なベースポインタかどうかはちょっと未知数です
SSGで作るとちょっとUIがアレ…でもMonoがオープンソースゆえに
既にありそう誰か作りそうな解析ツールを本格的に作りたくないのもまた一理…
>>272
嗚呼…おま環でなかった事を喜ぶべきか、嘆くべきか
TyranoScriptやAlmightでも汎用的に使えそうなだけに
現行バージョンで使えないとなると些か面倒ですね
変数は取得できているのから見るとプロトコル変更という訳でもないのかな?
↑↓が効かなかったり、Shift+Enterされたみたいに見えるのでバグなのか…?

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.274)
投稿日 |
: 2016/11/04(Fri) 21:48 |
投稿者 |
: amateur◆kR..xsXL6RU |
参照先 |
: |
>>273 七星さん
あ、頭の大を書き忘れられたのかと思っていたら、お名前変えられたのですね。
SSG更新とスレ立てお疲れ様です。
Unity用のSSGがさらに便利になってますね。ありがとうございます。

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.275)
投稿日 |
: 2016/11/08(Tue) 20:51 |
投稿者 |
: 七星◆y3el2XfkmCg |
参照先 |
: |
修正パッチスレで続けるのも何なのでこちらへレス
文字列に限らず領域を拡張するというのは、少し難しいかもしれないですね
プログラム的にも新たなメモリに元をコピー、参照先を更新がセオリーでしょうし
[allocate]へは難があるので、パラサイト等で確保しても破棄を任せられるのか、という問題
リンクリストのずらしはデリファレンスを増やすよりも、頭とする要素の切り換えでしょうか
Memory::0等にポインタを入れておき、各要素に自身のポインターをセットするトグル項目とか
表示数分すすめたポインターやリセットするトグル…何番目を参照しているのか併せて格納したり
ついでに幾人かプログラムがーパラサイトがーと仰っていたと思うので、調子に乗って
躓きそうなスタックの解説を書いてみたり(cdecl版、stdcallだとret 8とかで関数側が除去します
メソッド等に使われる、インスタンスをecxで渡すthiscallとか呼出規約は色々有るます
もっともこれは最適化がオフなので、実際の所こんな素直なコードにはなりませんが…
ちなみにスタックはヒープと違って各スレッドへ自動的に(既定では1MB)割り当てられます
と書いてて最近はゲームエンジン増えたから、プログラム改造も難しいかなーと思ったけど
Unity(Mono)なんかはJITコンパイルでネイティブコードになるのでメソッド一覧も必要になるかな?
ときにデータを遡るよりもクラスからメソッド辿ってプログラム書き換えの方が楽なケースも…?

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.276)
投稿日 |
: 2016/11/09(Wed) 01:23 |
投稿者 |
: amateur◆kR..xsXL6RU |
参照先 |
: |
>>275 七星さん
私がダラダラ書いた愚痴にレスくださって有難うございます。というか、申し訳ないです・・・(愚痴書きすぎて反省してます)
リンクリストのずらしの件、頭とする要素の切り換えですか、成程!
これは思いつきませんでした。書いてくださった方法を色々考えてみたところ、解決のイメージが見えてきたような気が。
何番目を参照しているのか併せて格納、これは [! #n !] で空きメモリにバイト列書込みすればいけそう?な感じですね。
これから実際にSSGに書いてみようと思います。貴重なご助言ありがとうございます。
それと、スタックの解説もありがとうございます。(添付いただいたスクショが凄く分かりやすいです)
関数内でお約束のように「PUSH EBP」「MOV EBP,ESP」と先頭にあるのは、こういう意味なんですね。
逆汗コード読むの苦手なんですが、少し理解が進んだ気がします。
(追記)
>>275の七星さんのご助言に従って、一応、ワードリピート使用時にも項目表示ずらしが可能になりましたので、
サンプルSSGを添付します。(項目が少なすぎて改造の役には立たないです)
Heartium〜ハーチウム〜というSRPG Studio製フリーゲームです。
「各クラスのステータス上限値等 (ワードリピート使用)」の項目が確認しやすいと思います。
「キャラステータス」の項目も同様の方法で書いたのですが、序盤ではキャラが少なすぎて正常動作してるか確認できないです。
SSGの中身がゴチャゴチャして分かりにくい上に、七星さんが想定されたものとは違うかも知れませんが・・・

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.277)
投稿日 |
: 2016/11/09(Wed) 21:23 |
投稿者 |
: 七星◆y3el2XfkmCg |
参照先 |
: |
>>276 amateurさん
push ebp〜は定番ですね、後に実装されたプロローグコード相当のenterは
互換性を重視してなのか、暗黙的なレジスタ変更を嫌ってなのか
コンパイラが吐くのをほどんど見たことがありませんが…そもそも遅い?
リンクリストのずらしは少々説明が解りづらかったでしょうか
私が考えたのはこんな感じです、各要素トグルonで、それが先頭になります
リンクリストは芋づる式?なので、先頭だけ保持してやれば良いです
32オフセットの方はうまくワードリピート出来ていないかな…?

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.278)
投稿日 |
: 2016/11/09(Wed) 22:14 |
投稿者 |
: amateur◆kR..xsXL6RU |
参照先 |
: |
>>277 七星さん
リンクリストのずらし、SSGまで作っていただいてありがとうございます。
早速試してみましたが、見事表示がずらせています。
SSGを拝見しましたが、凄すぎて30分ほど読んでも仕組みが私には理解できないです。
10年経っても私では自力でこれを書くのは無理な気が・・・(汗)
何か、越えがたい壁の存在を感じてしまいました。まだまだ勉強が足りないですね・・・
とりあえず、アップしてくださったSSGをよく読んでみます。(理解するのに何日かかるかな・・・)
>32オフセットの方はうまくワードリピート出来ていないかな…?
これについては先程、SpoilerALの修正パッチスレの方で報告しましたが、
ワードリピートのバグに起因する気がします。
「開始値」が0以外(1以上?)だと、ループ変数=「開始値」の時のワードリピートの文字列の出力回数が必ず「1」になってしまうようです。
開始値の次の値以降は「増加値」が幾つかは関係なく、必ず1ずつ出力回数が増えていく(2,3,4,5・・・となる)のような感じで。
>>276のSSGの必須コード部分に、無駄に[repeat]で「0,30,1」と書いて30個も項目があるのは、
「29,30,1」だと正常機能しないからだったりします。

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.279)
投稿日 |
: 2016/11/09(Wed) 23:31 |
投稿者 |
: 七星◆y3el2XfkmCg |
参照先 |
: |
>>278 amateurさん
さっそく三項演算子とコードセクション取得を使ってみたくらいで
あとは特別な演算はしていないので、SSG展開直後の利便性を考慮して
[allocate]した[:Memory::0:]がNULLなら、amateurさんのポインタを参照というだけです
リンクリストの要素(主にノードと呼ぶらしい)各項目では、[allocate]したMemory::0に
自身のノードアドレスと、それだけだと不明なノード番号(表示用)を書き込んでもらいます
すると最初に参照するノードが、先頭へのポインタから[:Memory::0:]へ切り替わるので
ノードが次ノードへの参照を持つリンクリストでは、それだけで全てずれていきます
この辺りは概念の理解というか、知らないと分からないけど、解ったら何でもない的な
私もオブジェクト指向のクラスとか構文だけを見て、関数を纏めたもの?と妙な捉え方をして
データと関数の結びつきが大事ということに気づかず、理解に時間が掛かったものです
ワードリピートは確かにバグっぽそうですね

編集

Re: SSGを投稿したり、ゲーム解析について語るスレ (No.280)
投稿日 |
: 2016/11/10(Thu) 22:57 |
投稿者 |
: amateur◆kR..xsXL6RU |
参照先 |
: |
>>279 七星さん
解説ありがとうございます。ああ、追加された三項演算子を使われているのですね。
理解できないはずでした・・・(三項演算子自体をまだ理解してないので)
というわけで、先に三項演算子のお勉強が必要のようです。
ただ、七星さんのSSGや解説くださった内容から、少しSSGを改良するヒントが得られましたので、
>>276のSSGを修正しました。これで少しは見栄えがマシになったかと・・・

編集