Hacking&Security Workshop

ตอนนี้ MaYaSeVeN ได้ย้าย Blog ไปที่ http://blog.mayaseven.com


Friday, December 2, 2011

Crack Program/Games ก่อนโดน Crack [ Episode 1 ]


Crack Program/Games ก่อนโดน  Crack
บทความนี้จะพูดถึงสิ่งที่หลายๆคนใช้กันอยู่ทุกวันในการใช้โปรแกรมผิดกฏหมายนั้นก็คือ Crack/Keygen สิ่งเหล่าทำให้อุตสาหกรรม Software ตกต่ำ และถ้าเราเป็น Programmer ที่สร้าง Program/Games มาขายแต่กลับโดน Crack เอาไปใช้กันฟรีๆคงรู้สึกแย่ไม่น้อย เพราะฉะนั้นถ้าเราจะมาลอง Crack Program/Games ของเราและหาวิธีป้องกันก่อนที่จะปล่อยออกไปให้คนอื่น Crack ก็แลดูจะมีประโยชน์ไม่น้อย เพราะฉะนั้นมาเริ่ม Crack กันเลย

ครั้นเราจะเอา Program/Games Commercial จริงๆมา Crack ให้ดูเลยมันก็จะแลดู Underground เกินไป ><" หลังจากที่ผมได้กลับไปค้นไฟล์เก่าๆใน HDD ก็เจอไฟล์ๆหนึ่งที่น่าจะนำมาเป็นตัวอย่างได้ไฟล์นั้นคือ




reverseMe.exe เป็นไฟล์ที่เอาไว้สำหรับฝึก Crack  ผมเข้าใจว่าคนที่ชื่อ LENA151 เป็นคนสร้างโปรแกรมนี้มาให้เราฝึก Crack น่ะนะ ก็ให้เครดิตเขาไว้ตามนั้นละกัน :)

เริ่มต้นลองเปิดโปรแกรม reverseMe.exe


หลังจากดับเบิ้ลคลิกเปิดมันขึ้นมามันก็ด่าเราทันที ><" แนวๆว่า เห้ยโปรแกรมหมดเวลาทดลองใช้แล้วโว้ย จ่ายเงินซื้อ license มาซะดีๆ

หลังจากโดนมันด่ามาเรียบร้อยเราจะมาดูเบื้องหลังการทำงานกันว่ามันรู้ได้ยังไงว่าโปรแกรมหมดอายุ ผมก็ใช้โปรแกรมพวก Disassembly/Debugger เพื่อดูการทำงานของโปรแกรมในทีนี้ผมใช้ Immunity Debugger


หลังจากใช้ Debugger เปิด reverseMe.exe ขึ้นมาก็จะเห็นการทำงานโปรแกรมในรูปภาษาระดับต่ำ ต่ำจนอ่านแทบไม่รู้เรื่อง ระหว่างเขียนบทความนี้ผมก็คิดอยู่เหมือนกันว่าจะอธิบายยังไงให้เข้าใจง่ายๆ ><"
สิ่งที่เราต้องรู้คือ
    1.คอมพิวเตอร์มันจะทำงานทีละคำสั่ง(บรรทัด)จากบนลงล่าง
    2.คอลัมน์แรกที่เป็น 0040XXXX อันนี้เป็นตำแหน่งใน Virtual Memory
    3.คอลัมน์ต่อมาเป็น Opcodes ที่คอมพิวเตอร์อ่านและทำงาน
    4.คอลัมน์ถัดมาที่มีสีๆเขาเรียกมันว่า Mnemonics เนื่องจาก Opcodes อ่านยาก เลยมีเจ้า Mnemonics เอาไว้ให้มนุษย์อ่าน ถึงมันจะยังอ่านยากอยู่ แต่มันก็อ่านง่ายกว่า Opcodes เยอะ ><"
    5.คอลัมน์สุดท้ายนี้ช่วยให้ชีวิตง่ายขึ้นเพราะโปรแกรม Debugger จะวิเคราะห์และช่วย Comments ให้

ผมคงไม่ไหวที่จะพาอ่านทีละบรรทัดหรอกนะ ><" เราจะใช้ไหวพริบและ Sense ที่เรามีแทน ฮ่าๆ เริ่มสังเกตจากอันที่มันอ่านง่ายๆก่อนเลย เราจะเห็นบรรทัดนี้


0040106E   . 68 79204000    PUSH reverseM.00402079                   ; ||FileName = "Keyfile.dat"
00401073   . E8 0B020000    CALL <JMP.&KERNEL32.CreateFileA>         ; |\CreateFileA

Keyfile.dat !! มันต้องมีอะไรเกี่ยวข้องกับที่เราต้องการแน่ๆ และบรรทัดต่อมามันมีการ Call Function CreateFile หลังจากไปเปิด Win32 API ดู Function นี้เอาไว้เปิดไฟล์นั้นเองเอาละลองใช้วิธีบ้านๆสร้างไฟล์ Keyfile.dat เปล่าๆขึ้นมาแล้วลอง Run ดูผล


