这是一个用于使用低级代码注入字符串的工具
我们注入字符串的策略是使用 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 函数的字符提供给他。
@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将使游戏能够从游戏目录(或子目录)加载字体,而无需在主机中安装字体系统。