20-04-18, 07:29 PM
(آخر تعديل لهذه المشاركة : 20-04-18, 07:33 PM {2} بواسطة silverlight.)
في المشاركة السابقة تم توضيح كيفية تحويل مصفوفة بايت الي صورة
وفي هذا الجزء من الموضوع سأوضح كيفية استرداد البيانات من الصورة
استرداد البيانات:
استرجاع البيانات عملية بسيطة و تتلخص في الخطوات التالية:
1- نقرأ الصورة
2- تحويل الصورة الي مصفوفة بايت
3- التعامل مع مصفوفة البايت و استرجاع المعلومات منها
ملحوظة :
في الصور بشكل عام فإن مصفوفة البايت او مصفوفة الألون يتم تخزينها بالشكل {Red Green Blue Alpha}
لذلك قمت بتعديل بسيط علي الكود السابق حتي اقوم بتحويل كل بايت منفردة الي مصفوفة صغيرة بالشكل {Red Green Blue Alpha}
الكود:
1- نقرأ الصورة التي تم تخزينها بأي طريقة تريدها
2- باستخدام الدالة التالية نقوم بتحويل الصورة الي مصفوفة بايت
نحصل علي مصفوفة البايت او مصفوفة الألوان
لو حاولت ان تفتخ الصورة التي تم بناؤها مسبقا في الجزء الأول بأي برنامج للصور
ستلاحظ ان الصورة بها منطقة بيضاء هذه المنطقة كل بكسل فيها عبارة عن {0 0 0 0} وتلك القيم تعبر عن الجزء الخالي من ألوان في الصورة
لذلك كل ما نحتاجه هو ان نقوم بعمل Loop و نفرأ الألوان التي لها قيمة اكبر من صفر
أو نقرا الألوان التي قيمة Alpha أكبر من صفر
أو نقرأ قيمة الألوان التي لها قيمة Alpha محددة أي نحن قمنا بتحديدها عند بناء الصورة
أحد الأفكار لتنفيذ الكود ستكون كالتالي
و بما أن مصفوفة البايت الأصلية التي تم تخزينها في الجزء الأول من الموضوع هي عبارة عن مصفوفة بايت خاصة ب تكست
هنا يتبقي فقط تحويل تلك المصفوفة الي تكست مرة ثانية
والكود التالي يوضح ذلك
طبعا الفكرة التي تم مناقشتها هي الحالة المثالية للمبرمج فقط
اي انه يمكن استخدامها لإخفاء المعلومات الخاصة بالمبرمج فقط من داخل برامجه
لكن و إن أردنا تعميم الفكرة فمن المؤكد أننا نحتاج الي بعض التعديلات علي الكود لنتأكد أن الصورة التي نسترد منها المعلومات بالفعل تمتلك المعلومات المطلوب استردادها
وهذا يستدعي ان تتم عملية اخفاء البيانات باستخدام نسق مناسب لا يعلمه غير المبرمج
ملحوظة أخيرة
تمرين بسيط للقارئ : حاول ان تقرأ ملف dll و تحوله الي صورة لتري ماذا سيحدث معك
أتمني ان الموضوع كان مفيدا للبعض منكم
الكود كاملا بالمرفقات
وفي هذا الجزء من الموضوع سأوضح كيفية استرداد البيانات من الصورة
استرداد البيانات:
استرجاع البيانات عملية بسيطة و تتلخص في الخطوات التالية:
1- نقرأ الصورة
2- تحويل الصورة الي مصفوفة بايت
3- التعامل مع مصفوفة البايت و استرجاع المعلومات منها
ملحوظة :
في الصور بشكل عام فإن مصفوفة البايت او مصفوفة الألون يتم تخزينها بالشكل {Red Green Blue Alpha}
لذلك قمت بتعديل بسيط علي الكود السابق حتي اقوم بتحويل كل بايت منفردة الي مصفوفة صغيرة بالشكل {Red Green Blue Alpha}
الكود:
1- نقرأ الصورة التي تم تخزينها بأي طريقة تريدها
PHP كود :
Dim file As String = ".\stegnoText.jpg"
PHP كود :
Dim img As Bitmap = Image.FromFile(file)
2- باستخدام الدالة التالية نقوم بتحويل الصورة الي مصفوفة بايت
PHP كود :
Private Function ConvertBitmapToBytes(bmp As Bitmap) As Byte()
Dim data As Imaging.BitmapData = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height), Imaging.ImageLockMode.ReadOnly, Imaging.PixelFormat.Format32bppArgb)
Dim buffer As Byte() = New Byte(data.Stride * data.Height - 1) {}
Runtime.InteropServices.Marshal.Copy(data.Scan0, buffer, 0, buffer.Length)
bmp.UnlockBits(data)
Return buffer
End Function
نحصل علي مصفوفة البايت او مصفوفة الألوان
PHP كود :
Dim buffer As Byte() = ConvertBitmapToBytes(img)
لو حاولت ان تفتخ الصورة التي تم بناؤها مسبقا في الجزء الأول بأي برنامج للصور
ستلاحظ ان الصورة بها منطقة بيضاء هذه المنطقة كل بكسل فيها عبارة عن {0 0 0 0} وتلك القيم تعبر عن الجزء الخالي من ألوان في الصورة
لذلك كل ما نحتاجه هو ان نقوم بعمل Loop و نفرأ الألوان التي لها قيمة اكبر من صفر
أو نقرا الألوان التي قيمة Alpha أكبر من صفر
أو نقرأ قيمة الألوان التي لها قيمة Alpha محددة أي نحن قمنا بتحديدها عند بناء الصورة
أحد الأفكار لتنفيذ الكود ستكون كالتالي
PHP كود :
Dim toRawData As List(Of Byte) = New List(Of Byte)()
Dim i As Integer = 0
' loop thru byte array and read color values with non zero alpha
While i < buffer.Length
Dim alpha As Byte = buffer(i + 3)
If alpha = 255 Then
toRawData.Add(buffer(i))
End If
i += 4
End While
و بما أن مصفوفة البايت الأصلية التي تم تخزينها في الجزء الأول من الموضوع هي عبارة عن مصفوفة بايت خاصة ب تكست
هنا يتبقي فقط تحويل تلك المصفوفة الي تكست مرة ثانية
والكود التالي يوضح ذلك
PHP كود :
Dim result As String = System.Text.Encoding.UTF8.GetString(toRawData.ToArray())
طبعا الفكرة التي تم مناقشتها هي الحالة المثالية للمبرمج فقط
اي انه يمكن استخدامها لإخفاء المعلومات الخاصة بالمبرمج فقط من داخل برامجه
لكن و إن أردنا تعميم الفكرة فمن المؤكد أننا نحتاج الي بعض التعديلات علي الكود لنتأكد أن الصورة التي نسترد منها المعلومات بالفعل تمتلك المعلومات المطلوب استردادها
وهذا يستدعي ان تتم عملية اخفاء البيانات باستخدام نسق مناسب لا يعلمه غير المبرمج
ملحوظة أخيرة
تمرين بسيط للقارئ : حاول ان تقرأ ملف dll و تحوله الي صورة لتري ماذا سيحدث معك
أتمني ان الموضوع كان مفيدا للبعض منكم
الكود كاملا بالمرفقات
Retired

