ไปที่เนื้อหา


รูปภาพ

การถอดรหัสไฟล์ (เช่น. Map, Data)


  • กรุณาลงชื่อเข้าใช้เพื่อตอบกระทู้
มี 7 โพสต์ตอบกลับกระทู้นี้

#1 MasterOishi

MasterOishi

    Exclusive Member

  • Exclusive Programmer
  • 10020 โพสต์

โพสต์เมื่อ 02 April 2007 - 09:51:45 PM

ผมรู้แล้วหล่ะครับ ว่ามาจากการ Debug ตัวเกม แต่ Debug ได้ Code มาให้ทำอะไรต่อ??

ผมเคยไปถามท่าน vittee ที่ เว็อบบอร์ด YGO ของเค้าทีนึงมาแล้ว เค้าบอกวิธีการหา code มาให้ผม ซึ่งช่วยผมได้เยอะมากเลย

พี่ Vittee เค้าบอกมาว่าให้ Search หา Referenced String ที่มันเกี่ยวกับไฟลืให้มากที่สุดเช่น นามสกุล/ชื่อ ของไฟล์....


คำถามก็คือ... ได้ Code มาแล้วไม่รู้จะทำยังไงดี T_T ยังไงพี่ที่รู้ช่วยตอบด้วยละกันครับ

#2 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 03 April 2007 - 09:47:33 AM

อยากถามเหมือนกันว่า code ที่ว่าคืออะไร
มีความเกี่ยวข้องกับ data ที่คุณต้องการแกะยังไง

ส่วนการแกะ ก็เริ่มจากวิธีง่ายที่สุดไปก่อน ตามลำดับ
ก่อนอื่นต้องหาข้อมูลเกี่ยวข้องต่างๆ ให้มากๆ เข้าไว้ เพื่อใช้เป็นเชื้อเพลิงจุดไฟใส่สมอง

เริ่มกันที่การเปิดไฟล์ด้วย hex editor
ก่อนจะเปิดก็ดูชื่อไฟล์ ชือโฟลเดอร์ ก่อน จะช่วยให้เรารู้ว่ามันเป็นไฟล์อะไร
map.dat,item.dat,npc.dat แค่นี้ก็พอนึกออกไดบ้าง
เปิดแล้วก็ดูหัวไฟล์ ท้ายไฟล์ ต้นไฟล์ หาข้อความที่พอให้แนวทางเราได้บ้าง
บางทีมันก็เป็นไฟล์ข้อความธรรมดาๆ เขาเปลี่ยนนามสกุลเป็น dat
บางทีก็เป็นไฟล์รูปธรรมดาๆ เขาแค่เปลี่ยนนามสกุล
บางทีก็เป็นไฟล์รวมข้อมูล เช่นรวมหลายๆ รูปไว้ด้วยกัน
บางทีก็อะไรไม่รู้ เข้ารหัสไว้หมด เล่นเอางง ก็ลองแกะดู พยามพอสมควร แล้วแกะไม่ออกก็ไปขั้นต่อไป

ใช้พวก deassembler
เพื่ออ่านโค้ดมันโดยตรง
จะอ่านตรงไหน ก็อาศัยข้อความที่เราหามาได้เป็นแนวทาง
แล้วค้นดูว่าโค้ดส่วนไหนอ้างอิงถึงข้อความนั้น
อ่านไปอ่านมา โดดไปโดดมา ก็อาจจะเจอโค้ดส่วนที่ถอดรหัส data ที่เป็นเป้าหมายของเรา
แต่บางเกม เขาก็ป้องกัน โปรแกรมพวกนี้อีก เราก็ไปขั้นตอนต่อไป

ใช้พวก cheat engine
ก็คล้ายกับการใช้ tsearch สมัยก่อน
ถ้าเคยเล่น(โกง) maple หรือ trickster ก็น่าจะรู้จัก
อีกอย่างเขาพัฒนาด้วยเดลไฟ คนแถวนี้คงชอบ
มันยังสามารถหลบ nprotect ได้ด้วยนะ

