Steganography هو فن إخفاء المعلومات  . وقد اُستخدم على مر التاريخ بطرق وأساليب متنوعة ومختلفة ، فقد قام الاغريقيون بحلق رؤؤس الرسل ووشم الرسائل السرية عليها ، وما ان ينمو الشعر مجدداً تبقى الرسالة ولا يمكن الكشف عنها حتى يتم حلق رأسه مرة أخرى. وقد استخدمت الحضارات القديمة العديد من التقنيات والأساليب العبقرية لإخفاء المعلومات السرية. وفي وقت الحرب العالمية الثانية عرضت أخبار غير مرئية وتعد أيضاً شكلا شائعا من أشكال الكتابة التي لا يمكن اكتشافها. ويمكن لرسالة عادية أن تتضمن رسالة أخرى مختلفة جدا مكتوبة بين الاسطر.

وهو نوع أنواع الأمن بإستخدام طرق غامضة، من الناحية النظرية، وبصرف النظر عن المرسل والمتلقي لا يفترض لأحد أن يشك في وجود رسالة خفية.

التقنيات الرقمية والمعلوماتية قدمت لنا طرق جديدة لتطبيق عملية إخفاء المعلومات وذلك من خلال التقنيات المتطورة مثل إخفاء المعلومات في الصور الرقمية.

إخفاء المعلومات والتشفير ينتميان إلى نفس “العائلة الكبيرة”، فإذا تم تشفير رسالة تصبح غير قابلة للقراءة .

اما إخفاء المعلومات فقط يخفييها و ذلك لعدم جذب الانتباه وهذه هي الميزة التي تأخذها عملية إخفاء المعلومات من التشفير.

وفي هذا المقال سوف نظهر كيفية تخزين “مفتاح” مخفي في صورة بشكل غير ” مثير للريبة” ، والملف الذي سيتم دراسته مأخوذ من مسابقة امنية للكمبيوتر تدعى   (Capture the Flag, a computer security competition)

تحليل الهدف:

الملف الذي يحتوي على رسالة خفية في داخله هو ملف JPEG وتبدو هكذا :

 

image1

 

كان اسم الملف الأصلي “spamcarver” الذي هو في حد ذاته إشارة، وفقا لويكيبيديا فإن file carving عبارة عن عملية لإعادة ملفات الكمبيوتر المجزئة دون وجود ملف معرف للبيانات، عملية file carving تستخدم المعلومات من بنية الملفات المشتركة (المعلومات الواردة في الملفات، والاستدلال حول كيفية قيام نظام الملفات بتجزئة البيانات) . دمج هذه المصادر الثلاثة للمعلومات، يعد نظاماً لتشكيل الملفات يدل اي الأجزاء تنتمي لبعضها البعض وبالتالي هذا يساعدنا على استكشاف بنية ملف JPEG

نظرة اعمق لتنسيقات ملف JPEG:


كل صورة مضغوطة بإستخدام امتداد JPEG تسمى JPEG file وتنسيقها يختلف عن الصور المضغوطة بإمتداد JIF ، ومعظم الصور التي تم التقاطها بواسطة أجهزة حديثة مثل الكاميرات الرقمية تقوم بإنشاء ملفات بصيغة “EXIF Exchangeable image file format” وهي صيغة موحدة عن تبادل البيانات الوصفية ، بما ان معيار Exif لا يسمح بالبيانات الملونة، معظم برمجيات تحرير الصور تخزن امتداد JPEG على شكل JFIF ، كما تقوم بإضافة APP1 segment من ملف Exif لإضافة البيانات الوصفية بطريقة متوافقة تقريباً ؛ معايير JFIF تفسر بمرونة نوعا ما.

من الناحية الفنية، كل ملف JPEG مثل أي كائن آخر له بداية أو ترويسة، تسمى “sart of Image ” ونهاية تسمى “End of Image “، ويبدأ كل ملف JPEG من الصيغة الثنائية ‘0xFFD8‘ وينتهي بالصيغة الثنائية ‘0xFFD9‘

