20 พ.ค. 2556

แนวทางการ Unpack ข้อมูลเกมที่ Encrypt มา


จะยกตัวอย่างเกมจีนเกมนึง ที่ได้ทำเมื่อวานซืน ที่ Data จะรวมกันอยู่ใน .Pak และ บางไฟล์ จะถูก Encrypt

เริ่ม!

(1)


ตัวเกมถูก Pack มาด้วย Themida/Winlicense น่าส่งสัยว่า Function Decrypt จะถูกครอบ VM เอาไว้ แต่ไม่เป็นไรไม่ได้ใช้ Function นั้นอยู่แล้ว แค่จะขโมย Data หลังจากการ Decrypt แล้ว แต่ Themida/Winlicense ทำให้ Debug ลำบากขึ้นด้วย
พยายามหาชื่อไฟล์ที่เกมจะโหลดที่เรารู้จักหรือเดาเอา เช่น

(2)

หน้าตา Call Function โหลด File

(3)


ถ้าตอนเปิดเกม มันโหลดผ่านไปแล้ว ให้ restart ใหม่ แล้ว ไฟ break ที่ Function ที่ ได้มา (เพราะ Themida มันยังไม่ Unpack Binary ของ exe มาลงมันเลยหน้าตาแบบนี้)

(4)


ให้ break -> Hardware on execute เพื่อที่ว่าตอนเกมรันมาถึงจุดนี้มันจะ break
ตอนนี้ break ที่ Function ที่ต้องการแล้ว

(5)

ก็ Trace ไปเรื่อยๆ จนเจอ Function ที่ Decrypt 
*การ Trace แบบนี้ให้ จำ Offset ของ Function ไว้เรื่อยๆ เพื่อที่ เมื่อ กรณี Trace ไปผิด Function จะได้กลับมา Function ก่อนหน้านี้ แล้ใช้ วิธี Break on hardware execute ไปเรื่อยๆ

(6)

(7)

(8)


ไล่ Trace ไปเรื่อย ก็เจอ Function ที่ถูก Themida VM เอาไว้

(9)

เพราะฉะนั้นเราน่าจะสามารถหา Pointer ของ Data ได้ ที่ Function ที่ Call Function นี้ แทน
Find Reference

(10)


Break หลังจาก Call Function ใน VM
จะเห็นว่ามันใช้ thiscall แล้ว push eax ไป 1ตัวก็เดาว่า มันน่าจะเป็น pointer ของ structure ของไฟล์ ใน Pak
เริ่มจาก ดู  this (pointer) ก่อน

(11)

(12)

Follow dump ที่ ebp-4  

(13)

เป็น pointer ของอะไรซักอย่าง  ดูต่อไป

(14)


เหมือนจะเจอ struct ของไฟล์

(15)


คราวนี้ต้องวิเคราะห์นะครับ ว่าอะไรเป็นอะไร
ผมได้เป็น
(16)

ก็เริ่มเขียน Dll ได้ ส่วนใครถนัด Code Cave ก็แล้วแต่นะครับผมถนัด Dll เพราะ สะดวกชีวิตกว่า

(17)


Compile ได้ Dll ก็ Inject เข้า Process   แล้ว Function ที่เพิ่งเขียนก็มาอยู่ใน Process แล้ว
(18)

Address อะไรก็จำไว้  แล้ว ค่อแก้ให้ jump มา
หาที่ว่างๆ หลังจาก Decrypt แล้ว แทรก Code เพื่อ Call Dll

(19)

จากรูป 17 อย่าลืม ใส่ Address jump กลับ มาที่เกม

เรียบร้อย


(20)

(21)



บทความต่อไป จะเป็นแนวทางการ ขโมยไฟล์ที่ ถูก Encrypt เป็น Block แล้วใช้งานเลย ไม่ถูกเก็บไว้ใน mem (ซึ่งจะทำให้เราหา Pointer ของทั้งไฟล์ไม่เจอ หลังจากการ Decrypt )