นี่คือเครื่องมือที่สร้างขึ้นเพื่อแทรกสตริงโดยใช้โค้ดระดับต่ำ
กลยุทธ์ของเราในการแทรกสตริงคือสร้างส่วนใหม่โดยใช้เครื่องมือเช่น Stud_PE หรือ CFF Explorer เพื่อให้มีพื้นที่ในปฏิบัติการเพื่อผนวกโค้ดใหม่ วิธีการ commom จะแทนที่คำสั่งดั้งเดิมและข้ามไปที่โค้ดของคุณ โดยทั่วไปการข้ามจะมี 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 Pointer วิธีนี้คือสำหรับเกมที่มีการจัดสรรโมดูลหลักแบบไดนามิก คุณสามารถใช้ตัวอย่างดังต่อไปนี้ หากคุณได้ฉีดการส่งออกลงในไฟล์ปฏิบัติการของเกม คุณสามารถใช้ 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 หรือ wrapper อื่นๆ ที่รองรับ ดูที่นี่ว่ารองรับอะไรบ้าง จากนั้นใน SRL.ini ให้ตั้งค่า AutoInstall เป็นจริง
เกม SoftPal บางเกมจำเป็นต้องมีการตั้งค่าด้วยตนเองด้วยความช่วยเหลือจากตัวติดตั้งอัตโนมัติ คลิกด้านล่างเพื่อดูตัวอย่าง:
EntisGLS AutoInstall อนุญาตให้คุณแก้ไขการกำหนดค่า XML ของกลไกภายในเท่านั้น และด้วยเหตุนี้ คุณจะสามารถตั้งค่าแบบอักษรที่กำหนดเองและโหลดไฟล์ที่แตกออกมาได้
เพียงเพิ่ม <file path="$(CURRENT)Patch"/>
ในไฟล์ EntisGLSConfig.xml
ที่สร้างขึ้น จากนั้น SRL จะบังคับให้เกมใช้การตั้งค่าที่คุณกำหนดเองโดยอัตโนมัติ
หมายเหตุ: ลำดับความสำคัญอยู่ที่บรรทัดด้านบน ให้เพิ่มบรรทัดที่ด้านบนของบล็อก <file/>
หรือ <archive/>
อื่นๆ
คุณสมบัติทั่วไปที่ผู้คนต้องการจาก String Reloads คือคุณสมบัติตัวแก้ไขแบบอักษร คุณสมบัตินี้ใช้งานได้กับส่วนหลักของเกมที่ไม่มีแบบอักษรที่แสดงผลล่วงหน้าและติดตั้งง่าย
ขั้นแรก ให้ดาวน์โหลด SRL ที่นี่ จากนั้นแตกไฟล์ไปยังไดเร็กทอรีเกม จากนั้นเปลี่ยนชื่อ SRLWrapper.dll เป็น d3d9.dll dinput8.dll หรือ wrapper อื่น ๆ ที่รองรับ ดูที่นี่ รองรับอะไรบ้าง
ตอนนี้ คุณต้องเปิดใช้งาน CreateFont hook ใน SRL.ini เรามี CreateFont, CreateFontA, CreateFontW, CreateFontIndirectA และ CreateFontIndirectW 4 รูปแบบ
โดยปกติแล้วเกมจะใช้เพียง 1 ใน 4 ตัวเลือกนั้น วิธีที่ถูกต้องในการทราบว่าคุณต้องเปิดใช้งาน hook ใดคือค้นหาในไฟล์ปฏิบัติการหากเขามีสตริง "CreateFontA", "CreateFontW", "CreateFontIndirectA" หรือ "CreateFontIndirectW"... หรือถ้าคุณขี้เกียจหรือบ้าไปหน่อย คุณก็สามารถเปิดใช้งานทุกอย่างได้ แต่ไม่แนะนำ
เมื่อคุณเปิดใช้งานตะขอ CreateFont SRL จะสามารถแก้ไขบางสิ่งในแบบอักษรของเกมได้ เช่น ขนาดตัวอักษร (ใช้ไม่ได้กับทุกเอ็นจิ้น) และตัวแบบอักษรเอง
ในตอนท้ายของ SRL.ini คุณจะพบรายการการแมปแบบอักษรเริ่มต้น 'ตัวอย่าง' [Font.0]
คุณสามารถเพิ่มพารามิเตอร์การโหลดแบบอักษรเพิ่มเติมโดยเพิ่มบล็อกใหม่ด้วยตัวเลขที่เพิ่มขึ้นในชื่อบล็อก เช่น [Font.1]
, [Font.2]
, [Font.3]
...
ในพารามิเตอร์ From
คุณสามารถตั้งค่าชื่อแบบอักษร 'origin' ที่จะแก้ไข โดยที่ * หมายถึงแบบอักษรทั้งหมด
ใน FromWidth
หรือ FromHeight
คุณสามารถจับคู่แบบอักษรที่จะแก้ไขโดยการระบุขนาดดั้งเดิม (โดยค่าเริ่มต้นแสดงความคิดเห็น)
ใน FromCharset
คุณสามารถจับคู่แบบอักษรที่จะแก้ไขโดยการระบุชุดอักขระแบบอักษร (โดยค่าเริ่มต้นแสดงความคิดเห็น)
ในพารามิเตอร์ To
คุณสามารถตั้งชื่อแบบอักษร 'เป้าหมาย' ได้
ในพารามิเตอร์ Charset
คุณสามารถบังคับให้ใช้ชุดอักขระแบบอักษร โดยที่ 0 = auto, commented = ไม่แก้ไข, 932 = SJIS ดูค่าเพิ่มเติมได้ที่นี่
ในพารามิเตอร์ Width
Height
คุณสามารถแก้ไขขนาดแบบอักษร ตัวเลขอาจเป็นขนาดสัมบูรณ์หรือขนาดสัมพัทธ์ +5
หรือ -1
เป็นค่าสัมพัทธ์ที่คำนวณด้วยค่าขนาดฟอนต์ดั้งเดิม .
คำนำหน้าในค่าระบุว่าค่านั้นเป็นค่าสัมบูรณ์ จากนั้น .-1
จะกลายเป็น -1 โดยไม่คำนึงถึงขนาดตัวอักษรดั้งเดิม
พารามิเตอร์ Width
, Height
อาจเป็นไดนามิกมากกว่านี้ได้หากต้องการ คุณสามารถตั้งค่าเป็นนิพจน์ที่จะประเมินในระหว่างรันไทม์ได้ ตัวอย่างเช่น หากคุณตั้งค่า Width
เป็น if([Width] < 0, [Width] * -1, [Width])
นิพจน์นี้จะตรวจสอบว่าความกว้างเป็นลบหรือไม่ และกำหนดให้เป็นค่าบวก ไม่เช่นนั้นจะไม่ทำอะไรเลย
นิพจน์สามารถมีพารามิเตอร์ได้: [Width]
, [Height]
, [Charset]
, [Facename]
คุณสามารถตรวจสอบรายละเอียดการใช้นิพจน์ได้ที่นี่
นอกจากนี้ ในบล็อก [StringReloads]
คุณจะพบพารามิเตอร์ LoadLocalFonts
โดยที่พารามิเตอร์นี้ตั้งค่าเป็นจริง SRL จะทำให้เกมสามารถโหลดแบบอักษรจากไดเร็กทอรีเกม (หรือไดเร็กทอรีย่อย) โดยไม่จำเป็นต้องติดตั้งแบบอักษรในโฮสต์ ระบบ.