يحتوي كل ملف JPEG على بيانات ثنائية تبدأ ب FF وتسمى علامات ولها تنسيق اساسي كهذا:

0xFF+Marker Number (1 byte) +Data size (2 bytes) +Data (n bytes) 0xFF+Marker Number (1 byte) +Data size (2 bytes) +Data (n bytes)

وتستخدم بعض العلامات لوصف البيانات، بعد تشغيل تدفق العلامات الذي بدوره يشغل تدفق صورة JPEG التي تنتهي بنهاية العلامة .

هذه هي بنية تنسيق ملف JPEG الأساسية:

image2

 

والآن سنبدأ بدراسة صورة معينة.

تحليل المشكلة:


قبل البدء بالمحرر السداسي العشري، دعونا فقط نقوم ببعض المهام “الروتينية”، مثل التحقق من الصورة باستخدام بعض الأدوات القياسية للحصول على بعض المعلومات الإضافية حول هذا الملف.

في جهاز Windows 7، قمنا بتثبيت GnuWin32 للحصول على بعض * أوامر unix مثل امر “file” الذي يحدد نوع الملف وهذا ينطبق على هدفنا

تثبيت GnuWin32

نبدأ عن طريق تحميل اداة gnuwin32 الآلية (GetGnuWin32-0.6.3.exe)، ثم استخراجها إلى المجلد المطلوب، عملية التثبيت بسيطة جدا حتى لو تطلبت قائمة من الأوامر ، لذلك Windows command يوجه CMD لنقل موقع الاستخراج وتشغيل “download.bat” مما يؤدي الى تحميل كل حزم GnuWin32 المتاحة تلقائياً إلى نفس الدليل، إذا طلب منك أن تفعل شيئا فقط إقبل الإعدادات الافتراضية

بعد إنتهاء التحميل وبقاء موجه الأوامر نحتاج إلى تثبيت كافة الحزم المحملة بكتابة:

C:\PathWhereYouDownloaded\GetGnuWin32\>install c:\gnuwin32

هذا سيقوم بتثبيت جميع الحزم وتحميلها الى c:/gnuwin32

الخطوة الأخيرة هي إضافة الدليل الجديد إلى بيئة المتغيرات، وللقيام بذلك انقر بالزر الايمن على

“My computer ” ثم “Properties” ثم انقر على “Advanced system settings”

image3

في نافذة خصائص النظام انقر على زر ” Environment Variables” ، في تلك النافذة (كما هو مبين أدناه)، اختر “path ” في قسم variable in the Systems Variable وانقر على زر تعديل.

قم بتعديل مسار الخط عن طريق إضافة  C: \ gnuwin32

image4

 

دعونا الآن نستخدم “ملف” الأوامر:

image5

كما هو متوقع هذا ملف JPEG غير صالح مخزن على شكل JFIF ، يمكننا الحصول على المزيد من المعلومات باستخدام أداة أخرى تسمى ExifTool” ” التي يمكن أن تساعدنا بعملية المعالجة والتلاعب بالبيانات الوصفية للصور :

image6

حتى الآن، كل شيء يبدو على ما يرام و الملف هنا هو ملف بإمتداد JPEG صالح. مما يعطينا طرق فعالة ونهائية : القيام بها يدوياً وطرق المدارس القديمة!

دعونا نفتح الصورة باستخدام المحرر السداسي العشري ونركز على تنسيقها؛ علما ان كل ملف JPEG يبدأ من 0xFFD8 وينتهي مع 0xFFD9

image7

FFD8 هو عبارة عن بداية علامة الصورة، FFE0is عبارة عن تطبيق لوضع علامات الصور التطبيق و يستخدم لادخال تهيئة الكاميرا الرقمية والصورة المصغرة .

