Saturday, November 28, 2009

มาซ่อนข้อความลับในไฟล์รูปภาพกันเถอะ !!!

เมื่อเช้า Notebook ของผมอาการเข้าขั้นโคม่าเลยครับ ช่องเสียบชารจ์แบตท้ายเครื่องเจ้ง เสียบไฟไม่เข้า วันนี้ทั้งวันผมเลยวุ่นอยู่กับการชำแหละ Notebook ออกมาเป็นชิ้นๆ สุดท้ายก็เจอสาเหตุครับ นั่นคือเจ้าตัวช่องเสียบชาร์จแบตมันเริ่มหลวมๆ ก็เลยต้องบัดกรีมันลงบนเมนบอร์ดใหม่ให้แน่นขึ้น ตอนนี้ก็ดีเหมือนเดิม ได้กลับมาอัพblog อีกครั้ง ^ ^

งานนี้ต้องขอบคุณพี่ิเบิ้มที่ช่วยแนะนำตอนผมชำแหละเครื่อง, พี่อนุชาและพี่แก้วแห่งห้องแลบฮาร์ดแวร์ที่ช่วยบัดกรีเมนบอร์ดให้

มาเข้าเรื่องบทความกัน วันนี้ผมขอแนะนำวิธีการซ่อนข้อความไว้ในไฟล์ภาพ หรือที่เรียกกันว่า Steganography พอดีการบ้านวิชา Computer Security อาจารย์ให้ทำ Steganography วันนี้ก็เลยอยากจะมาแนะนำวิธีทำ Steganography แบบเบสิกกันครับ



Steganography
เป็นเทคนิคในการซ่อนข้อมูลไว้ในไฟล์อื่น ซึ่งอาจจะเป็นไฟล์ภาพ หรือไฟล์เสียงก็สามารถที่จะซ่อนได้ แต่ที่เป็นที่นิยมก็คือไฟล์ภาพ ไฟล์ภาพที่จะนำมาซ่อนข้อความก็มีอีกหลายชนิด ไม่ว่าจะเป็น GIF, JPEG, PNG ฯลฯ โดยในบทความนี้ ผมจะแนะนำวิธีการทำ Steganography ทั้งตัวซ่อนข้อความ (Encoder) และตัวถอดข้อความออกจากภาพ (Decoder) โดยจะใช้ไฟล์ภาพแบบ GIF และใช้ภาษาซีในการทำครับ