ใช้พวก debugger
หาตัวชี้แนะบางอย่าง จากนั้นก็เซต breakpoint ตีความโค้ดให้ออก ก็จะได้คำตอบที่หา
แต่บางเกม(ส่วนใหญ่ละมั้ง) มันป้องกันการดีบักอีก
ถ้าเครื่องแรงก็ใช้ VMWare
ถ้ามีตังก็ใช้คอมฯ สองเครื่อง

แกะมาจนถึงขั้นนี้ก็น่าจะออกละครับ
ถ้าไม่ออก ก็เมล์ไปถามมันเลย tongue.gif

#3 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 03 April 2007 - 10:50:41 AM

มาดูตัวอย่างกันในระดับแรก hex editor
หลายวันก่อนผมเล่น rtk 10
ปรกติผมเล่นเกมรอบเดียว ไม่ค่อยชอบเล่นหลายรอบ
แต่เกมนี้มันมีโบนัส คือภาพต่างๆ หรือเหตุการณ์ต่างๆ ในเกม
ซึ่งกว่าคุณจะได้ดูครบต้องเล่นเกมหลายรอบ
ทำไมต้องเสียเวลาเช่นนั้น เอาเวลาไปทำอย่างอื่นดีกว่า แกะๆๆ

ก่อนอื่นผมก็เปิดโฟลเดอร์ที่ติดตี้งเกม อ่านชื่อไฟล์ ชื่อโฟลเดอร์
แล้วก็เจอโฟลเดอร์ชื่อ GRP ก็คิดในใจ มันน่าจะมาจาก GRaPhic มันต้องเก็บไฟล์ไว้นี่แน่ๆ
ดูชื่อไฟล์ แหมยิ่งทำให้มั่นใจ ผมก็เลือกเปิดมาไฟล์นึง แล้วก็เปิดอีกหลายๆ ไฟล์ เพื่อหาข้อมูลประกอบ
และผมก็ตัดมาให้ดูเป็นตัวอย่าง ประมาณนี้

4000 00005000 0000 0018 0000 0018 0000 8C91 0000 0103
0000 4000 0000 5000 0000 0018 0000 0018 0000 8CA9 0000
0103 0000 4000 0000 5000 0000 0018 0000 0018 0000 8CC1
0000 0103 0000 4000 0000 5000 0000 0018 0000 0018 0000
8CD9 0000 0103 0000 4000 0000 5000 0000 0018 0000 0018
0000 8CF1 0000 0103 0000 4000 0000 5000 0000 0018 0000
0018 0000 8C09 0100 0103 0000 4000 0000 5000 0000 0018
0000 0018 0000 8C21 0100 0103 0000


เปิดมาใหม่ๆ ก็งงๆ เราก็ปรับนู่นปรับนี่ ผมปรับคอลัมภ์จนได้ดังนี้

4000 0000 5000 0000 0018 0000 0018 0000 8C91 0000 0103 0000
4000 0000 5000 0000 0018 0000 0018 0000 8CA9 0000 0103 0000
4000 0000 5000 0000 0018 0000 0018 0000 8CC1 0000 0103 0000
4000 0000 5000 0000 0018 0000 0018 0000 8CD9 0000 0103 0000
4000 0000 5000 0000 0018 0000 0018 0000 8CF1 0000 0103 0000
4000 0000 5000 0000 0018 0000 0018 0000 8C09 0100 0103 0000
4000 0000 5000 0000 0018 0000 0018 0000 8C21 0100 0103 0000


เป็นไงๆ เริ่มได้ที
ชื่อไฟล์ของข้อมูลนี้มันบอกว่า เป็นไฟล์หน้าตัวละคร
ปรกติเกมเดียวกัน หน้าตัวละครก็น่าจะเท่ากัน ว่าป่ะ
ผมก็ลองเปลี่ยน ฐานสิบหก เป็นฐานสิบดู เผื่อได้แนว
0x40=64,0x50=80 ไป capture ภาพหน้าตัวละครในเกมก็ได้ขนาดประมาณนี้ ใช่เลยภาพขนาด 64*80
ปรกติเขามักจะใช้ตัวแปรขนาด 4 ไบต์ (int)
1 ไบต์ใช้เลขฐานสิบหก 2 ตัว งั้น 4 ไบต์ก็ 8 ตัว
เอาความรู้เรื่อง byte ordering เข้ามาจับ
cpu สายพันธุ์ intel เราต้องเรียงไบต์เสียใหม่ดังนี้
4000 0000 = 0x0000 0040 //ความกว้างของภาพ
5000 0000 = 0x0000 0050 //ความสูงของภาพ

