เทคนิคการ Crack กับ Assembly
ตัวอย่าง Code ในภาษา Assembly
015F:0120 CMP EAX , ECX
015F:0125 JNZ 012B
015F:0128 CALL 01B5
015F:012B MOV AH , 18
จากตัวอย่าง Code (Assembly) ข้างบน ซึ่งเป็นบางส่วนที่ผู้เขียนนำมายก ตัวอย่างเพื่ออธิบายให้เป็นภาพวิธี การ Crack เบื้องต้นจาก Code ข้างบนสามารถอธิบายได้ดังนี้
บรรทัดแรก - 015F:0120 CMP EAX , ECX
ทำการเปรียบเทียบข้อมูลในรีจิสเตอร์ EAX กับ ECX ว่ามีค่าเท่ากันหรือเหมือนกันหรือไม่ โดยที่รีจิสเตอร์ EAX เก็บข้อมูล Registration Code ที่ถูกต้องไว้ และ ECX เก็บข้อมูลตัวเลข Registration Code ที่เราป้อนเข้าไป
บรรทัดที่สอง - 015F:0125 JNZ 012B
เป็นคำสั่งที่ ให้มีการกระโดดไปทำงานในตำแหน่งที่ต้องการโดยมีเงื่อนไข คือ ถ้าจากการเปรียบเทียบในบรรทัดแรก (คำสั่ง CMP) มีค่าไม่เท่ากันหรือไม่เหมือนกัน จะสั่งให้ไปทำงานต่อ ณ ตำแหน่ง 012B แต่ถ้าค่าเปรียบเทียบเท่ากันหรือเหมือนกัน จะไม่มีการกระโดด (Jump) เกิดขึ้น
บรรทัดที่สาม - 015F:0128 CALL 01B5
เป็นคำสั่งเรียกการทำงานที่ตำแหน่ง 01ฺB5 ในที่นี้คือแสดงข้อความว่า"คุณผ่านการลงทะะเบียนเรียบร้อยแล้ว" และเริ่มใช้โปรแกรมได้อย่างสมบูรณ์
บรรทัดสุดท้าย - 015F:012B MOV AH , 18
Registration Code ไม่ถูกต้อง ออกจากการใช้งานจากลักษณะการทำงานของ Code ตัวอย่างดังที่กล่าวมาแล้วการที่จะ Crack โปรแกรมนี้เป็นเรื่องที่ไม่ยากเลย ถ้าคุณสามารถเปลี่ยน Code บางบรรทัดเพื่อเปลี่ยนทิศทางขบวนการทำงานของโปรแกรม คือ ทำการแก้ไขเปลี่ยนแปลงในบรรทัดที่ 2 ให้เป็นดังนี้
บรรทัดที่สอง - 015F:0125 JZ 012B
โดยการเปลี่ยน Code ดังกล่าว จะอธิบายได้ดังนี้ คือ เป็นคำสั่งที่ให้มีการกระโดดไปทำงานในตำแหน่งที่ต้องการ โดยมีเงื่อนไขว่า ถ้าจากการเปรียบเทียบในบรรทัดแรก (คำสั่ง CMP) มีค่าเท่ากันหรือเหมือนกัน จะสั่งให้กระโดด (Jump) ไปทำงานต่อ ณ ตำแหน่ง 012B (Registration Code ไม่ถูกต้องออกจากการใช้งาน)
แต่ถ้าค่าที่เปรียบเทียบไม่มเท่ากันหรือไม่เหทือนกัน จะไม่มีการกระโดด(Jump) เกิดขึ้น (ทำงานต่อที่บรรทัดที่ 3 คือแสดงข้อความว่าคุณผ่านการลงทะเบียนเรียบร้อย และเริ่มใช้โปรแกรมได้อย่างสมบูรณ์)
ซึ่งจากการเปลี่ยนแปลงสิ่งนี้ จะทำให้สามารถลงทะเบียน และใช้โปรแกรมได้ ถึงแม้ Registration Code ที่คุณป้อนจะผิดก็ตาม แต่ในทางกลับกัน ถ้าป้อนRegistration Code ถูกก็จะไม่สามารถใช้โปรแกรมได้ ซึ่งไม่น่าจะเกิดขึ้นเพราะไม่มีทางป้อน Registration Code ถูกแน่นอนถ้าไม่จ่ายเงินซื้อจริงกับผู้พัฒนาโปรแกรม จริงมั้ย !!
Code - เดิม Code - หลังจากการแก้ไขแล้ว
015F:0120
015F;0125
015F:0128
015F:012B CMP EAX,CX
JNZ 012B
CALL 01B5
MOV AH,18 015F:0120
015F;0125
015F:0128
015F:012B CMP EAX,CX
JZ 012B
CALL 01B5
MOV AH,18
คราว นี้ลองมาดูอีกตัวอย่างหนึ่ง
015F:04C5
015F:04C8
015F :04C9
015F:04CA
015F:04CD
015F:04CE
015F:04CF
MOV [AF56] , AH
PUSH BX
PUSH CX
CALL 0BC3
POP POP CX
POP BX
JMP 0D1C
สองสามบรรทัดแรก คือ การกำหนดค่าเริ่มต้นและค่าที่ใช้ก่อนเริ่มใช้คำสั่ง CALL ลงในหน่วยความจำ Stack
015F:04C5 MOV [AF56] , AX
015F:04C8 PUSH BX0
015F:04C9 PUSH CX
บรรทัดต่อมา คือ การเรียกการทำงานที่ 0BC3 ซึ่งเป็นชั้นตอนการตรวจสอบ Registration Code
015F:04CA CALL 0BC3
สองบรรทัดต่อมา คือ การคืนค่าออกจากหน่วยความจำ Stack
015F:04CD POP CX
015F:04CE POP BX
บรรทัด สุดท้าย คือ การกระโดดไปทำงานที่ 0D1C (เริ่มใช้งานโปรแกรมจริง ที่ผ่านการตรวจสอบ การลงทะเบียนที่ถูกต้องเรียบร้อยแล้วได้
015F:04CF JMP 0D1C
จากขั้นตอนการทำงานของโปรแกรมดังกล่าวจะเห็นว่าในบรรทัดที่ 015F:04CA CALL 0BC3 เป็นบรรทัดที่เรียกขั้นตอนการตรวจสอบ Registration Code ตำแหน่ง 0BC3 ซึ่งเมื่อทำการตรวจสอบแล้ว ถ้าไม่ถูกต้องจะต้องมีคำสั่งให้แสดงว่า Registration Code ที่เราป้อนไม่ถูกต้องและให้ลงทะเบียนใหม่ หรือออกจากการใช้งานโปรแกรม แต่ถ้าถูกต้องให้ขึ้นข้อความว่า การลงทะเบียนถูกต้อง และเจอคำสั่ง RET เพื่อกลับมาทำงานในตำแหน่ง 015F:04CD POP CX ต่อไป
จากหลักการทำงานเราสามารถเปลี่ยนแปลงแก้ไขโดยการไม่ให้มีการ CALL 0BC3 ซึ่งเป็นตำแหน่งที่ใช้ในการตรวจสอบ Registration Code โดยทำการแก้ไขดังนี้
Code - เดิม Code - หลังการแก้ไข
015F:04C5
015F:04C8
015F :04C9
015F:04CA
015F:04CD
015F:04CE
015F:04CF
MOV [AF56],AH
PUSH BX
PUSH CX
CALL 0BC3
POP POP CX
POP BX
JMP 0D1C
015F:04C5
015F:04C8
015F :04C9
015F:04CA
015F:04CB
015F:04CC
015F:04CD
015F:04CE
015F:04CF MOV [AF56],AH
PUSH BX
PUSH CX
NOP
NOP
NOP
POP POP CX
POP POP BX
JMP 0D1C
แก้ไข 015F:04CA CALL 0BC3 เป็น 015F:04CA NOP หมายถึง No Operated คือ ไม่มีการทำงานใดเกิดขึ้นแต่เนื่องด้วยคำสั่ง NOP มีขนาด 1 Byte จึงต้องเขียนคำสั่ง 3 ครั้ง (3Byte) เพื่อทดแทนคำสั่ง 015F:04CA CALL 0BC3 ซึ่งมีขนาด 3 Byte
015F:04CA CALL 0BC
015F:04CB ...........
015F:04CC ...........
015F:04CD POP CX
ไม่มีความคิดเห็น:
แสดงความคิดเห็น