ก่อนอื่นก็ต้องรู้จักโครงสร้างของรูปภาพแบบ GIF กันก่อน โดยขอให้ดูที่เว็บไซต์ของคุณ Matthew Flickinger(http://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp) ประกอบนะครับ เพราะที่เว็บนี้มีรูปโครงสร้างของไฟล์ภาพแบบ GIF ที่เข้าใจได้ง่ายมาก นอกจากนั้น อยากแนะนำให้ใช้โปรแกรม Hex Editor Neo กัน เพราะโปรแกรมนี้สามารถที่จะเปิดดู Binary Code ของไฟล์ต่างๆ รวมไปถึงไฟล์ภาพแบบ GIF ที่เราจะใช้กันด้วย ซึ่งพอเราเปิดไฟล์ภาพแบบ GIF ในโปรแกรม Hex Editor Neo ประกอบกับดูรูปอธิบายโครงสร้างไฟล์ภาพของคุณ Matthew Flickinger แล้วจะยิ่งเข้าใจโครงสร้างของ GIF มากขึ้นครับ

โปรแกรม Hex Editor Neo โหลดได้ที่เว็บไซต์ http://www.new-hex-editor.com/ โดยเจ้าโปรแกรมตัวนี้ สามารถที่จะดูโค้ดภายในรูปได้ทั้งแบบเลขฐานสอง หรือฐานสิบหก รวมถึงยังสามารถค้นหา Pattern ในโค้ดได้ด้วย ซึ่งจะสะดวกมากเวลาเราจะค้นหาส่วนต่างๆ ในรูป




สำหรับวิธีการหรืออัลกอริทึมที่จะใช้ในการซ่อนข้อความนั้น ผมจะใช้การซ่อนแต่ละบิตของข้อความไว้ในบิตที่มีนัยสำคัญน้อยที่สุด(LSB) ของ Global Color Table ของไฟล์ GIF เนื่องจากการที่เราไปเปลี่ยนแปลงบิต LSB ของ Global Color Table นั้น จะไปส่งผลให้เฉดสีของรูปในแต่ละ pixel เปลี่ยนไปแค่เล็กน้อยมากๆ จนตาคนเราสังเกตุเห็นได้ยาก ในทางกลับกันถ้าเราเปลี่ยนไปซ่อนในบิตที่มีนัยสำคัญสูงที่สุด (MSB) ของ Global Color Table จะทำให้เฉดสีเปลี่ยนไปเป็นคนละสี ซึ๋งง่ายต่อการสังเกตุด้วยตาเปล่า

ตัวอย่าง

อักขระ A แปลงเป็นเลขฐานสองได้ 0100 0001
และสมมติให้ข้อมูลใน Global Color Table เป็นดังต่อไปนี้

11111110 11111111 11111110 11111110
11111111 11111111 11111110 11111100

เมื่อนำแต่ละบิตของอักขระ A (เริ่มจาก LSB) ไปแทนที่ตำแหน่ LSB ของแต่ละไบต์ใน Global Color Table จะได้ผลลัพธ์ดังนี้

11111111 11111110 11111110 11111110
11111110 11111110 11111111 11111100

เราก็ทำแบบเดียวกันนี้กับตัวอักษรตัวอื่นๆ ครับ ซึ่งเราสามารถจะเก็บได้เรื่อยๆ จนกระทั่งสิ้นสุดตำแหน่งของ Global Color Table

อัลกอริทึมที่จะใช้สำหรับ Encoder นั้นเป็นไปตาม Flow Chart ดังนี้ (คลิกที่รูปเพื่อดูภาพขยายครับ)



จากอัลกอริทึมนี้ จะเห็นว่าเราจะใส่ท้ายข้อความด้วยอักขระ ‘:’ เพื่อที่เวลา Decoder ทำการถอดข้อความออกจากรูปภาพ จะได้ทราบจุดสิ้นสุดของข้อความด้วยการมองหาอักขระ ‘:’
ในส่วนของ Decoder มีอัลกอริทึกดังนี้ (คลิกที่รูปเพื่อดูภาพขยายครับ)



ส่วนของ Decoder จะมองหาอักขระ ‘:’ เนื่องจากถ้าไม่มีอักขระ ‘:’ ก็แสดงว่าไฟล์ภาพนี้ยังไม่ได้ผ่านการซ่อนข้อความจาก Encoder สำหรับ source code ภาษาซีทั้ง Encoder และ Decoder สามารถดาวน์โหลดได้ที่นี่ โค้ดนี้สามารถคอมไพล์ได้ทั้ง gcc บน unix , c-free บน windows หรือ IDE ตัวอื่นๆ ของภาษาซีก็ได้ครับ หากมีข้อสงสัยเกี่ยวกับ code ที่ให้ไป (ต้องสงสัยแน่ เพราะคนเขียนนูป ^ ^") ก็เมล์มาถามกันได้ครับที่ programmer_boyz@hotmail.com

สำหรับวิธีการซ่อนข้อความไว้ในไฟล์ GIF ยังมีอีกหลายแนวทางที่สามารถทำได้ ไม่ว่าจะเป็นซ่อนใน Local Color Table หรือแม้แต่ซ่อนใน Comment Extension ก็สามารถทำได้ ซึ่งขึ้นอยู่กับความต้องการของผู้ใช้ ถ้าเราเข้าใจโครงสร้างของไฟล์ภาพ ก็สามารถที่จะเลือกซ่อนข้อความได้หลากหลายวิธีครับ

สำหรับวันนี้ ขอลาไปก่อนนะครับ ^ ^

ปล.เครดิตให้คุณ Fah Longhorn ที่แนะนำอัลกอริทึมนี้ให้ผมตอนทำ Assignment วิชา Computer Security ครับ

ปล.อีกทีนะ คุณ @aeronz เขียนบทความเกี่ยวกับ Steganography ในไฟล์ภาพแบบ PNG ไว้ ลองคลิกอ่านดูเพิ่มเติมกันที่นี่เลยครับ

2 comments:

  1. แล้วถ้าแก้ให้ไฟล์.jpg เป็น.exe หรือ.rar ต้องทำยังไงอ่ะครับ

    polyezper@hotmail.com

    ReplyDelete
  2. อยากได้โค้ดพี่ไปศึกษาหน่อยได้ป่าวค่ะ ถ้าพี่เห็นข้อความนี้รบกวนคุณพี่
    ส่งมาที่เมลน้องได้ป่าวค่ะ ยังก็ขอบคุณล่วงหน้านะค่ะ
    ploysiro_1@hotmail.com

    ReplyDelete