ต่อไป 0x0000 1800 มันคืออะไรหว่า
0x1800=6,144

ผมก็ศึกษาคุณสมบัติของภาพในเกม แล้วลองเอาความกว้างความสูงคูณกันดู
64*80=5,120
แสดงว่า 1 จุดสี ต้องใช้ 1 ไบต์ แสดงว่า ภาพต้องเป็น 256 สี

โดยปรกติภาพ 256 สี ต้องใช้ตารางสี
1 สีมักใช้ 4 ไบต์ ฉะนั้น 4*256=1,024

5,120+1,024=6,144
โอ้วเย้ โป๊ะเซะๆ

แต่เดี๋ยวก่อน 1800 มันมี 2 ที่ ตัวไหนหว่าที่ถูก
ผมลองเปิดไฟล์อื่นเปรียบเทียบ ก็ทำให้แน่ใจว่า ตัวแรกนั่นเอง

แล้วต่อไปคืออะไร

ปรกติไฟล์เดียวที่เก็บหลายภาพ มันต้องมีข้อมูลบอกตำแหน่งว่า แต่ละภาพเริ่มที่ตำแหน่งไหนในไฟล์
แน่นอน ตัวเลขนี้ในแต่ละภาพต้องไม่เท่ากัน ตัวไหนนะที่ไม่เหมือนกัน ลองกลับไปดูที่ข้อมูล อ้อเจอตัวที่น่าสังสัยละ
8C91 0000=0x0000 918C
8CA9 0000=0x0000 A98C

ลองเอามันลบกัน 0xA98C-918C=0x1800
555 ได้อีกแล้วๆ
ลองทำกับฟิลด์อื่นๆ ก็ได้ทำนองเดียวกัน ก็พอสรุปได้ว่า 0x1800 ตัวหลัง มันบอกขนาดในไฟล์นั่นเอง

0x0103 0000 หล่ะคืออะไร
เปรียบเทียบดูหลายๆ ไฟล์ มันบอกถึงรูปแบบที่ภาพเก็บไว้ในไฟล์
บางไฟล์จะเก็บภาพแบบบึบขนาด บางไฟล์เก็บแบบ sprite (สำหรับทำ animate)
ยังไงก็ช่างเราได้ข้อมูลพอที่จะเปิดไฟล์ได้แล้ว
เนื่องจากไฟล์นี้ไม่ได้บีบขนาดหรือเข้ารหัส
ฉะนั้นก็เขียนโปรแกรมเปิดไฟล์ในรูปแบบ bmp โดยอาศัยข้อมูลที่แกะได้

นั่งเขียนโค้ดสักครึ่ง ชม. แล้วก็ถึงนาทีแห่งการตื่นเต้น ลองเปิดไฟล์ดู
แต่นแต๊น ได้ผล ภาพปรากฏออกมา

แต่มันกลับหัว

จากความรู้ที่เคยได้ยินมา(ที่จริงศึกษาอ่านมาอย่างหนักเหมือนกัน พูดทำเท่ 555)
เขามีการเก็บภาพสองวิธี คือ หัวไม่กลับ กับกลับหัว
สิ่งที่่บ่งบอกว่ากลับไม่กลับคือ ฟิลด์ความสูง
ถ้าความสูงเป็นลบ ก็คือกลับหัว
เนื่องจากภาพนี้กลับหัวอยู่แล้ว และความสูงเป็นบวก งั้นถ้าเราเปลี่ยนค่าความสูงเป็นลบ เราก็ได้ภาพ ถูกต้องตามต้องการ
เปลี่ยนความสูงจากบวกเป็นลบก็ง่ายๆ เอามันคูณกับ -1 ก็แค่นั้น หรือใครจะฟลิบบิต ก็ได้

แค่นี้เป็นอันจบ

หวังว่าคงเป็นแนวทางแก่ผู้ไม่รู้
ส่วนผู้รู้เห็นตรงไหนอ่อนด้อยโปรดช่วยชี้แนะ ขอบคุณ

