這是一個用於使用低階程式碼注入字串的工具
我們注入字串的策略是使用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.Process指標的位置。
如果你想使用 SRL 來放置非 ASCII 字符,你需要呼叫 Srl.Process 並將 GetGlyph 函數的字元提供給他。
@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/>
區塊的頂部。
人們希望從字串重新加載中獲得的一個常見功能是字體修改器功能,該功能適用於沒有預先渲染字體的遊戲的主要部分,並且易於設定。
首先,在此下載SRL,解壓縮到遊戲目錄,然後將SRLWrapper.dll重新命名為d3d9.dll; dinput8.dll 或任何其他支援的包裝器請參閱此處支援的內容。
現在,您需要在 SRL.ini 中啟用 CreateFont 掛鉤,我們有 4 個 CreateFont 變體:CreateFontA、CreateFontW、CreateFontIndirectA 和 CreateFontIndirectW。
通常遊戲只使用這 4 個選項之一,了解必須啟用哪個鉤子的正確方法是在遊戲可執行檔中找到字串「CreateFontA」、「CreateFontW」、「CreateFontIndirectA」或「CreateFontIndirectW」...或者,如果您很懶或有點瘋狂,您可以啟用所有功能,但不建議這樣做。
當您啟用 CreateFont 掛鉤時,SRL 將能夠修改遊戲字體中的一些內容,例如字體大小(不適用於所有引擎)和字體本身。
在 SRL.ini 的末尾,您可以找到預設的「樣本」字體重映射條目[Font.0]
,您可以添加更多字體重新加載參數,添加一個區塊名稱中帶有遞增數字的新區塊,例如[Font.1]
, [Font.2]
, [Font.3]
...
在From
參數中,您可以設定要修改的「origin」字體名稱,其中*表示所有字體。
在FromWidth
或FromHeight
中你可以透過指定他的原始大小來匹配要修改的字體。 (預設已評論)
在FromCharset
中可以透過指定字體字元集來匹配要修改的字體。 (預設已評論)
在To
參數中,您可以設定“目標”字體名稱。
在Charset
參數中,您可以強制使用字體字元集,其中 0 = 自動,註解 = 不修改,932 = SJIS,請在此處查看更多值
在Width
、 Height
參數中,可以修改字體大小,數字可以是絕對大小或相對大小, +5
或-1
是與原始字體大小值計算的相對值。這.
value 中的 prefix 指定 value 是絕對值,那麼.-1
將真正變成 -1,與原始字型大小無關。
如果需要, Width
、 Height
參數可以更動態,可以將值設定為在執行時間計算的表達式,例如,如果將Width
設為if([Width] < 0, [Width] * -1, [Width])
,該表達式將檢查 Width 是否為負數,並將其設為正數,否則不執行任何操作。
表達式可以有參數: [Width]
、 [Height]
、 [Charset]
、 [Facename]
,您可以在此處查看表達式用法的詳細信息
另外,在[StringReloads]
區塊中,您可以找到LoadLocalFonts
參數,將此參數設為true,SRL將使遊戲能夠從遊戲目錄(或子目錄)載入字體,而無需在主機中安裝字體系統。