วันอังคารที่ 31 พฤษภาคม พ.ศ. 2554

เทคนิคการ Crack กับ Assembly

เทคนิคการ Crack กับ Assembly

เทคนิคการ 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

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

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