-
Notifications
You must be signed in to change notification settings - Fork 6
Value Search ja JP
Value Search タブは、すべての UObject インスタンス全体にわたって反射された (UPROPERTY) フィールドをスキャンし、述語に一致する値を検索します。本質的には、Cheat Engine の Find First Scan を UE のオブジェクトグラフに適応させたものです。ゲームプレイ値のストレージロケーションを特定するために使用してから、Live-Walker を使用してそのフィールドを所有するオブジェクトを検査し、ポインタチェーンを抽出します。
デフォルトモード: すべてのオブジェクト全体で 1 つの値の全インスタンスを検索します。
-
Type ドロップダウンからデータ型を選択します:
Int32、Float、FString、FVectorなど。不明な場合は NumericNoByte で始めてください (ワード/ダブルワード/クワッドワード/フロート/ダブルを 1 パスでスキャンします; 小さな値が結果に殺到しないように 1 バイトフィールドを除外します)。 -
Scan から述語を選択します:
- Exact — 値が入力値と等しい (例: HP = 100)。
- Bigger / Smaller — 数値順序 (例: レベル > 50)。
- Between — 範囲 (例: マナ 25..75) — 両方の境界を入力した後、ライブプレビューが表示されます。
- Contains / StartsWith / EndsWith — 文字列の部分文字列マッチ。
- 値を入力します (例:
100、"PlayerName"、FVector の場合は1.5,2.5,3.5)。 - First Scan をクリックします。DLL はすべての GObject インスタンスとそれらの TArray 要素を走査し、反射された数値 UPROPERTY フィールドを述語に対してテストし、マッチを返します。
- Next Scan で精密化: 述語または値を変更し (例: HP が 95 に変わった)、Next Scan をクリックします。DLL は既存の候補を再読み込みし、まだマッチしているもののみを保持します。
- 精密化で Changed / Unchanged / Increased / Decreased を使用して、前回 のスキャンと比較します (明示的な値は不要 — 値ボックスは非表示になります)。
| 制御 | 動作 |
|---|---|
| Game classes only | デフォルト ON。エンジンパッケージ (/Script/Engine、/Script/CoreUObject など) をスキップします; ゲームプレイクラスと Actor/Pawn/Component 派生物は常に保持されます。スキャンが高速で、結果がクリーンです。 |
| Parallel scan | デフォルト ON。First Scan はワーカースレッドを使用します (高速)。OFF = シングルスレッド、アンチタンパーに対してよりステルスです。Next Scan は既にシングルスレッドです。 |
| Batch read | デフォルト ON。各オブジェクトの固定フィールドを 1 つのボディ読み込みで読み込みます (システムコールが少なく、キャッシュが向上します)。OFF = フィールドごとに 1 読み込み (正確なバイト境界)。First Scan のみ。 |
| Deep (nested containers) | デフォルト OFF。深くネストされたコンテナ内もスキャンします (例: SaveSlot[1].ItemList[3].Mods[N].Value)。重いですが、浅いスキャンが見逃す配列/構造体に埋もれた値を検出します。 |
| Native-C (raw) | デフォルト OFF。オプトイン。以下の Native-C fields を参照してください。 |
| Newest first | デフォルト OFF。オブジェクトを高インデックスから低インデックスに走査 (最後に割り当てられたものが最初) し、切り詰めが古いテンプレートではなく新しいインスタンスを保持します。Native-C が ON の場合、自動的に有効になります。チェックを外すタイミング: 値がゲーム開始時に生成されたメインキャラクター (低インデックス) に存在する場合。 |
| Skip Engine/System noise | デフォルト OFF。プリフィルター: スキャン時に純粋なエンジン/システムクラス (UI ウィジェット、テクスチャ、サウンド、Niagara、アニメーションインスタンス) をスキップします — 結果に入りません。下記のクラスピッカー (フィルター後) とは異なります。ゲームプレイ保護により Actor/Pawn/Component/PlayerState/GameInstance 派生物を保持します。First Scan でロックされます。 |
| Max | デフォルト 50k。ヒット数がこれに達したときに停止します; 結果が切り詰められている場合は増やしてください。 |
| Timeout | デフォルト 25 秒。スキャンの期限です; 400K 以上のオブジェクトゲームがタイムアウトする場合は増やしてください。Next Scan (精密化) は高速です — 両方のモードにこれを使用します。 |
Round (デフォルト)、Trunc、Ceil — 小数のフロート/ダブル ターゲット が整数に縮小される方法 (ゲームが比較の前に表示するもの):
- Round: 10.9 → 11; Between 10.9–11.1 → 11–11。
- Trunc: 10.9 → 10; Between 10.9–11.1 → 10–11。
- Ceil: 10.1 → 11; Between 10.1–11.1 → 11–12。
整数フィールドと Float/Double フィールド値は影響を受けません; 入力された小数 ターゲット のみが強制されます。(古い ± 許容帯域に置き換わりました。)
列: Class.Field | Type | Origin (Reflected vs Native-C) | Value | Offset | Address | Instance (オブジェクト名)。
行ごとのアクションボタン:
- Live — Live-Walker にジャンプ、このフィールドのオフセットに焦点を当てたインスタンス内。
- inst — Instance Finder を開く、このフィールドの所有クラスで事前入力。
- Addr — フィールドの絶対メモリアドレスをコピー。
- 🔗 — Related タブでこのインスタンスの関連オブジェクト (コンポーネント、GAS AttributeSet など) を表示。
- 🌍 — GWorld に位置付け: GWorld からこのインスタンスまでの最短ポインタパスを検出し、チェーンを示す Live-Walker で開く。
- ⚙ — GameEngine に位置付け: GWorld と同じですが、UGameEngine にルート付け (GWorld が到達できないエンジン所有オブジェクトに到達します)。
- 📊 Pivot (実験的) — このフィールドを Class Pivot タブに、そのクラスのインスタンス全体の**射影値(projected value)**として送ります(Class Pivot は同一性または別途選んだ key フィールドでグループ化し、このフィールドではしません)。実験的 Class Pivot タブが利用可能なときのみ表示。
フィルター & ソート (下行、完全な結果セット上のサーバー側):
- キーワードフィルター (任意の列、大文字小文字を区別しない)。
- ソートピッカー: Scan order、Value、Class、Field、Type、Offset、Address、Instance; Desc トグル。
- ページロード: 初期表示は最初の 1,000 行です; Load More は次のページを取得します。
異なるオフセットで同時に 2–4 値すべてを保持 するオブジェクトを検出 — 個別のシングル値スキャンよりはるかに選別的です。例: Str=24、Def=18、Dex=15、Int=20 を 一緒に マッチングすることで統計オブジェクトを特定します。
- 上部で Single value ↔ Multiple values (group) を切り替えます。
-
2–4 値を入力 — 1 行に 1 つ。各行は:
- Data type (デフォルト NumericNoByte)。
- Scan type (Exact / Bigger / Smaller / Between / Changed / Unchanged / Increased / Decreased — シングル値と同じ)。
- Value ボックス; prev-value タイプで非表示。
- ..to ボックス (Between のみ)。
- ライブ Between 範囲プレビュー。
- Group First Scan をクリックして、一度にすべての値にマッチするオブジェクトを検出します。
- Group Next Scan をクリックして精密化 — 例: 新しい値を入力するか、さらに絞り込むために Unchanged に切り替えます。
| 制御 | 動作 |
|---|---|
| Deep (nested containers) | デフォルト OFF。各数値 TArray / 構造体配列要素は独自のマッチブロックになります; 深くネストされたコンテナ内に埋もれたグループを検出します。 |
| Cross-object (owned components) | デフォルト OFF。各アクターの所有子オブジェクト (コンポーネント、GAS AttributeSet) をアクターのマッチブロックに折り畳み、{actor、そのコンポーネント、属性セット} に分散されたグループが検出されます。 |
| Native-C (raw) | デフォルト OFF。各オブジェクトのブロック内の管理されていないホールを含めます。 |
| Newest first | デフォルト OFF。最新優先で走査 (Native-C で自動有効化)。ターゲットが初期生成、低インデックスオブジェクトの場合はチェックを外します。 |
| Skip Engine/System noise | デフォルト OFF。シングル値と同じプリフィルター。 |
| Rounding mode | シングル値と共有; すべてのスロットに適用されます。 |
| Timeout | シングル値と共有。 |
上部グリッド: 行 = マッチしたオブジェクト。列: Class | Instance | マッチした値 (サマリー)。
行を選択 して 詳細パネル を展開して下記を表示:
- ロック済みオフセットテーブル (すべてのスロットが単一オフセットに収束した場合) — 例: "🔒 Class — Str@0x20, Def@0x24, Dex@0x28, Int@0x2C"。
- スロットごとのマッチしたフィールドエントリ: ロック状態 | Class.Field パス | Value | ボタン (Live / Addr / 🌍 / ⚙ / 📊 Pivot (実験的 — スロットを Class Pivot に送る;そのタブが利用可能なときのみ表示))。
すべてのハンドオフ (Live、Locate、Copy) はシングル値イベントを再利用; クロスオブジェクトスロットは所有する子オブジェクト (コンポーネント/AttributeSet) を開きます。
フィルター & ソート (サーバー側): キーワードフィルター (class/instance/field/value)、Scan order / Class / Instance / First value / First offset でソート。
デフォルトでは、Value Search は UPROPERTY 反射フィールドのみを表示 します。多くのゲームはゲームプレイ値 (HP、MP、スタミナ、統計) を UPROPERTY() マクロ なし の平文 C++ メンバーとして保存します — これらは反射に対して不可視です。
- 問題: 反射フィールドウォーカーはプロパティメタデータのみを読み込みます; 管理されていないバイトはスキップされます。Cheat Engine の生スキャンはそれらを検出します; Value Search はできません。
-
解決策: Native-C (raw) を有効にして 管理されていないホール — 各オブジェクト内のバイト範囲 (UObject ヘッダーの後からクラスの
PropertiesSizeまで) をスキャンすることもできます。UPROPERTY が対応していないもの。スキャナーは「Guess What」ヒューリスティックを使用して生バイトを Int32/Float/等として解釈します。
- Native-C (raw) をオンにします (シングルまたはグループモード)。
- Data type を選択します (数値のみ: Int32、Float など — 文字列、ベクトル、ブール値なし)。
-
First Scan は意図的にノイズが多い — ホールオフセットのマッチング 4 バイトはヒットです。以下でフィルター:
- Game classes only トグル (エンジンノイズをスキップ)。
- 結果の下のクラスピッカー (明らかな非ターゲットを除外)。
- または単に Newest first に切り替えて新しいインスタンスを保持 (自動有効化)。
- Next Scan で収束: 値を変更するか、Changed / Unchanged / Increased / Decreased を使用して再読み込みし、ノイズの多い最初の結果を削減します。
マッチした行は Origin 列を表示します:
- Reflected — 通常の UPROPERTY フィールド。
- Native-C (Int32) — Int32 として解釈された生ホール; "?" サフィックス (Int32?) は不確かな信頼度を意味します。
Deep と Native-C の両方が有効な場合、生スキャンは 構造体配列要素内 にも到達します — 例: UPROPERTY メンバーのない USTRUCT の TArray 内の値。さらに重く、ノイズが多い; 特徴的な値と Next Scan 精密化とペアにしてください。
スキャンが成功した後、結果行の 🌍 Locate in GWorld をクリックして、グローバル GWorld からそのインスタンスまでの最短ポインタパスを検出し、チェーンを示す Live-Walker にジャンプします。
🌍 GWorld — ワールドルートアクター (Pawn、NPC、アイテム、破壊可能物など) に到達します。
⚙ GameEngine — 代わりにエンジン所有オブジェクト (UI、GameInstance、LocalPlayer、エンジンシステム) に到達します。インスタンスがワールドグラフにない場合は使用してください。
インスタンスがスキャン以降に移動または解放された場合、パス検索は「no path」または「invalid」を報告します。
-
Containers (TArray, TSet, TMap) — すべての要素がスキャンされ、
FieldName[index]として表示されます。10,000,000 要素以上の配列は破損ガードとしてスキップされます。 - Instance selection — スキャン後、Load More をクリックして追加ページを取得 (サーバー側ページング)。フィルター/ソートは DLL の完全なセッション上で実行; グリッドは常に現在のウィンドウを表示します。
- Session lifetime — セッションは New Scan をクリックするか、タブを切り替えるまで永続します。Next Scan は現在の候補セットを再読み込みします; New Scan は破棄して新しいクエリにリセットします。
- Value2 (Between) — Scan type が Between の場合、上限は必須です; ライブプレビューは選択した丸め方法の下で強制された整数 + リテラルフロート範囲を表示します。
- Case sensitivity — 文字列型のみに影響 (FString、FName、FText); デフォルトは大文字小文字を区別しない (Cheat Engine スタイル)。
-
String vectors — FVector を
X,Y,Zとして入力 (例:10.5,20.3,30.1)。 - Small values + NumericAll — NumericAll (1 バイトフィールドを含む) で 0、1、または 255 を検索すると、すべてのオブジェクト全体のフィールドの膨大な数にマッチします; 結果に殺到しないようにするには NumericNoByte または より大きく/より特徴的な値を使用してください。
- Native-C first scans truncate — 大規模なゲームでは、ノイズが多い生スキャンはすべてのオブジェクトをスキャンする前に結果キャップに到達する可能性があります。Newest first は生存者が古い CDO ではなく最後に割り当てられたもの (最新のゲームプレイインスタンス) であることを確認します。Game classes only はノイズをプリフィルターします。Next Scan で絞り込んだ後に収束します。
- Instances — 名前/プロパティパターンで特定のクラスのインスタンスを検出。
- Live-Walker — UObject を検査してポインタチェーンを走査; Cheat Engine スクリプトをエクスポート。
- Home — 概要とフィーチャーインデックス。
ビルドと使用方法については、リポジトリ README を参照してください。