#4 KoRnRoom99

KoRnRoom99

    Exclusive Member

  • Exclusive Programmer
  • 10104 โพสต์

โพสต์เมื่อ 03 April 2007 - 03:25:04 PM

ข้าน้อยขอคาราวะ ^^"
IPB Image
IPB Image
Works: KoRnBot Project,TSLoadDatFile
Thanks X CroSs, Truebot, TSBot, Solars, JackY, some1, Storm24, AssertionFailed from www.skjune.com
IPB ImageIPB ImageIPB ImageIPB ImageIPB ImageIPB Image

#5 X CroSs

X CroSs

    Truebot Co-Developer

  • Root Administrator
  • 102428 โพสต์
  • Gender:Male

โพสต์เมื่อ 04 April 2007 - 09:49:34 PM

มีสาระ ปักหมุดไว้ !!

ts.gif

manutd18wm.png


#6 MasterOishi

MasterOishi

    Exclusive Member

  • Exclusive Programmer
  • 10020 โพสต์

โพสต์เมื่อ 05 April 2007 - 12:44:01 AM

โห ผมไม่ได้แวะมาไม่กี่วัน คิดว่าจะไม่มีไครตอบ กลับมาหากระืู้ไปเจอ โดนจับปักหมุดซะอย่างงั้น - -*

แต่ก็ขอบคุณมากครับ ที่มาตอบ ความรู้ทั้งน้าน อย่าให้ล่มอีกนะ 555+ (ว่าแต่เมื่อไหร่จะกู้ข้อมูลกลับมาอ่ะครับ เอาแบบ เป็นกระทู้เลยได้มั้ยครับ กู้มาให้เปนกระทู้ใหม่เลย... เสียดาาย )

AssertionFailed....สุดยอด!! laugh.gif

#7 JackY

JackY

    หนี Microsoft ไม่พ้นซักทีเรา

  • Exclusive Programmer
  • 10072 โพสต์
  • Location:ซอกเล็กๆในหัวใจเธอ

โพสต์เมื่อ 02 May 2007 - 10:49:22 AM

กลับมาแว้วหลังจากที่ห่างหายไปนาน หุหุ

#8 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 18 May 2007 - 02:09:47 AM

อุตส่าห์ปักหมุด เพิ่มข้อมูลอีกหน่อยดีกว่า biggrin.gif biggrin.gif biggrin.gif