دعونا نحاول العثور على النهاية في الملف (the End of Image Marker) التي تساوي 0xFFD9,، وذلك باستخدام المحرر السداسي العشري للعثور على قيمة “” FFD9 وللقيام بذلك نستخدم WinHex، انقر على ” Find Hex Values” ثم على النافذة التي تظهر مسجلة في قيمة سداسية عشرية ثم انقر فوق “ok”

image8

 

وقد تم إيجاد اشارتين وهذا ليس “بالامر الاعتيادي” ، انقر على الإشارة الأولى للحصول على offset

 

image9

 

image10

أن الامر يزداد تعقيداً، وهذا يعني أن خطبا ما قد حل بملف JPEG .

يجب انهاء ملف JPEG على FFD9 لكن بالضبط بعد النهاية المفترضة للصورة 504B0304…….مع الكثير من البيانات الاخرى التي تظهر بالصيغة الثنائية .

إذا اعتدت على الهندسه العكسية يمكنك بسهولة معرفة أن هذا في الواقع بداية ملف PKZip العادي، حتى لو لم تكن معتادا فبحث سريع في محرك جوجل سيكشف عن ذلك. دعونا الآن نبدأ بدراسة البيانات الثنائية الملحقة بعد نهاية علامة الصورة.

نظرة أعمق لتنسيق ملف pkzip

كل ملف pkzip (أو اي ملف مضغوط) أساسا له هذا الشكل:

image11

 

قد يحتوي على العديد من الترويسات للملفات المحلية و العديد من ملفات البيانات المحلية والعديد من واصفات البيانات.

بالطبع هناك الكثير من التفاصيل الفنية الأخرى التي لن يتم شرحها في هذه المقاله .

Signature

The signature of the local file header  is always 0x504b0304

Version

The PKZip version needed for archive extraction

Flags

Bit 00: encrypted fileBit 01: compression optionBit 02: compression optionBit 03: data descriptor

Bit 04: enhanced deflation

Bit 05: compressed patched data

Bit 06: strong encryption

Bit 07-10: unused

Bit 11: language encoding

Bit 12: reserved

Bit 13: mask header values

Bit 14-15: reserved

Compression method

00: no compression01: shrunk02: reduced with compression factor 103: reduced with compression factor 2

04: reduced with compression factor 3

05: reduced with compression factor 4

06: imploded

07: reserved

08: deflated

09: enhanced deflated

10: PKWare DCL imploded

11: reserved

12: compressed using BZIP2

13: reserved

14: LZMA

15-17: reserved

18: compressed using IBM TERSE

19: IBM LZ77 z

98: PPMd version I, Rev 1

File modification time

Bits 00-04: seconds divided by 2Bits 05-10: minuteBits 11-15: hour

File modification date

Bits 00-04: dayBits 05-08: monthBits 09-15: years from 1980

Crc-32 checksum

CRC-32 algorithm with ‘magic number’ 0xdebb20e3 (little endian)

Compressed size

If archive is in ZIP64 format, this filed is 0xffffffff and the length is stored in the extra field

Uncompressed size

If archive is in ZIP64 format, this filed is 0xffffffff and the length is stored in the extra field

File name length

The length of the file name field below

Extra field length

The length of the extra field below

File name

The name of the file including an optional relative path. All slashes in the path should be forward slashes ‘/’.

Extra field

Used to store additional information. The field consists of a sequence of header and data pairs, where the header has a 2 byte identifier and a 2 byte data size field.

دعونا نعود إلى ملف JPEG مجدداً :

 

image12

وهنا بعص النقاط التي سنقوم بشرحها استنادا إلى الجدول أعلاه:

 

Selection_009

اصبحنا نعلم الكثير عن استخراج ملف مضغوط من ملف JPEG معين، و نعلم أيضاً ترويسة الملف، وكيفية بناء الملف وأن هذا الأخير يحتوي على ملف اسمه ” with no extension ”