จะเห็นว่าผล Run มีการเปลี่ยนแปลง ครั้งนี้มันบอกว่า Keyfile ไม่ถูก แสดงว่ามันมีการตรวจสอบ Keyfile.dat และอะไรบางอย่างข้างใน Keyfile.dat 

ลองดู Code ต่อไป

0040109A   > 6A 00          PUSH 0                                                ; /pOverlapped = NULL
0040109C   . 68 73214000    PUSH reverseM.00402173                     ; |pBytesRead = reverseM.00402173
004010A1   . 6A 46          PUSH 46                                               ; |BytesToRead = 46 (70.)
004010A3   . 68 1A214000    PUSH reverseM.0040211A                   ; |Buffer = reverseM.0040211A
004010A8   . 50             PUSH EAX                                              ; |hFile
004010A9   . E8 2F020000    CALL <JMP.&KERNEL32.ReadFile>   ; \ReadFile

ส่วนนี้จะเป็นการอ่านค่าในไฟล์ Keyfile.dat โดยจะอ่านค่าเข้ามา 46h (70) Byte

ดู Code ต่อไป

004010AE   . 85C0           TEST EAX,EAX
004010B0   . 75 02          JNZ SHORT reverseM.004010B4
004010B2   . EB 43          JMP SHORT reverseM.004010F7
004010B4   > 33DB           XOR EBX,EBX
004010B6   . 33F6           XOR ESI,ESI
004010B8   . 833D 73214000 >CMP DWORD PTR DS:[402173],10
004010BF   . 7C 36          JL SHORT reverseM.004010F7
004010C1   > 8A83 1A214000  MOV AL,BYTE PTR DS:[EBX+40211A]
004010C7   . 3C 00          CMP AL,0
004010C9   . 74 08          JE SHORT reverseM.004010D3
004010CB   . 3C 47          CMP AL,47
004010CD   . 75 01          JNZ SHORT reverseM.004010D0
004010CF   . 46             INC ESI
004010D0   > 43             INC EBX
004010D1   .^EB EE          JMP SHORT reverseM.004010C1
004010D3   > 83FE 08        CMP ESI,8
004010D6   . 7C 1F          JL SHORT reverseM.004010F7
004010D8   . E9 28010000    JMP reverseM.00401205

ก็จะเห็น Algorithm ในการตรวจสอบ Key สำหรับพวกที่ต้องการทำ Keygen ก็จะวิเคราะห์ตรงนี้ ผมจะเปลี่ยนทางเป็น Bypass การตรวจสอบ Key นี้แทน (ออกแนวขี้เกียจ เหอะๆ) โดยจะเห็นว่าถ้าเกิดการตรวจสอบ Key ถูกต้องมันจะ Jump ไปที่ตำแหน่ง 00401205 เพราะฉะนั้นผมก็แก้ให้มัน Jump ข้ามการตรวจสอบ Key ไป โดยแก้ที่บรรทัด

004010B0     75 02          JNZ SHORT reverseM.004010B4

แก้เป็น

004010B0     E9 50010000    JMP reverseM.00401205

จะเห็นว่าบรรทัดต่อจากที่เราแก้จะโดนทับไปเพราะ JNZ SHORT ใช้ 2 Byte ส่วน JMP ใช้ 5 Byte  และจะมีพื้นที่ไม่ลงตัวเกิดขึ้น 1 Byte จึงใส่ NOP ไปหนึ่งตัวเพื่อให้มันลงตัวจากนั้นทำการ Save ที่เราแก้ไขตามรูป



จากนั้นลอง Run ผลที่เราแก้ไข 


เย้ ในที่สุดก็ Crack สำเร็จ

สำหรับวิธีป้องกันนั้นอาจจะออกแบบวิธีตรวจสอบ License ให้ซับซ้อนมากขึ้น ต้องตรวจสอบผ่าน Server บลาๆๆ หรือ ใช้ Packer ในการป้องกัน Dissembler เช่น UPX{ฟรี} แต่ทั้งนี้ทั้งนั้น Pack ก็โดน Unpack ได้ ถ้าอยากได้ Packer ดีๆก็คงต้องเสียเงินซื้อกันแล้วละ :) บางทีมันอาจจะช่วยยืดเวลาให้ Program/Games เราให้ถูก Crack ยากขึ้น ถ้ามีเวลาจะเขียนในบทความต่อไป :)

สรุป ในบทความนี้ก็คงไม่ได้ให้อะไรที่เป็น Real World มากแต่ทำให้หลายๆคนที่เป็นมือใหม่ได้เห็นภาพรวม ถ้ามีเวลาผมอาจจะทำ Series นี้ต่อ :)

เนื่องจากบทความนี้ต้องใช้ความรู้พื้นฐานหลายๆส่วนในการทำความเข้าใจ เช่น ภาษา Assembly สามารถศึกษาเพิ่มเติ่มได้ตาม Link ต่อไปนี้


Download : 

Written by MaYaSeVeN