เครื่องมือ WIP เพื่อย้อนกลับกระบวนการสร้าง IL2CPP ของ Unity ย้อนกลับไปยัง DLL ที่ได้รับการจัดการดั้งเดิม
ข้อมูลด้านล่างเกือบทั้งหมดใช้กับแอปพลิเคชัน CLI ที่มีอยู่ใน GitHub รุ่น สำหรับเอกสารเกี่ยวกับการใช้โมดูล "core" - ซึ่ง CLI เป็นเพียง wrapper รอบ ๆ - ในโครงการของคุณเองดู readme_core.md
ใช้ libcpp2il สำหรับการแยกวิเคราะห์เริ่มต้นและการโหลดโครงสร้างข้อมูลเมตา libcpp2il สามารถหาได้จากสิ่งประดิษฐ์สร้างหากคุณต้องการทำอะไรบางอย่างด้วยตัวเองด้วยข้อมูลเมตา IL2CPP และได้รับการปล่อยตัวภายใต้ใบอนุญาต MIT ลิงค์ด้านบนจะนำคุณไปยังเอกสารสำหรับ libcpp2il
CPP2IL กำลังอยู่ระหว่างการเขียนครั้งใหญ่ สาขานี้แสดงถึงการทำงานที่กำลังดำเนินการและอาจมีการเปลี่ยนแปลง
CI Builds สำหรับนักพัฒนาสามารถรับได้จากฟีด NuGet ของฉัน
อินเทอร์เฟซบรรทัดคำสั่งนั้นง่ายขึ้นจากตัวเลือกบรรทัดคำสั่งจำนวนมากไปจนถึงแนวคิดของรูปแบบเอาต์พุตและเลเยอร์การประมวลผล อย่างไรก็ตามรูปแบบและเลเยอร์เหล่านี้ยังไม่ได้ใช้งานจำนวนมากดังนั้นฟังก์ชั่นจึง จำกัด เมื่อเทียบกับเวอร์ชันที่เปิดตัวก่อนหน้านี้
ตัวเลือกมากมายเช่น --analysis-level --skip-analysis ฯลฯ ได้ถูกลบออก โดยไม่สนใจความจริงที่ว่าการวิเคราะห์ยังไม่ได้ใช้งานตัวเลือกเหล่านี้จะไม่กลับมาอีก การวิเคราะห์จะถูกปิดโดยค่าเริ่มต้นและจะเปิดใช้งานผ่านการใช้เลเยอร์การประมวลผล
ตัวเลือกอย่างเท่าเทียมกันเช่น --supress-attributes ซึ่งก่อนหน้านี้ระงับแอตทริบิวต์ CPP2ILInjected ได้ถูกแทนที่ด้วยเลเยอร์กระบวนการ -อันนี้ถูกนำไปใช้จริงและเรียกว่า attributeinjector คุณสามารถเปิดใช้งานเลเยอร์นี้ได้โดยใช้ตัวเลือก --use-processor และคุณสามารถแสดงรายการตัวเลือกอื่น ๆ โดยใช้ --list-processors
การทิ้งข้อมูลเมตาและการทิ้งวิธีการจะเป็นรูปแบบผลลัพธ์ของตัวเองเช่นกันแทนที่จะเป็นทั้งค่าเริ่มต้นและควบคุมผ่านตัวเลือกเฉพาะ ขณะนี้หมายความว่าคุณจะต้องเรียกใช้ CPP2IL หลายครั้งหากคุณต้องการการทิ้งทั้งสองแม้ว่าสิ่งนี้อาจเปลี่ยนแปลงได้ในอนาคตหากเราเพิ่มการสนับสนุนสำหรับการส่งออกให้กับหลายรูปแบบพร้อมกัน เช่นเดียวกับเลเยอร์การประมวลผลรูปแบบเอาต์พุตสามารถแสดงรายการได้ผ่านตัวเลือก --list-output-formats และถูกเลือกผ่านตัวเลือก --output-as
ภายใต้ประทุนแอปพลิเคชันได้รับการเขียนใหม่เกือบทั้งหมด โดยพื้นฐานแล้วสิ่งนี้จำเป็นเนื่องจากปริญญา CPP2IL ขึ้นอยู่กับห้องสมุด Mono.Cecil ซึ่งมีข้อ จำกัด บางประการ เมื่อเราดูการสลับเราก็ตระหนักว่าเราพึ่งพาอยู่ในห้องสมุดได้อย่างไร นี่ไม่ใช่กรณีอีกต่อไป - แอปพลิเคชันถูกเขียนขึ้นรอบประเภท libcpp2il และวัตถุบริบทการวิเคราะห์ใหม่และไลบรารี mono.cecil ไม่ได้ใช้อีกต่อไปโดยถูกแทนที่ด้วย asmresolver.dotnet
ยิ่งไปกว่านั้นเรากำลังอยู่ในกระบวนการของการวิเคราะห์การวิเคราะห์ใหม่ตามการเป็นตัวแทนระดับกลางที่เรียกว่า ISIL (ภาษาที่ไม่ขึ้นกับคำสั่ง) ซึ่งจะช่วยให้การสนับสนุนชุดคำสั่งใหม่ได้ง่ายขึ้นมาก ISIL จะถูกแปลงเป็นกราฟการควบคุมการไหลซึ่งสามารถวิเคราะห์ได้อย่างชาญฉลาดกว่าการถอดชิ้นส่วนดิบ
นอกจากนี้เรายังทำงานกับระบบปลั๊กอินซึ่งจะช่วยให้นักพัฒนาบุคคลที่สามเขียนปลั๊กอินเพื่อเพิ่มการสนับสนุนสำหรับชุดคำสั่งที่กำหนดเองรูปแบบไบนารีและในที่สุดก็โหลดเมตาดาต้าหรือไฟล์ไบนารีที่งุนงงหรือเข้ารหัส
การใช้งานที่ง่ายที่สุดของแอปพลิเคชันนี้ใช้สำหรับเกม Windows X86 หรือ X64 Unity ในกรณีนั้นคุณสามารถเรียกใช้ Cpp2IL-Win.exe --game-path=C:PathToYourGame และ CPP2IL จะตรวจจับเวอร์ชัน Unity ของคุณค้นหาไฟล์ที่ต้องการและทิ้งเอาต์พุตลงในโฟลเดอร์ CPP2IL_OUT
สมมติว่าคุณมีไฟล์ APK เดียว (ไม่ใช่ APKM หรือ XAPK) และกำลังทำงานอย่างน้อย CPP2IL 2021.4.0 คุณสามารถใช้อาร์กิวเมนต์เดียวกับข้างต้น แต่ส่งผ่านเส้นทางไปยัง APK และ CPP2IL จะแยกไฟล์ที่ต้องการจาก APK
| ตัวเลือก | ตัวอย่างการโต้แย้ง | คำอธิบาย |
|---|---|---|
| -เส้นทางเกม | C: path to game | ระบุเส้นทางไปยังโฟลเดอร์เกม ที่จำเป็น. |
| -exe-name | เกมทดสอบ | ระบุชื่อของไฟล์ exe ของเกมในกรณีที่การตรวจจับอัตโนมัติล้มเหลว (เนื่องจากมีไฟล์ EXE อื่น ๆ ในไดเรกทอรีเกม) |
| -verbose | <ไม่มีใคร> | บันทึกข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่เรากำลังทำ |
| -ผู้ประมวลผลรายชื่อ | <ไม่มีใคร> | รายการเลเยอร์การประมวลผลที่มีอยู่จากนั้นออก |
| -ผู้ใช้โปรเซสเซอร์ | AttributeInjector | เลือกเลเยอร์การประมวลผลที่จะใช้ซึ่งสามารถเปลี่ยนข้อมูลดิบก่อนการส่งออก ตัวเลือกนี้สามารถปรากฏได้หลายครั้ง |
| -ผู้ประมวลผล | key = value | ระบุตัวเลือกการกำหนดค่าให้กับเลเยอร์การประมวลผลที่เลือก สิ่งเหล่านี้จะถูกบันทึกโดยปลั๊กอินซึ่งเพิ่มเลเยอร์การประมวลผล |
| -รูปแบบ-ออก-เอาต์พุต | <ไม่มีใคร> | รายการรูปแบบเอาต์พุตที่มีอยู่จากนั้นออก |
| -OUTPUT-AS | Dummydll | ระบุรูปแบบผลลัพธ์ที่คุณต้องการใช้ |
| -เอาท์พุทไปยัง | cpp2il_out | ไดเรกทอรีรากเพื่อส่งออกไป เส้นทางนี้จะถูกส่งผ่านไปยังรูปแบบผลลัพธ์ที่เลือกซึ่งอาจสร้างไดเรกทอรีย่อย ฯลฯ ภายในตำแหน่งนี้ |
| -ไฟล์ | C: path to webgl.framework.js | ใช้ร่วมกับไบนารี WASM เท่านั้น สิ่งเหล่านี้บางส่วนมีการส่งออกที่ทำให้งงงวย แต่สามารถกู้คืนได้ผ่านไฟล์ framework.js ซึ่งคุณสามารถให้เส้นทางในการใช้อาร์กิวเมนต์นี้ |
การกระทำทุกครั้งจะถูกสร้างขึ้นเพื่อสร้าง CI โดยใช้การกระทำของ GitHub - ไฟล์แอ็คชั่นสามารถพบได้ในโฟลเดอร์. github หากคุณต้องการทำซ้ำตัวเอง ระวังสิ่งเหล่านี้อาจไม่มั่นคงที่สุด - ในขณะที่มีการทดสอบเพื่อให้แน่ใจว่าเข้ากันได้กับเกมที่หลากหลาย แต่บางครั้งสิ่งต่าง ๆ ก็พังทลาย! สิ่งเหล่านี้ถูกสร้างขึ้นโดยการกระทำที่พวกเขาสร้างขึ้นจาก
ไฟล์รีลีสสามารถดาวน์โหลดได้จากแท็บการกระทำหากคุณลงนามใน GitHub หรือคุณสามารถใช้ลิงก์ต่อไปนี้ซึ่งชี้ไปที่การสร้าง CI ที่ประสบความสำเร็จล่าสุดเสมอ โปรดทราบว่า. NET Framework Build นั้นมีไว้สำหรับความเข้ากันได้กับไวน์/โปรตอน
ยิ่งไปกว่านั้นฉันปล่อยรีลีส "Milestone" ด้วยตนเองสร้างขึ้นเมื่อใดก็ตามที่ฉันคิดว่ามีการปรับปรุงชุดใหญ่ สิ่งเหล่านี้ไม่ได้ถูกทำเครื่องหมายว่าเป็น pre-releases บน gitHub และควร (อย่างน้อยในทางทฤษฎี) มีความเสถียรและเหมาะสำหรับใช้ในเกมที่หลากหลาย
จากเหตุการณ์สำคัญครั้งแรกสร้าง 2021.0 และเป็นต้นไปตอนนี้ CPP2IL จะส่งออกข้อมูลโครงสร้างที่เข้มงวดมากขึ้นไปยังคอนโซล ซึ่งรวมถึงระดับบันทึก (คำกริยา, ข้อมูล, เตือน, ล้มเหลว) และสีที่เกี่ยวข้อง (สีเทาสำหรับคำกริยา, สีน้ำเงินสำหรับข้อมูล, สีเหลืองสำหรับคำเตือน, สีแดงสำหรับล้มเหลว)
เมื่อถึงเหตุการณ์สำคัญ 2021.1 หาก CPP2IL สามารถตรวจพบว่าคุณกำลังใช้ไวน์/โปรตอนรหัสสี ANSI เหล่านี้ถูกปิดใช้งานเนื่องจากไม่ได้รับการสนับสนุนจากไวน์และดูน่ากลัว
ข้อความคำกริยาจะถูกบันทึกไว้เฉพาะเมื่อมีการเปิดตัว CPP2IL ด้วยตัวเลือก --verbose และมันจะเป็นประโยชน์หากคุณสามารถรายงานปัญหาเกี่ยวกับการเปิดใช้งานการตั้งค่าสถานะนี้ สำหรับการทำงานปกติพวกเขาไม่ควรจำเป็นเว้นแต่คุณจะอยากรู้อยากเห็น
หากคุณไม่ต้องการให้เอาต์พุตเป็นสีให้ตั้งค่าตัวแปรสภาพแวดล้อม NO_COLOR=true
แอปพลิเคชั่นนี้ถูกสร้างขึ้นเป็นหลักโดยใช้. NET 9.0 แต่. NET Framework 4.7.2 Build ได้รับการเผยแพร่เพื่อวัตถุประสงค์ดั้งเดิม
ใช้ห้องสมุดต่อไปนี้ซึ่งฉันรู้สึกขอบคุณมาก:
(ทั้งหมดได้รับใบอนุญาต MIT นอกเหนือจาก XUNIT ซึ่งเป็น Apache 2.0+MIT)
WasmDisassemblerการสร้าง Net472 ใช้ไลบรารีเพิ่มเติมต่อไปนี้:
ปลั๊กอินบางตัวยังใช้ไลบรารีเพิ่มเติม:
CPP2IL (ณ จุดนี้อย่างหลวม ๆ ) จาก IL2CPPDUMPER ซึ่งฉันได้แยกออกในปี 2561 และลบรหัสจำนวนมากเขียนใหม่มากและเพิ่มอีกมากมาย แต่ที่แกนกลางของมันก็ยังมีดัมเปอร์เหลืออยู่ส่วนใหญ่อยู่ใน libcpp2il
มันมีบิตและชิ้นส่วนจาก IL2CPPINSPECTOR ได้รับอนุญาตจาก DJKATY และฉันต้องการแสดงความขอบคุณเธอที่นี่เพื่อขอความช่วยเหลืออันล้ำค่าของเธอ
ฉันขอขอบคุณชุมชน Audica Modding และ Discord สำหรับแรงบันดาลใจเริ่มต้นสำหรับโครงการนี้การสนับสนุนมากมายในวันแรก ๆ และการร้องขอคุณสมบัติในวันนี้
และในที่สุดลองดูโครงการเจ๋ง ๆ อื่น ๆ ที่เชื่อมโยงกับโครงการนี้ แน่นอนฉันพูดถึง IL2CPPINTEROP เพิ่มเติม แต่ยังตรวจสอบ Melonloader ซึ่งใช้ CPP2IL สำหรับการสร้าง Dummy DLL