ตัดสินใจโหลด RTK 11 มาเล่น(คิดอยู่นาน เพราะไฟล์มันใหญ่
โหลดเสร็จมาหลายวัน แต่เพิ่งลองติดตั้งและเล่นวันนี้
ผิดหวัง ภาพสวย ระบบต่างๆ หลายอย่าง ดี ยอมรับ แต่เล่นไม่หนุกเท่าภาค 10
ขนาดโกง status ก็ยังขุนไม่ขึ้นแฮะ ไม่ชอบก็คือไม่ชอบ แต่ไม่แน่ นานไปอาจชอบก็ได้

เข้าเรื่องดีกว่า ก็เรื่องแกะหน่ะแหละ
เพิ่งแกะตะกี้เอง ยังไม่ได้ลองเขียนโปรทดสอบ
เป้าหมาย ..\San11\Media\face\San11Face00.fce
เก็บอะไรไว้ก็คงตามชื่อ (หวังเล็กๆ ว่ามันจะเก็บข้อมูลเหมือนภาค 10)
เปิดมา เจอแบบนี้

4641 4345 4000 0000 0000 0000 9808 0000
C819 0000 1A1E 3A02 2704 0C02 220C 0102
2612 0602 1E11 0702 2612 3A02 2B13 2E03
2918 0F02 2714 3A02 2612 0002 1C1B 3A02
2807 3A02 200A 3402 270C 3203 2414 0402
1D0C 3A02 1E18 3A02 261C 1002 2417 3A02
1F05 3A02 2410 3A02 3109 3A02 221D 2F02


อะไรเป็นอะไรก็ไม่รู้ เจอแต่ 3A02 เรียงกันเป็นพืด ก็เลยเลื่อนลงไปดูส่วนอื่นๆ เรื่อย จนไปเจอ

0000 0000 D4D3 B20B 0000 0000 D4D3 B20B
0000 0000 D4D3 B20B 0000 0000 D4D3 B20B
0000 0000 5746 5458 3030 3130 18A3 0200 //มาถึงบรรทัดนี้ เริ่มเห็นตัวเลขที่แตกต่าง
0100 0000 F000 F000 1800 0000 3236 3132
3631 3236 3133 3732 3135 3032 3531 3336


offset ของ 5746 5458 คือ 0xF0B4 ผมก็เลยค้นหาตัวเลขนี้ในไฟล์
เพราะปรกติไฟล์ที่เก็บหลายภาพรวมกัน มักจะเก็บตำแหน่ง offset ของแต่ละภาพไว้ เพื่อเข้าถึงได้รวดเร็ว
ตำแหน่งที่เจอคือ

0000 3A00 0000 3A00 0000 3A00 0000 3A00
0000 3A00 B4F0 0000 18A3 0200 CC93 0300 //เจอแล้ว F0B4 ที่ offset 0x2274
18A3 0200 E436 0600 18A3 0200 FCD9 0800


เห็นตัวเลขคุ้นตา 18A3 0200 ย้อนกลับไปดูข้างบนอีกนิด
จ้องดูตัวเลขสักพัก ผมก็ตีโจทย์ออกละ
พอจะแยกโครงสร้างของไฟล์ คร่าวๆ ได้ว่า

//โครงสร้างของไฟล์คือ
FileHeader
XEntry[n]
PicEntry[n]
PicInfo[n]

//ในส่วนของ PicInfo แยกเป็นสองส่วน คือ
PicHeader
PicData


รายละเอียดของแต่ละส่วน

//ส่วนของ FileHeader มีขนาด 0x14
4641 4345 //น่าจะเป็น file signature อ่านว่า FACE
4000 0000 //ไม่รู้สิ
0000 0000 //ไม่รู้สิ
9808 0000 //จำนวน XEntry
C819 0000 //จำนวน PicEntry


//ส่วนของ XEntry มีขนาด 4 ไบต์ (X ก็หมายถึงยังไม่รู้ หุหุ)
1A1E 3A02 //XEntry 1st
2704 0C02 //XEntry 2nd
220C 0102 //XEntry 3rd ไปเรื่อยๆ จนถึง 0x898

//ส่วนของ PicEntry มีขนาด 8 ไบต์
B4F0 0000 //offset ของ PicInfo
18A3 0200 //ขนาดของ PicInfo


//ส่วนของ PicHeader มีขนาด 0x18
5746 5458 3030 3130 //signature อ่านว่า WFTX0010
18A3 0200 //ขนาดของ PicInfo(ได้จาก PicHeader+PicData)
0100 0000 //น่าจะเป็น plane
F000 //ความกว้าง
F000 //ความสูง
1800 0000 //จำนวนบิต


//ส่วนของ PicData ก็มีขนาดตาม กว้าง*ยาว*บิต/8 (8 บิต 1 ไบต์)
//เช่นจากตัวอย่าง F0*F0*18/8=0x2A300
323631 //จุดสี แรก
323631 //จุดสี ที่สอง
323631//และต่อไปเรื่อยๆ
333732


แถมอีกนิด เผื่อคิดไม่ทัน
ตำแหน่ง PicInfo ของภาพแรก อยู่ตรงไหน

sizeof(FileHeader) + (sizeof(XEntry)*0x898) + (sizeof(PicEntry)*0x19C8) = 0xF0B4


เพียงเท่า่นี้เราก็ได้้ข้อมูลพอที่จะเขียนโปรทดสอบ
เหมือนเคย จะเดาถูกหรือผิด ก็หลังจากเขียนโปรทดสอบ
ถ้ามันออกมาโอเค ก็เ่ดาถูกแหละครับ
ตอนนี้ผมก็ยืนยันไม่ได้ อย่างที่บอก เพิ่งแกะมาสดๆ ร้อนๆ laugh.gif laugh.gif laugh.gif





1 สมาชิกกำลังอ่านกระทู้นี้

0 สมาชิก, 1 ผู้เยี่ยมชม, 0 ผู้ใช้งานที่ซ่อนตัว