อีกชุดเครื่องมือการสลายตัวของ GameCube/Wii
Decomp-Toolkit ทำหน้าที่ทั้งสองเป็นเครื่องมือบรรทัดคำสั่งสำหรับนักพัฒนาและเป็นการแทนที่ส่วนต่าง ๆ ของระบบการสร้างโครงการ decompilation
สำหรับใช้ในโครงการ decompilation ใหม่ดู DTK-Template ซึ่งให้โครงสร้างโครงการและระบบสร้างที่ใช้ decomp-toolkit ภายใต้ประทุน
เป้าหมายของโครงการ decompilation ที่ตรงกันคือการเขียนโค้ด C/C ++ ที่รวบรวมกลับไปเป็นไบนารี เดียว กับเกมดั้งเดิม สิ่งนี้มักจะต้องใช้คอมไพเลอร์เดียวกับเกมต้นฉบับ (สำหรับ GameCube และ Wii, Metrowerks CodeWarrior)
เมื่อรวบรวมรหัส C/C ++ คอมไพเลอร์ (ในกรณีของเรา mwcceppc ) สร้างไฟล์วัตถุ ( .o ) สำหรับทุกไฟล์แหล่งที่มา ไฟล์วัตถุนี้มีรหัสเครื่องที่รวบรวมรวมถึงข้อมูลที่ Linker ( mwldeppc ) ใช้เพื่อสร้างการเรียกใช้งานขั้นสุดท้าย
วิธีหนึ่งในการตรวจสอบว่ารหัสของเราคือการจับคู่คือการใช้รหัสใด ๆ ที่ถูกสลายตัวและเชื่อมโยงมันควบคู่ไปกับบางส่วนของไบนารีดั้งเดิมที่ยังไม่ได้สลายตัว ก่อนอื่นเราสร้างวัตถุที่ได้รับการย้ายถิ่นฐานจากไบนารีดั้งเดิม:

(ง่ายขึ้นอย่างมาก)
จากนั้นแต่ละวัตถุสามารถถูกแทนที่ด้วยเวอร์ชันที่ถอดรหัสเป็นรหัสการจับคู่ถูกเขียนขึ้น หาก Linker ยังคงสร้างไบนารีที่เป็นไบต์สำหรับไบต์เหมือนกับต้นฉบับเรารู้ว่ารหัสที่ถอดรหัสนั้นตรงกัน
Decomp-Toolkit จัดเตรียมเครื่องมือสำหรับการวิเคราะห์และแยกไบนารีดั้งเดิมออกเป็นวัตถุ relocatable รวมถึงการสร้างสคริปต์ linker และไฟล์อื่น ๆ ที่จำเป็นในการเชื่อมโยงรหัสที่ถอดรหัส
การวิเคราะห์ขอบเขตฟังก์ชั่น
ค้นพบขอบเขตฟังก์ชันที่มีความแม่นยำสูง ใช้ฮิวริสติกต่าง ๆ ในการโทรออกจากหางจากการควบคุมการทำงานด้านใน
การวิเคราะห์ลายเซ็น
ใช้ฐานข้อมูลลายเซ็นในตัวเพื่อระบุฟังก์ชั่น Metrowerks ทั่วไปและฟังก์ชั่นและวัตถุ SDK
นอกจากนี้ยังช่วย decomp-toolkit สร้างการแยกที่จำเป็นโดยอัตโนมัติเช่น __init_cpp_exceptions
การวิเคราะห์การย้ายถิ่นฐาน
ทำการวิเคราะห์การควบคุมการไหลและสร้างการย้ายที่มีความแม่นยำสูง
ด้วยการปรับแต่งด้วยตนเอง (ส่วนใหญ่เป็นข้อมูล) สิ่งนี้ควรสร้างวัตถุที่เปลี่ยนได้อย่างสมบูรณ์
การวิเคราะห์ส่วน
ระบุส่วน DOL และ REL โดยอัตโนมัติตามข้อมูลจากการวิเคราะห์ลายเซ็นและการย้ายถิ่นฐาน
การวิเคราะห์วัตถุ
พยายามระบุประเภทและขนาดของวัตถุข้อมูลโดยการวิเคราะห์การใช้งาน
ยังพยายามระบุตัวอักษรสตริงตัวอักษรสตริงกว้างและตารางสตริง
การแยก
สร้างไฟล์วัตถุแยกในหน่วยความจำตามการกำหนดค่าผู้ใช้
เพื่อสนับสนุนการเชื่อมโยงกับ mwldeppc.exe , unsplit .ctors , .dtors , extab และ extabindex รายการจะถูกวิเคราะห์และแยกโดยอัตโนมัติพร้อมกับฟังก์ชั่นที่เกี่ยวข้อง สิ่งนี้ทำให้มั่นใจได้ว่า Linker จะสร้างส่วนเหล่านี้อย่างถูกต้องโดยไม่ต้องกำหนดค่าเพิ่มเติม
การจัดเรียงทอพอโลยีจะดำเนินการเพื่อกำหนดลำดับการเชื่อมโยงสุดท้ายของวัตถุแยก
การเขียนไฟล์วัตถุ
เขียนไฟล์วัตถุโดยตรงโดยไม่จำเป็นต้องมีแอสเซมเบลอร์ (ลาก่อน devkitppc!)
หากต้องการให้เลือกไฟล์ที่เข้ากันได้กับแอสเซมเบลอร์ GNU พร้อมกับไฟล์วัตถุ
การสร้างสคริปต์ Linker
สร้าง ldscript.lcf สำหรับ mwldeppc.exe
สร้างไลบรารีคงที่ (.a) จากวัตถุอินพุต
$ dtk ar create out.a input_1.o input_2.o
# or
$ echo input_1.o >> rspfile
$ echo input_2.o >> rspfile
$ dtk ar create out.a @rspfileแยกเนื้อหาของไฟล์ไลบรารีสแตติก (.a)
ยอมรับไฟล์หลายไฟล์รูปแบบ GLOB (เช่น *.a ) และไฟล์ตอบกลับ (เช่น @rspfile )
ตัวเลือก:
-o , --out <output-dir> : ไดเรกทอรีเอาต์พุต ค่าเริ่มต้นไปยังไดเรกทอรีปัจจุบัน-v , --verbose : เอาต์พุต verbose-q , --quiet : ระงับเอาต์พุตทั้งหมดยกเว้นข้อผิดพลาด # Extracts to outdir
$ dtk ar extract lib.a -o outdir
# With multiple inputs, extracts to separate directories
# Extracts to outdir/lib1, outdir/lib2
$ dtk ar extract lib1.a lib2.a -o outdirDemangles Codewarrior C ++ สัญลักษณ์ wrapper บางสำหรับ cwdemangle
$ dtk demangle ' BuildLight__9CGuiLightCFv '
CGuiLight::BuildLight () const คำสั่ง disc นั้นมีการห่อหุ้มรอบ ๆ ไลบรารี NOD และเครื่องมือบรรทัดคำสั่ง nodtool
แสดงข้อมูลเกี่ยวกับภาพดิสก์
หากต้องการแสดงรายการเนื้อหาของภาพดิสก์ให้ใช้ VFS LS
รูปแบบภาพดิสก์ที่รองรับ:
$ dtk disc info /path/to/game.isoแยกเนื้อหาของภาพดิสก์ไปยังไดเรกทอรี
ดูข้อมูลแผ่นดิสก์สำหรับรูปแบบที่รองรับ
บันทึก
VFS CP มีความยืดหยุ่นมากขึ้นและรองรับภาพดิสก์
$ dtk disc extract /path/to/game.iso [outdir] โดยค่าเริ่มต้นจะมีการแยกพาร์ติชัน ข้อมูล หลักเท่านั้น
ใช้ตัวเลือก -p / --partition เพื่อเลือกพาร์ติชันอื่น
(ตัวเลือก: all , data , update , channel หรือดัชนีพาร์ติชัน)
แปลงภาพดิสก์ที่รองรับเป็น RAW ISO (GCM)
หากรูปแบบไม่มีการสูญเสียเอาต์พุตจะเหมือนกับภาพแผ่นดิสก์ดั้งเดิม
ดูข้อมูลแผ่นดิสก์สำหรับรูปแบบที่รองรับ
$ dtk disc convert /path/to/game.wia /path/to/game.isoแฮชเนื้อหาของภาพดิสก์และตรวจสอบกับฐานข้อมูล Redump ในตัว
ดูข้อมูลแผ่นดิสก์สำหรับรูปแบบที่รองรับ
$ dtk disc verify /path/to/game.isoวิเคราะห์ส่วนข้อมูลและข้อมูลสัญลักษณ์ DOL และข้อมูลสัญลักษณ์
ดู VFS LS สำหรับข้อมูลเกี่ยวกับ VFS Abstraction
$ dtk dol info input.dol
# or, directly from a disc image
$ dtk dol info ' disc.rvz:sys/main.dol 'สำคัญ
คำสั่งนี้มีวัตถุประสงค์เพื่อใช้เป็นส่วนหนึ่งของระบบสร้างโครงการ decompilation
สำหรับตัวอย่างโครงสร้างโครงการและสำหรับเอกสารเกี่ยวกับการกำหนดค่าดู DTK-Template
วิเคราะห์และแยกไฟล์ DOL ออกเป็นวัตถุที่ได้รับการ relocatable ตามการกำหนดค่าของผู้ใช้
$ dtk dol split config.yml target เครื่องมือ Diff Simple สำหรับปัญหาในเอลฟ์ที่เชื่อมโยง (ใช่ไม่ใช่ Dol. มันถูกชื่อผิด)
พยายามค้นหาความแตกต่างที่ชัดเจนที่สุดทำให้เกิดความไม่ตรงกัน
ส่งผ่านไฟล์การกำหนดค่าโครงการและพา ธ ไปยังไฟล์ ELF ที่เชื่อมโยงเพื่อเปรียบเทียบกับ
$ dtk dol diff config.yml build/main.elfใช้สัญลักษณ์ที่อัปเดตจาก ELF ที่เชื่อมโยงกับการกำหนดค่าโครงการ (อีกครั้งชื่อผิด.)
มีประโยชน์หลังจากจับคู่ไฟล์ มันจะดึงข้อมูลสัญลักษณ์ที่อัปเดตจากผลลัพธ์สุดท้าย
$ dtk dol apply config.yml build/main.elfสร้างไฟล์การกำหนดค่าโครงการเริ่มต้นจาก DOL (& rels)
ส่งผ่านไฟล์ DOL และไฟล์ REL ใด ๆ ที่เชื่อมโยงกับไฟล์
หรือสำหรับเกม Wii ผ่าน selfile.sel (ไม่ใช่ RSOs)
$ dtk dol config main.dol rels/ * .rel -o config.ymlทิ้งแคระ 1.1 ข้อมูลจากไฟล์ ELF ( ไม่ รองรับ Dwarf 2+)
$ dtk dwarf dump input.elfถอดชิ้นส่วน Codewarrior ELF ที่ไม่มีการปลดปล่อย พยายามที่จะแยกวัตถุโดยอัตโนมัติและสร้างการย้ายถิ่นฐานเมื่อเป็นไปได้
$ dtk elf disasm input.elf out แก้ไขปัญหาเกี่ยวกับวัตถุที่สร้างขึ้นจากแอสเซมเบลอร์ GNU เพื่อให้แน่ใจว่าเข้ากันได้กับ mwldeppc.exe
(asm) ลงในสัญลักษณ์ไฟล์ (สำหรับการคำนวณความคืบหน้าการจับคู่) # input and output can be the same
$ dtk elf fixup file.o file.oสร้างไฟล์ DOL จากไฟล์ ELF ที่ให้ไว้
$ dtk elf2dol input.elf output.dol
# or, to ignore certain sections
$ dtk elf2dol input.elf output.dol --ignore debug_section1 --ignore debug_section2ประมวลผลไฟล์แผนที่ codewarrior และให้ข้อมูลเกี่ยวกับสัญลักษณ์และ TUS
$ dtk map entries Game.MAP ' Unit.o '
# Outputs all symbols that are referenced by Unit.o
# This is useful for finding deduplicated weak functions,
# which only show on first use in the link map.
$ dtk map symbol Game.MAP ' Function__5ClassFv '
# Outputs reference information for Function__5ClassFv
# CodeWarrior link maps can get very deeply nested,
# so this is useful for emitting direct references
# in a readable format.พิมพ์ข้อมูลเกี่ยวกับไฟล์ REL
ดู VFS LS สำหรับข้อมูลเกี่ยวกับ VFS Abstraction
$ dtk rel info input.rel
# or, directly from a disc image
$ dtk rel info ' disc.rvz:files/RELS.arc:amem/d_a_tag_so.rel 'รวมไฟล์ DOL และ REL ที่เกี่ยวข้องเข้ากับไฟล์ ELF เดียวเหมาะสำหรับการวิเคราะห์ในซอฟต์แวร์วิศวกรรมย้อนกลับที่คุณชื่นชอบ
$ dtk rel info main.dol rels/ * .rel -o merged.elfคำเตือน
คำสั่งนี้ยังไม่สามารถใช้งานได้
พิมพ์ข้อมูลเกี่ยวกับไฟล์ RSO
$ dtk rso info input.rsoคำเตือน
คำสั่งนี้ยังไม่รองรับการสร้างไฟล์ SEL
สร้างไฟล์ RSO จากไฟล์ ELF ที่ได้รับการ relocatable
ตัวเลือก:
-o , --output <File> : ไฟล์ RSO เอาต์พุต-m , --module-name <Name> : ชื่อโมดูล (หรือเส้นทาง) ค่าเริ่มต้น: ชื่ออินพุต-e , --export <File> : ไฟล์ที่มีชื่อสัญลักษณ์ที่ส่งออก (แยกใหม่ไลน์) $ dtk rso make input.elf -o input.rsoคำนวณและตรวจสอบ sha-1 hashes
$ dtk shasum baserom.dol
949c5ed7368aef547e0b0db1c3678f466e2afbff baserom.dol
$ dtk shasum -c baserom.sha1
baserom.dol: OKบีบอัดไฟล์ที่บีบอัด NLZSS
$ dtk nlzss decompress input.bin.lz -o output.bin
# or, for batch processing
$ dtk nlzss decompress rels/ * .lz -o relsบันทึก
VFS LS มีความยืดหยุ่นมากขึ้นและรองรับ RARC Archives
ตอนนี้คำสั่งนี้เทียบเท่ากับ dtk vfs ls -r input.arc:
แสดงรายการเนื้อหาของ RARC (เก่ากว่า. arc) เก็บถาวร
$ dtk rarc list input.arcบันทึก
VFS CP มีความยืดหยุ่นมากขึ้นและรองรับ RARC Archives
ตอนนี้คำสั่งนี้เทียบเท่ากับ dtk vfs cp input.arc: output_dir
สกัดเนื้อหาของ RARC (เก่า) เก็บถาวร
$ dtk rarc extract input.arc -o output_dirบันทึก
VFS LS มีความยืดหยุ่นมากขึ้นและรองรับคลังเก็บ U8
ตอนนี้คำสั่งนี้เทียบเท่ากับ dtk vfs ls -r input.arc:
สกัดเนื้อหาของคลังเก็บ U8 (ใหม่. arc)
$ dtk u8 list input.arcบันทึก
VFS CP มีความยืดหยุ่นมากขึ้นและรองรับคลังเก็บ U8
ตอนนี้คำสั่งนี้เทียบเท่ากับ dtk vfs cp input.arc: output_dir
สกัดเนื้อหาของคลังเก็บ U8 (ใหม่. arc)
$ dtk u8 extract input.arc -o output_dirDecomp-Toolkit มีนามธรรมระบบเสมือนจริงที่ทรงพลัง (VFS) ที่ช่วยให้คุณทำงานกับคอนเทนเนอร์ที่หลากหลาย การดำเนินการทั้งหมดเกิดขึ้นในหน่วยความจำที่มีค่าใช้จ่ายน้อยที่สุดและไม่มีไฟล์ชั่วคราว
คอนเทนเนอร์ที่รองรับ:
รูปแบบการบีบอัดที่รองรับได้รับการจัดการอย่างโปร่งใส:
:nlzss ในเส้นทาง) vfs ls แสดงเนื้อหาของคอนเทนเนอร์หรือไดเรกทอรี
ตัวเลือก:
-r , --recursive : รายการเนื้อหาซ้ำ-s , --short : ชื่อไฟล์เท่านั้นตัวอย่าง:
# List the contents of the `amem` directory inside `RELS.arc` in a disc image
$ dtk vfs ls ' disc.rvz:files/RELS.arc:amem '
# List the contents of `RELS.arc` recursively
$ dtk vfs ls -r ' disc.rvz:files/RELS.arc: '
# All commands that accept a file path can also accept a VFS path
$ dtk rel info ' disc.rvz:files/RELS.arc:amem/d_a_tag_so.rel '
# Example disc image within a disc image
$ dtk dol info ' disc.rvz:files/zz_demo.tgc:sys/main.dol 'ดู VFS LS สำหรับข้อมูลเกี่ยวกับ VFS Abstraction
vfs cp คัดลอกไฟล์และไดเรกทอรีซ้ำไปยังระบบไฟล์โฮสต์
ตัวเลือก:
--no-decompress : อย่าคลายไฟล์เมื่อคัดลอก-q , --quiet : ระงับเอาต์พุตทั้งหมดยกเว้นข้อผิดพลาดตัวอย่าง:
# Extract a file from a nested path in a disc image to the current directory
$ dtk vfs cp ' disc.rvz:files/RELS.arc:amem/d_a_tag_so.rel ' .
# Directories are copied recursively, making it easy to extract entire archives
$ dtk vfs cp ' disc.rvz:files/RELS.arc: ' rels
# Or, to disable automatic decompression
$ dtk vfs cp --no-decompress ' disc.rvz:files/RELS.arc: ' relsบีบอัดไฟล์ที่ถูกบีบอัด Yay0
$ dtk yay0 decompress input.bin.yay0 -o output.bin
# or, for batch processing
$ dtk yay0 decompress rels/ * .yay0 -o relsบีบอัดไฟล์โดยใช้การบีบอัด Yay0
$ dtk yay0 compress input.bin -o output.bin.yay0
# or, for batch processing
$ dtk yay0 compress rels/ * -o relsบีบอัดไฟล์ที่บีบอัด YAZ0
$ dtk yaz0 decompress input.bin.yaz0 -o output.bin
# or, for batch processing
$ dtk yaz0 decompress rels/ * .yaz0 -o relsบีบอัดไฟล์โดยใช้การบีบอัด YAZ0
$ dtk yaz0 compress input.bin -o output.bin.yaz0
# or, for batch processing
$ dtk yaz0 compress rels/ * -o relsพิมพ์ข้อมูลเกี่ยวกับไฟล์ WAD
$ dtk wad info input.wadบันทึก
VFS CP มีความยืดหยุ่นมากขึ้นและรองรับไฟล์ WAD
ตอนนี้คำสั่งนี้เทียบเท่ากับ dtk vfs cp input.wad: output_dir
แยกเนื้อหาของไฟล์ WAD
$ dtk wad extract input.wad -o output_dirตรวจสอบเนื้อหาของไฟล์ WAD
$ dtk wad verify input.wad