これは、低レベルのコードを使用して文字列を挿入するために作成されたツールです
文字列を挿入する戦略は、Stud_PE や CFF Explorer などのツールを使用して新しいセクションを作成し、実行可能ファイルに新しいコードを追加するためのスペースを確保することです。一般的な方法は、元の命令を置き換えてコードにジャンプします。通常、ジャンプには 5 つの値があります。バイト長なので、場合によっては複数の命令を置き換える必要があります。もちろん、コードの実行後に CMP や TEST などの元の命令を配置することを忘れないでください (存在する場合)。
@StrInject: ;Declare StrInject Label
push EDX ;Backup EDX, ECX, EBX Registers
push ECX
push EBX
push EAX ;The EAX is the string pointer or a unicode character
call GetProc ;Here the Srl.Process Pointer is catched
call EAX
pop EBX ;Restore EDX, ECX, EBX Registers from the "Backup"
pop ECX
pop EDX
jmp RetPnt ;Continue the Execution
Srl.Process ポインターをキャッチするさまざまな方法があります。これは、動的メイン モジュールの割り当てがあるゲーム用です。ゲームの実行可能ファイルにエクスポートを挿入している場合は、以下のサンプルを使用できます。Stud_PE または CFF Explorer を使用して、これを行うには、新しいコードを追加するための新しい実行可能セクションを作成する必要もあります。
このサンプルの場合、インポート テーブル内の Srl.Process アドレスは常に新しい実行可能セクションを基準としています。
以下のコードでは、キャッチされた EIP は「pop EAX」にあり、インポート テーブルの Srl.Process はたとえば 0x02B9C400 で、「pop EAX」は 0x02B9E44C にあります。つまり... 0x02B9E44C - 0x02B9C400 = 0x204C となります。 EIP のこの値を引くと、の位置を取得できます。 Srl.プロセスポインタ。
SRL を使用して非 ASCII 文字を配置したい場合は、Srl.Process を呼び出し、GetGlyph 関数の char を渡す必要があります。
@GetProc:
call @Nxt ;Call the label Nxt
@Nxt: ;Declare the Nxt label
pop EAX ;Catch the EIP :)
sub EAX , 0x204C ;Subtract the Difference from the EIP and Import Address
mov EAX , [ EAX ] ;Read the import table
ret
ループ内で文字列をリロードするゲームでいくつかの問題が発生したため、GetDirectProcess を作成しました。この関数をインポートするには、上記の SRL.Process と同じメソッドを使用します。ただし、GetProc を変更します。ここにコード例を示します。
@GetProc:
call @Nxt ;Call the label Nxt
@Nxt: ;Declare the Nxt label
pop EAX ;Catch the EIP :)
cmp dword [ EAX + 0x21 ], 0 ;Verify if already have the Address
jne @Finish
push EAX ;Backup NXT Address
sub EAX , 0x2050 ;Subtract the Difference from the EIP and Import Address
mov EAX , [ EAX ] ;Read the import table
call EAX ;Calls the GetDirectProcess
pop EBX ;Recovery NXT Address
mov [ EBX + 0x21 ], EAX ;Save the Process Address
mov EAX , EBX ;Prepare to Finish
@Finish:
add EAX , 0x21 ;Ajust Pointer
mov EAX , [ EAX ] ;Read the Process Address
ret
@ Ptr :
dd 0 ;Here is the @Nxt: + 0x21
このメソッドにはパラメータがありません。EAX を呼び出してキャッチするだけです。EAX は Process 関数へのポインタです。
SRL には、ゲームにパッチを適用する方法を知らなくても、ゲーム エンジンに SRL を自動的にインストールする機能があります。
まず、SRL をここからダウンロードし、ゲーム ディレクトリに抽出して、SRLWrapper.dll の名前を d3d9.dll に変更します。 dinput8.dll またはその他のサポートされているラッパー ここでサポートされているものを参照し、SRL.ini で AutoInstall を true に設定します。
一部の SoftPal ゲームでは、自動インストーラーを使用した手動セットアップが必要です。例を確認するには、以下をクリックしてください。
EntisGLS AutoInstall では、内部エンジンの XML 構成のみを変更できます。これにより、カスタム フォントを設定したり、抽出されたファイルをロードしたりできるようになります。
生成されたEntisGLSConfig.xml
ファイルに<file path="$(CURRENT)Patch"/>
を追加するだけで、SRL によってゲームにカスタム設定の使用が自動的に強制されます。
注: 優先順位は上の行にあり、その行を他の<file/>
または<archive/>
ブロックの先頭に追加します。
String Reloads に人々が求めている共通の機能は、Font Modifier 機能です。この機能は、プリレンダリングされたフォントを持たないゲームの主要部分で動作し、セットアップが簡単です。
まず、SRL をここからダウンロードし、ゲーム ディレクトリに抽出して、SRLWrapper.dll の名前を d3d9.dll に変更します。 dinput8.dll またはその他のサポートされているラッパー サポートされている内容を参照してください。
次に、SRL.ini で CreateFont フックを有効にする必要があります。CreateFont には、CreateFontA、CreateFontW、CreateFontIndirectA、および CreateFontIndirectW の 4 つのバリアントがあります。
通常、ゲームはこれら 4 つのオプションの 1 つだけを使用します。どのフックを有効にする必要があるかを知る正しい方法は、文字列「CreateFontA」、「CreateFontW」、「CreateFontIndirectA」または「CreateFontIndirectW」がある場合にゲームの実行可能ファイル内で見つけることです...あるいは、怠け者や少し頭がおかしい場合は、すべてを有効にすることもできますが、お勧めしません。
CreateFont フックを有効にすると、SRL はフォント サイズ (すべてのエンジンで動作するわけではありません) やフォント自体など、ゲーム フォント内のいくつかの項目を変更できるようになります。
SRL.ini の最後には、デフォルトの「サンプル」フォント リマップ エントリ[Font.0]
が見つかります。 [Font.1]
ように、ブロック名に増分番号を付けた新しいブロックを追加するフォント リロード パラメータを追加できます。 [Font.1]
、 [Font.2]
、 [Font.3]
...
From
パラメータでは、変更する「元の」フォント フェイス名を設定できます。* はすべてのフォントを意味します。
FromWidth
またはFromHeight
で元のサイズを指定することで、変更するフォントに合わせることができます。 (デフォルトではコメント化されています)
FromCharset
でフォントの文字セットを指定することで、変更するフォントを一致させることができます。 (デフォルトではコメント化されています)
To
パラメータでは、「ターゲット」フォントフェイス名を設定できます。
Charset
パラメータでは、フォントの文字セットを強制的に使用できます。0 = 自動、コメント付き = 変更しない、932 = SJIS、その他の値はここで参照してください。
Width
] 、 Height
パラメータでは、フォント サイズを変更できます。数値は絶対サイズまたは相対サイズにすることができます。 +5
または-1
、元のフォント サイズ値を使用して計算された相対値です。 .
値の接頭辞で値が絶対値であることを指定すると.-1
元のフォント サイズに関係なく実際には -1 になります。
必要に応じて、 Width
パラメータとHeight
パラメータをさらに動的にすることができます。たとえば、 Width
if([Width] < 0, [Width] * -1, [Width])
に設定すると、ランタイム中に評価される式として値を設定できます。 if([Width] < 0, [Width] * -1, [Width])
場合、この式は、Width が負であるかどうかをチェックし、正にします。それ以外の場合は、何も行いません。
式にはパラメータ[Width]
、 [Height]
、 [Charset]
、 [Facename]
を含めることができます。式の使用方法の詳細はここで確認できます。
また、 [StringReloads]
ブロックにはLoadLocalFonts
パラメータがあります。このパラメータを true に設定すると、SRL により、ホストにフォントをインストールしなくてもゲーム ディレクトリ (またはサブディレクトリ) からフォントをロードできるようになります。システム。