أسهل طريقة للقيام بعملية “تفريغ” الملف المضغوط بداخل ملف JPEG هي بنسخ كل بايت بدءا من ترويسة الملف المضغوط حتى نهايته، والذي يعني، من بداية “504B0304” حتى نهاية “506B0506” الذي يقع بشكل عام في نهاية الملف:

image13

 

باستخدام المحرر السداسي العشري اذهب إلى 0XCB8E offset للعثور على بداية الملف المضغوط، ثم حدد كل وحد البايت حتى 0xFA04 ofset وقم بنسخ البيانات في ملف جديد ثم احفظها كملف مضغوط :

image14

إذا كنت تستخدم WinHex انقربالزر الايمن على offset ثم اختر ” Into New File -> Copy Block -> Into New File ”

image15

تظهر قائمة”حفظ ملف باسم” ؛ تعطي الملف الخاص بك اسما متبوعا بzip.

 

فحص الملفات المضغوطة المهملة:


استخدام امر “file” يخبرنا بأن الملف بالفعل ملف مضغوط سليم :

C:\Users\Soufiane>file C:\Users\Soufiane\Desktop\stegano\dumpedPK.zip
C:\Users\Soufiane\Desktop\stegano\dumpedPK.zip;Zip archive data, at least v2.0 to extract

الآن دعونا نحاول استخراج أرشيف الملفات المضغوطة (يمكنك استخدام أي برنامج تريد) سوف نستخدم الأوامر المعطاة من قبل GnuWin32 :

C:\Users\Soufiane>unzip C:\Users\Soufiane\Desktop\stegano\dumpedPK.zip
Archive: C:/Users/Soufiane/Desktop/stegano/dumpedPK.zip
error: cannot create

هل تذكر اسم الملف داخل الملف المضغوط؟ اسم من ثمانية خانات وهذا النوع من أسماء الملفات يمكن في الواقع يسبب بعض المشاكل ، لذلك دعونا نعود إلى الملفات المضغوطة المهملة ونستخدم المحرر السداسي العشري ، سوف نقوم بتغيير الإسم بشيء آخر . ما علينا القيام به هو اجراء بحث سداسي عشري (مثل الذي قمنا به مسبقاً ) ونحاول العثور على “2020202020202020” ثم نغيره كما نريد..
ووفقا لبنية ملف pkzip كان من المفترض العثور على اشارتين واحدة في بداية الملف المضغوط والاخرى في نهايته:

image16

تغيير هذه القيم باستخدام نفس الشيء:

image17

 

احفظه وقم بمحاولة الاستخراج مرة أخرى:

C:\Users\Soufiane\Desktop\stegano>unzip C:\Users\Soufiane\Desktop\stegano\dumpedPK.zip
Archive: C:/Users/Soufiane/Desktop/stegano/dumpedPK.zip
inflating: NoSpaces

image18

وبالفعل تم إنشاء ملف يسمى “”NoSpace دعونا نرى أي نوع من الملفات هو:

image19

الملف المضغوظ الوارد يقع في ملف JPEG آخر، أعد تسمية الملف المستخرج إلى “NoSpaces.jpeg ” ودعونا نرى كيف يبدو:

image20

نجحنا , بالفعل هو ملف JPEG ويحتوي على المفتاح الذي كنا نبحث !

الاستنتاج:


في هذا المقال علمنا أن إخفاء المعلومات ليس عبارة عن فن غامض ويقوم على أسس الرياضيات المعقدة و الخوارزميات، بل شاهدنا كيف يمكن لملف صورة بسيط ان يخفي اي ملفات اخرى فقط بالتحكم به وفهم بنية الملف ، حاولنا أن نعرض لكم بنية بعض الملفات المألوفة التي هي JPEG و pkzip وشاهدنا كيف يمكن ان يساعدنا المحرر السداسي العشري في التحقق من الملفات.

 

ترجمة لمقال: Steganography: What your eyes don’t see لصاحبها Soufiane Tahiri .