15 ม.ค. 2556

บังคับให้ Latale ไม่อ่าน Pack File

เป็นเกมออนไลน์ จากเว็บ http://latale.ogplanet.com/
ไม่อยากให้มันอ่าน Pack ไฟล์แต่อยากให้มันอ่าน File Resource ตรงๆ เพราะอยากแก้พวก รูป นู่นนี่นั่นเอง
เพราะแก้ Resource เกมตอนที่มันอยู่ใน รูปของ Pack ไฟล์ไม่ได้

ปกติแล้วจะ  Debug แบบง่ายสุดๆ ก็หา ข้อความที่ Reference เอาใน All reference text string.
แล้วค่อยไล่ Assembly ไปเรื่อยๆ แต่คราวนี้ Latale Client มันไม่มี reference text string ของชื่อไฟล์พวก AJJIYA.SPF,BANX.SPF,BARY.SPF,..

แต่ไม่เป็นไร มีวิธีอื่น คือ หา ที่มัน Call Api พวก CreateFile เอา


Break ให้หมด แล้ว Run 


น่าจะใช่ที่ต้องการ แล้วก็ไปดูที่ Call Stack


0x008B9AC0 น่าสนใจ เพราะ มัน ทำต่อจาก void main() เลย ก็ลองไป Debug มันดู ว่ามัน Call อะไรยังงัย ปรากฏว่าใน Loop มันมีสั่งโหลด File SPF แน่ๆ 


แต่จะเห็นว่า ใน Folder ไม่มี File TESTPACK.SPF เลยลองกด F9 ไปอีกที ปรากฏว่ามันไม่ได้ไป Break ทีหัว Function 0x008B9AC0 แสดงว่า Loop ที่ Address 008B9B27 เป็นตัวโหลด ทุก ไฟล์ SPF ใน Function เดียว ก็กด F9 ไปเรื่อยๆ จนเริ่มเกม สังเกตว่า ไม่มี การ Createfile หรือ CreateFileMapping  พวก Resource ไฟล์ต่างๆ ใน Pack เลย แล้วมันทำยังงัย?

พอโหลดครบทุกไฟล์มันก็ Set Flag ที่  0x01AE8594 เป็น 1 ถ้า 0xADE8E0 เป็น 1


เริ่ม จินตนาการได้แล้ว ว่า 0xADE8E0 (eax+7C)  น่าจะเป็น Flag ที่อธิบายว่าให้โหลด Pack ไฟล์ หรือโหลด Resource ไฟล์ตรงๆ 
*ถ้าเป็น 0 โหลด ไฟล์ตรงๆ 
*ถ้าเป็น 1 โหลด Pack ไฟล์
และถ้า โหลด Pack ไฟล์ครบแล้วให้ Set  Flag ที่ mov byte ptr ds:[eax+7C],1
แต่ยังไม่ชัวส์ เรามา Break ที่ On Access Address 0xADE8E0  ดีกว่า ดูว่ามันจะ Break ตอนไหน 

Break ตอนโหลด Resource File จริงๆด้วย


จินตนาการเริ่มมีแววจริง 
กลับไปสนใจที่ Address ที่บังคับ Jump ข้ามไปจบ Function การโหลด SPF เลย 











มันเอาอะไร มาจาก Pointer 0xADE8E0 ?   แถม Return true ถ้า 0xADE8E0 =  0 อีกตะหาก

ดู Ref. มันแล้ว Break ให้หมด



ที่แรก! หลังจาก Run ใหม่ Set Flag เฉยๆ มันเป็น 1 อยู่แสดงว่า มันเข้า Loop โหลด SPF ทุกไฟล์ แน่ๆ 
แก้มันเป็น 0 ซะเลยลองไม่ให้มันโหลด SPF แล้วดูว่าจะเกิดอะไรขึ้น


ลองเปรียบเทียบ Function โหลด Resource หลังจากแก้ ตามรูปข้างบนไปแล้ว
แบบบังคับโหลด SPF
1. โหลด Resource ด้วย Function นึง   0xADE8E0 = 1


 2. โหลด Resource ด้วย Function นึง   0xADE8E0 = 0



สรุปมันโหลดเหมือนกัน แต่ คนละแบบ แบบนึงโหลดจาก File ตรงๆ อีกแบบนึง โหลดจาก Memory 

เพราะฉะนั้นแก้แค่ Flag 0xADE8E0 เป็น 0  มันก็ไม่โหลด Pack ไฟล์แล้ว

ไม่มีความคิดเห็น:

แสดงความคิดเห็น