هذه أداة تم إنشاؤها لحقن السلاسل باستخدام كود منخفض المستوى
تتمثل استراتيجيتنا في إدخال السلسلة في إنشاء قسم جديد باستخدام أدوات مثل 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 مؤشرًا لوظيفة العملية
يتمتع SRL بميزة تثبيت SRL تلقائيًا في محرك اللعبة دون الحاجة إلى معرفة كيفية تصحيح اللعبة.
أولاً، قم بتنزيل SRL هنا، واستخرجه إلى دليل اللعبة، ثم أعد تسمية SRLWrapper.dll إلى d3d9.dll؛ dinput8.dll أو أي برنامج تضمين آخر مدعوم، راجع هنا ما هو مدعوم، ثم في SRL.ini قم بتعيين التثبيت التلقائي على true.
تحتاج بعض ألعاب SoftPal إلى إعداد يدوي بمساعدة برنامج التثبيت التلقائي، انقر أدناه لرؤية المثال:
يسمح لك التثبيت التلقائي EntisGLS فقط بتعديل تكوين XML للمحرك الداخلي، وبهذا ستتمكن من تعيين خطوط مخصصة وتحميل الملفات المستخرجة.
ما عليك سوى إضافة <file path="$(CURRENT)Patch"/>
في ملف EntisGLSConfig.xml
الذي تم إنشاؤه وسيقوم SRL تلقائيًا بإجبار اللعبة على استخدام إعداداتك المخصصة.
ملاحظة: الأولوية في الأسطر العليا، أضف السطر أعلى الكتل الأخرى <file/>
أو <archive/>
.
الميزة الشائعة التي يريدها الأشخاص من String Reloads هي ميزة Font Modifier، تعمل هذه الميزة مع جزء كبير من الألعاب التي لا تحتوي على خط معروض مسبقًا ويسهل إعداده.
أولاً، قم بتنزيل SRL هنا، واستخرجه إلى دليل اللعبة، ثم أعد تسمية SRLWrapper.dll إلى d3d9.dll؛ dinput8.dll أو أي برنامج تضمين آخر مدعوم، انظر هنا ما هو مدعوم.
الآن، أنت بحاجة إلى تمكين ربط CreateFont في SRL.ini، لدينا 4 أنواع مختلفة من CreateFont، وCreateFontA، وCreateFontW، وCreateFontIndirectA، وCreateFontIndirectW.
عادةً ما تستخدم اللعبة خيارًا واحدًا فقط من هذه الخيارات الأربعة، والطريقة الصحيحة لمعرفة الخطاف الذي يجب عليك تمكينه هي العثور عليه في اللعبة القابلة للتنفيذ إذا كان لديه السلسلة "CreateFontA" أو "CreateFontW" أو "CreateFontIndirectA" أو "CreateFontIndirectW"... أو، إذا كنت كسولًا أو مجنونًا بعض الشيء، فيمكنك فقط تمكين كل شيء، ولكن لا ينصح بذلك.
عندما تقوم بتمكين ربط CreateFont، سيتمكن SRL من تعديل بعض الأشياء القليلة في خط اللعبة، مثل حجم الخط (لا يعمل مع جميع المحركات) والخط نفسه.
في نهاية SRL.ini، يمكنك العثور على إدخال افتراضي لإعادة تعيين الخط "عينة"، وهو [Font.0]
، ويمكنك إضافة المزيد من معلمات إعادة تحميل الخط بإضافة كتلة جديدة برقم متزايد في اسم الكتلة، مثل [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])
، سيتحقق هذا التعبير مما إذا كان Width سالبًا، ويجعله موجبًا، وإلا فلن يفعل شيئًا.
يمكن أن تحتوي التعبيرات على المعلمات: [Width]
، [Height]
، [Charset]
، [Facename]
، ويمكنك التحقق من تفاصيل استخدام التعبير هنا
أيضًا، في كتلة [StringReloads]
، يمكنك العثور على معلمة LoadLocalFonts
، مع تعيين هذه المعلمة على true، سيجعل SRL اللعبة قادرة على تحميل الخطوط من دليل اللعبة (أو الدليل الفرعي) دون الحاجة إلى تثبيت الخط في المضيف نظام.