الاثنين، 23 أغسطس 2021

دورة تعلم Bash : الجزء الاول

 بسم الله الرحمن الرحيم

يعتبر تعلم التحكم بالطرفية (Terminal) في نظام لينكس من الأمور المهمة جداً , خاصة للمهتمين بالأمن الأكتروني بخاصة , لكون معظم الأدوات المستخدمة في هذا المجال تعمل على هذا نظام لينكس , و كون التعامل مع هذه الأدوات يتم بالغالب باستخدام الواجهة النصية .


  • ما هو الـــ"Bash" ؟
  •  

    Bash   هو برنامج يعمل كواجهة نصية للمستخدم لتوجيه الأوامر لنظام لينكس  أو ما يسمى بشيل لينكس (Linux Shell), كما يعمل كمترجم للبرنامج المكتوبة باللغة الأوامر الخاصة به , تم تصميمه كبديل لـــ (Bourne Shell) في نظام يونكس المملوك لشركة AT&T  الامريكية , حتى أن الاسم هو أختر لــــ (Borune Again Shell)  كبديل لبرنامج Bourne Shell  الذي كان يتم توزيعه بترخيص من شركة AT&T , و تم من فترة تم جعل برنامج Bourne Shell أو كما في موجه الاوامر sh مجاني و مفتوح المصدر , لكن لا يضاهي برنامج Bash و خصائص المتطورة مثال :

    1. القدرة على انشاء المصفوفات و التعامل معها .
    2. وجود بنى التحكم في سير البرنامج
    3. هنالك متغيرات خاصة في باش مثل RANDOM$  و FUNCNAME$
    4. وجود الأمر history الذي يسجل جميع الأوامر التي تم تنفيذها .

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

    يعتبر هو البرنامج الافتراضي في معظم توزيعات لينكس، ويحتوي على العديد من المميزات مثل:

    1.        التحكم في العمليات (Jobs control).

    2.       عرض الأوامر السابقة وإمكانية استدعاءها بحسب التسلسل.

    3.        المصفوفات (Array)

    4.        العمليات الحسابية (Shell Arithmetic).

    5.        إمكانية انشاء اختصارات للأوامر (Aliases).

     

    رغم كون برنامج Bash هو البرنامج الافتراضي في معظم توزيعات لينكس , لكن يوجد برامج متعددة تعتبر منافسة لهذا البرنامج و منها

    1.   sh : أو الاسم البديل (Borune Shell) مسمى على اسم مطوره Stephen Borune  , هذا هو برنامج الأصلي .

    2. csh  : اختصار لي (C Shell)

     

  • كيف أحصل على الــ"Bash" ؟
مع كل توزيعة لينكس تحصل على Bash بشكل افتراضي , و هنا في توزيعة يوبتو Ubuntu طريقة التشغيل ببساطة 
 

في التوزيعات الأخرى ابحث عن برنامج بالأسم Terminal , و للمستخدمي نظام ويندوز قم بتنزيل نظام لينكس الفرعي باتباع الشرح في هذه التدوينة على هذا الرابط .

  • ما معنى هذه الشاشة  ؟

تراه في الشاشة مؤشر يومض هذا المؤشر في انتظار ادخال الأوامر , سنطبع أول امر لنا اكتب التالي :

whoami

هذا الأمر سيطبع لك اسم المستخدم الذي يستخدم قام بتشغيل الأمر :

يجب أن تنتبه نظام لينكس حساس لحالة الأحرف جرب الأن أن تكتب الامر السابق كالتالي Whoami :


ستطبع لك رسالة تبين لك عدم وجود الأمر , لذا انتبه عند طباعة الاوامر , لك ما هو هذا الأمر , الأمر whoami هو مجرد برنامج يتواجد في نظامك لكي تعرف اين يتواجد اطبع الأمر التالي :

whereis whoami

 سيطبع لك سطر الأوامر مسار الملف و أين يوجد في الملف التنفيذي اولا ثم مسار ملف التعليمات (manual)  :


  • المجلد الحالي (Current working directory) : أين أنا ؟
عندما يبدأ موجه الأوامر الخاص بك يكون في مجلد افتراضي , في الغالب يكون المجلد الخاص بالمستخدم في المسار home/username/ , لمعرفة المجلد الحالي فقط اكتب الأمر pwd و اضغط  Enter  , الأمر pwd اختصار للجملة (print working directory) اطبع المجلد العامل .

pwd

 

  • عرض محتويات المجلدات : ماذا يوجد هنا ؟
في الأنظمة ذات الواجهه الرسوميه يجود برنامج يعرض لك الملفات و المجلدات بشكل رسومي سهل و تتفاعل مع الملفات و المجلدات بأستخدام الماوس في الغالب , و لكن كيف يمكن أن تعرض قائمة الملفات و المجلدات في الواجهة النصية الخاصة بــBash .
 
صورة للواجهة الخاصة بمستعرض الملفات في نظام يبنتو لينكس

يتوافر في نظام لينكس الأمر ls أختصار لكلمة list , اطبع في موجه الأوامر الأمر ls فقط و اضغط Enter :

ls
 
سيتم طباعة محتويات المجلد الحالي , الذي تعرفنا عليه باستخدام الأمر pwd :
 

 تلاحظ بأن الأمر طبع لنا الملفات و المجلدات الموجود و تم تميز المجلدات باللون الأزرق , لكن تستطيع اضافة / في نهاية المجلد كتميز للمجلدات :

ls -F
 
انتبه للمسافة مابين ls و F- , سيطبع لك كالتالي :
 

 الملفات و المجلدات المخفية في نظام لينكس يبدأ اسمها بالنقطة . , و لعرضها فقط أكتب الأمر ls كالتالي :

ls -a
 
 



تستطيع دمج المعاملين a- و F-  كالتالي :

ls -aF
 
أو كالتالي :

ls -Fa
 
لا يهم الترتيب في المعاملات (parameters) , لكن في بعض الحالات يجب ان تراعي الترتيب ,  سيكون مخرجات الأمر كالتالي :


تلاحظ وجود مجلدين في بداية القائمة هما :
.  : المجلد الذي يحمل اسم بالنقطة فقط هو المجلد الحالي .
.. : المجلد الذي يحمل النقطتين هو المجلد الاعلى من المجلد الحالي , في مسار المجلد , كمثال اذا كنت في المجلد  home/abgoor/ سيكون المجلد الاعلى هو home/  .

و لعرض محتويات أي مجلد فقط اضف مسار المجلد بعد الأمر ls و معاملاته كهذا المثال التالي الذي يعرض محتويات المجلد الجذر / :

ls -F /
 


تلاحظ وجود رموز بعد اسماء بعض الملفات :

@ : يدل على أن هذا الملف أو المجلد هو رابط (link) أو ما يسمى في ويندوز باختصار (shortcut) .
*   : يدل على ان الملف تنفيذي , يمكن تشغيله كبرنامج 

سوف نشرح هذه الأذونات الخاصة بنظام لينكس بالتفصيل في الدروس القادمة ( أن شاء الله ) .

  • التحرك بين المجلدات 
لتغير المجلد الحالي تستطيع تنفيذ الأمر cd  مع مسار المجلد الذي تريد الذهاب إليه , كمثالنا التالي , قبل تنفيذ الأمر نفذ الأمر pwd


pwd
cd ..
pwd
 
نفذه هذه الأوامر بتتابع و لاحظ التغير لديك , ستلاحظ بأنك المجلد الحالي تغير للمجلد الأعلى في المسار كالتالي :
 

كما ذكرنا سابقا المجلد بالاسم ".." دائما يشير للمجلد الأعلى في مسار المجلد الحالي , "." يشير للمجلد الحالي . , و الأن للنتقل للمجلد tmp/ الخاص بالملفات المؤقتة في نظام لينكس فقط اكتب الأمر cd ثم مسافة ثم مسار المجلد :


cd /tmp
 
و الأن لنعد لمجلد المستخدم الحالي و الذي يسمى في نظام لينكس بالمجلد البيت "Home folder" , فقط اكتب الامر cd ثم مسافة و الرمز ~ كالتالي :

cd ~
 
تذكر أذا اردت ان تعرف المجلد الحالي نفذ الأمر pwd .
 
  • التعامل مع الملفات و المجلدات 

1. أنشاء المجلدات 

للانشاء المجلدات سوف نستخدم الأمر mkdir فقط اكتب الامر قم اسم المجلد :

mkdir test
 
قم بالدخول لهذا المجلد عبر الأمر cd سوف يكون هو مكان تجاربنا .

cd test
 
و لإنشاء مجلد يحتوي على مجلد فقط استخدام المعامل p- كالتالي :

mkdir -p test1/test
 
و لإنشاء عدد من المجلد في سطر واحد فقط اكتب اسماء المجلدات و تذكر وضع المسافة:

mkdir test1 test2 test3 test4
 
و لكن ماذا لو اردت أنشاء مجلد بأسم يوجد فيه اكثر من كلمة يفصل ما بينها مسافة فقط ضع الأسم بين " " علامتي التنصيص :

mkdir "This is test folder"
 
 و الأن إلى بعض الابداع , لنفترض بأنك تريد أنشاء مجلدات بالاسم A متبوعا برقم من 1 إلى 10 فقط ضع المجال في بين القوسين كالتالي {10..1} :

mkdir A{1..10}

ماذا لو اردت أن يكون بدل الارقام تكون حروف , تستطيع فقد ضع بدل الارقام مدى بالحروف , طبعا راعي ترتيب الحروف الإنجليزية و ان تكون حالة الأحرف مطابقة :

mkdir {B..Z}2
 
لنفترض بأنك تريد أن تنشأ مدى خاص بك ببساطة ضع المدى بين قوسين كالتالي :

mkdir test{"A","B","C"}
 
سيتنتج لك مجلدات بالاسم testA , testB , testC .

2. أنشاء الملفات 

 لإنشاء ملف يوجد الأمر touch , هذا الأمر ينشىء ملف فارغ فقط اكتب الأمر كالتالي :

touch myfile
 
 كما في الأمر mkdir تستطيع استخدام المدى و الأنماط كالتالي :

touch A{1..10}{A..C}
 
3. حذف الملفات و المجلدات 
 
لنبدأ بحذف أحد الملف الذي قمنا بأنشاءه في مثالنا السابق "myfile" :

rm myfile
 
في حالة ملفات متعددة تستطيع كتابتها في نفس السطر مع وجود مسافة:

rm A1A A2A A3A
  
كما في الأوامر السابقة تستطيع حذف باستخدام المدى , سنتخدم المدى الذي استخدمنها في السابق :

rm A{1..10}{A..C}
 
ستحصل على خطأ كالتالي :

rm: cannot remove 'A1A': No such file or directory
rm: cannot remove 'A2A': No such file or directory
rm: cannot remove 'A3A': No such file or directory
 
تذكر بأننا قد قمنا بحذف هذه الملفات في المثال السابق , لكي تجعل الأمر يتجاهل الملفات الغير الموجودة فقط أضف المعامل f- كالتالي:

rm -f A{1..10}{A..C}
 
و الأن لحذف المجلدات في حالة حذف المجلدات فتستطيع ذلك و لكن يجب عليك أضافة المعامل r- كما تستطيع دمجه مع المعامل f- كالتالي:

rm -fr {B..Z}2
 
هنالك الرمز * الذي تستطيع أما تحديد ملفات أو مجلدات تبدأ بحرف معين أو كلمة كــ "*A1" أو تحديد الكل فقط أكتب النجمة كالتالي (قبل تنفيذ هذا الأمر تأكد من أنك في المجلد الذي قمنا بإنشاءه من أجل هذه تجاربنا بأستخدام الأمر pwd ) :

rm *
 
4. قراءة الملفات النصية :

لقراءة الملفات النصية تستطيع استخدام الأمر cat , في مثالنا سوف تقرأ الملف hosts في المجلد etc/ , هذا المجلد يحتوي اعدادات النظام و البرامج :

cat /etc/hosts
 
5. معرفة نوع الملف 

بدون الامتداد تستطيع معرفة نوع الملف بواسطة الأمر file , الذي يعتمد على قيمة في بداية الملف تعتبر كتوقيع للأنواع الملف :

file /bin/echo
 

  • الأنابيب (pipeline) و تحويل سير البيانات (redirect)

كل شيء في نظام لينكس عبارة عن ملف , عندما يطبع برنامج رسالة على الطرفية (Terminal) , فهو يستخدم رقم يسمى file descriptor في حالة إدخال البيانات يكون القيمة 0 أو stdin , لطباعة البيانات يستخدم stdout و لرسائل الخطأ يستخدم stderr .

pipeline هي طريقة نظام لينكس في نقل البيانات التي ترسل للملف stdout و تحويلها ما بين العمليات (Process) .

و الأن لمثال عملي :

ls | cat -n
 
سينفذ الأمر ls و يحول البيانات الناتجة إلى الأمر cat -n الذي سيطبع كل سطر مع رقمه .
 
و الأن إلى مثالنا التالي سنحاول عرض محتويات مجلد غير موجود , لنرى طريقة تصرف النظام :

ls not_existing | cat -n
 
سيطبع لك النظام رسالة خطأ من الأمر ls و لن يحول هذه الرسالة إلى البرنامج cat :

ls: cannot access 'not_existing': No such file or directory
 
السبب لهذا السلوك من النظام أن رسائل الخطأ يتم تحويلها إلى stderr و pipeline تحول فقط مخرجات stdout .

طبعا هنالك طريقة لتعديل هذا السلوك , ستتعرف له في بعد أن نطبق عملية تحويل سير البيانات , لنفترض أنك تريد أن تغير من ملف المخرجات الافتراضي stdout , الأمر بكل بساطة أستخدم < كالتالي:

ls > test.txt
 
كما تستطيع تنفيذ هذه العملية بشكل عكسي فقط استخدم > :

cat -n < test.txt
 
سيتم في تلك الحالة اعتبار الملف كبديل لــstdin , وقراءة البيانات الموجودة في الملف و ارسالها إلى الأمر cat .
 
و لنعد لمثالنا السابق الخاص بالمجلد الغير موجود , و الذي ادى لطبع رسالة الخطأ :

ls not_existing | cat -n
 
للارسال البيانات الخاصة برسالة الخطأ يجب أن تعيد توجيه دفق البيانات (data stream) من الملف الخاص stderr إلى stdout بواسطة 1&<2 كالتالي :

ls not_existing 2>&1 | cat -n
 
ستطبع لك الطرفية كالتالي ,  لاحظ بأن الأمر cat قام بترقيم السطر الخاص بالخطأ مما يدل على أن سيل البيانات (Stream) الخاص بالخطأ تم أرساله إلى اﻷمر  :

     1    ls: cannot access 'not_existing': No such file or directory
 
لكن لماذا نضع قبل الرقم واحد الخاص بالملف stdout الرمز & , لنجرب :

ls not_existing 1 | cat -n
 
الأن قم بتنفيذ الأمر ls , ستلاحظ وجود ملف يحمل الرقم 1 , أستخدم اﻷمر cat لعرض محتويات الملف :


يم اضافة الرمز & كتميز بين اسم ملف عادي و ملف stdout , و الأن لنقوم باستخدام الأمر cat في كتابة أول سكريبت لنا :

cat > hello
 
اضغط Enter ثم أكتب الأمر echo متبوعا بالجملة "Hello,World" بين علامتي تنصيص, واضغط Enter بعد انتهاءك ثم أضغط Ctrl + C (الزر Ctrl مع الحرف C ) .
 

و لتحويل الملف لملف تنفيذي استخدم الأمر chmod كالتالي :

chmod +x hello
 
و في الاخير لتنفيذ الملف أكتب قبل اسم الملف /. كالتالي :

./hello
 

و لنفترض انك تريد أن تضيف للملف hello أمر اخر , في هذه الحالة لا تستخدم < لأنك سوف تمسح جميع محتويات الملف و للأضافة أستخدم << (append) :

cat >> hello
 
و بنفس الطريقة اكتب سطر الأوامر و اضغط Enter ثم في Ctrl + C , اضف سطرا ينفذ الأمر pwd كمثال :



هذه نهاية الجزء الاول , في الجزء الثاني سوف نتعلم الأذونات الخاصة بالملفات و تعديلها بواسطة اﻷمر chmod .

في النهاية هذا الجزء اسأل الله العزيز الحكيم , أن يكون هذا المجهود المتواضع قد سهل وصول المعلومة عن اهم الأساسيات في نظام لينكس و هي الطرفية . و طلب لكل من يقرأ هذه الكلمات أذا صادفت أي خطأ أو أردت أضافت معلومة فلا تتردد .


الخميس، 19 أغسطس 2021

المجلد proc في نظام لينكس : أكثر من مجرد مجلد

 بسم الله الرحمن الرحيم

احد الاسباب التي تجعل نظام لينكس يتفوق على نظام ويندوز هو القدرة و التحكم الذي يعطي للمستخدم , و في هذا المقال ستعرف على المجلد proc الذي يمكنك من الوصول إلى الذاكرة , و تعديل عمل النواة ( Kernel ) في الوقت الفعلي , و الحصول على معلومات مفصلة عن حالة نظامك .


  • ما هو مجلد proc و اين يخزن ؟
هذا المجلد موجود في جميع توزيعات لينكس , و هو نظام ملفات افتراضي موجود في الذاكرة (RAM) من النوع procfs يتم انشاءه من قبل النواة عند عملية الاقلاع (Booting) و يتم ربطه على المجلد proc/ أو ما يمسى بمصطلحات لينكس بعملية (Mount) .

قبل أن نبدأ الرجاء توخى الحذر , تذكر أنك تقوم بتعديل الذاكرة بشكل مباشر فأي خطأ سيؤثر على نظامك
 
  •  الوصول إلى مجلد الأوامر 
ببساطة فقط غير المجلد الحالي بالاستخدام الأمر cd كتالي :
 
cd /proc


  • عرض معلومات المعالج بالتفصيل :
cat /proc/cpuinfo

  • عرض اصدارة النظام 
cd /proc/version


نسخة لينكس في بداية المعطيات هي تخص النواة (Kernel) , gcc هي نسخة الـــ"Compiler" , و المجمع Linker هو GUN ld


  • عرض معلومات الذاكرة 
باستخدام الأمر cat في نظامك الذي يعرض الملفات النصية و يعدلها تستطيع عرض محتويات الملف meminfo كالتالي :

cat /proc/meminfo

سيتم طباعة معلومات تفصلية عن الذاكرة لك كالصورة التالية



  • عرض الوقت الذي مضى على تشغيل النظام (uptime)
باستخدام نفس الأمر cat و لكن على الملف uptime
 
cat /proc/uptime

ستكون المخرجات كالتالي :
 
350735.47 234388.90

الرقم على اليمين يمثل الوقت الذي مضى منذ تشغيل النظام بالثواني , الرقم الثاني يمثل الوقت الذي الذي امضاه احد أنوية المعالج (Processor core) في وضعية idle (وضع لتوفير الطاقة عن تنفيذ النواة لجميع المهام الموكلة بها ) .


  • الحصول على معلومات عن أي برنامج يعمل على نظامك 
اذا كتب الامر ls و أنت في المجلد في proc :
 
ls /proc

ستظر لك مجلدات تحمل أرقام فقط كأسم للمجلد كالصورة التالية:



اسماء هذه المجلد ترمز إلى رقم المعرف الخاص بالعملية (PID) , أو باللغة مبسط كل برنامج في الذاكرة يحصل على رقم يميزه , هذا المجلد الخاص بالبرامج التي في الذاكرة يحتوي على الكثير من المعلومات المفيدة , و سنعرض البعض منها باستخدام مثال , في موجه الأوامر قم بطباعة الأمر التالي :
 
cat > /tmp/test.txt &
 
هذه الأمر يقوم بأنشاء الملف test.txt في مجلد الملفات المؤقته tmp/ , وتحويل المدخلات بواسطة الأمر cat , الرمز & يعني تحويل الأمر إلى البرامج التي تعمل في الخلفية (Background) , و سيطبع لك الرقم الخاص بالعملية , في مثالنا سيكون الرقم 9563 , طبعا سكيون الرقم لديك مختلف .



سيتم انشاء مجلد في proc بنفس رقم العملية (PID) , قم بالدخول للمجلد بأستخدام الامر cd :

cd /proc/9563

قم بتغير رقم المجلد بحسب الرقم الذي ظهر لك بعد تنفيذ الأمر , و الأن لنبدأ , لمعرفة الملف التنفيذي الذي انشاء العلمية (PID) , استخدم الملف exe و الأمر ls كالتالي  :
 

معرفة المجلد الذي تم تنفيذ الأمر فيه , و هنا لا أعني المجلد الذي نفذنا الأمر عليه , أنما المجلد الحالي الذي كنت فيه عند تنفيذ الأمر (Current Working Directory) :
 

معرفة سطر الأوامر الذي بدأ هذا الأمر :

معرفة الملفات التي يقوم البرنامج باستخدمها, يجود داخل مجلد العملية مجلد بالاسم fd يحتوي ملفات تحمل ارقام كأسم لها , هذه الملفات هي مجلد رابط (Link) للملفات التي يستخدمها البرنامج , فقط استخدم الأمر ls لعرض هذه الملفات :


 ملاحظة الملف dev/pts/0 يرمز للطرفية (Terminal) , تجد هنا الملف الذي قمنا باستخدام لتخزين المعطيات , في البرامج التي تستخدم الشبكة ستجد ملفات من نوع أخر كمثالنا التالي للأمر nc :

ستلاحظ هنا في السطر الأخير وجود رابط لملف من نوع القابس الخاص بالشبكة (Socket) , هنا يجب ان نشير بأن فلسفة نظام لينكس بأن كل شيء هو ملف .

 لعرض جميع العمليات الفرعية (Child processes) التي تحت العملية الرئيسية (Parent process) ستجد مجلد بالاسم task في مجلد العملية الرئيسية :

لعرض معلومات العملية بشكل مفصل ستجد الملف الخاص status , فقط استخدم الأمر cat كالتالي :


في السطر الثالث ترى حالة البرنامج في حالتنا "Stopped" , معلومات الذاكرة بالتفصيل .


هذا الشرح البسيط لا يعرض الا جزء بسيط من قدرات هذا المجلد , و ان شاء الله في القريب سوف انشر مقال حول كيفية تعديل الذاكرة للبرنامج و هو يعمل  بواسطة هذا المجلد و بالخصوص الملفين maps و mem المتواجدين في مجلد العملية .

لمن يقرأ الموضوع , هل لديك اضافة ؟ أو تعليق شاركنا لو سمحت .





الثلاثاء، 17 أغسطس 2021

تفعيل خاصية نظام لينكس الفرعي (Windows Subsystem for linux)

بسم الله الرحمن الرحيم

نظام لينكس الفرعي لويندوز أو اختصار (WSL) هو Compatibility layer (طبقة توافق ) و هو واجهة (interface) تمكن نظام ويندوز من تشغيل الملفات التنفذية الخاصة بلينكس (ELF) و هذه الخاصية موجودة في نظام ويندوز 10 و 11 و ويندوز 2019 .

و قد اعلنت شركة مايكروسوفت أنت النسخة الثانية من هذه الخاصية ستكون أكثر من طبقة توافق , و سوف تحتوي على نسخة من نواة لينكس بواسطة برنامج Hyper-v الخاص بــ Virtual Server .

هذه الخاصية ستمكنك من الاستفادة من البرامج الموجودة على نظام لينكس , طبعا ذلك سيكون مع بعض القصور مثل عدم امكانية التفاعل من الأجهزة الخارجية المربوطة بالجهاز .


  •  تفعيل الخاصية في نظام ويندوز
ابحث من مربع البحث عن Turn Windows Features on or off , ثم ابحث عن خاصية Windows SubSystem for Linux
و قم بتفعيل الخيار ثم أضغط على "OK" , سيتم التثبيت ثم يطلب منك أعادة التشغيل .

لتفعيل النسخة الثانية من WSL يجب عليك تفعيل خاصية Virtual Machine Platform من نفس القائمة أختر الاختيار الذي بنفس الأسم و أضغط OK :

النسخة الثانية تعتمد على عملية Virtualization و التي تكون يجب أن يكون الجهاز التي تعمل عليه متوافق معها :

  1. معالج من النوع 64 بت يدعم خاصية Second Level Translation
  2.  تفعيل الخاصية VT-x في معالجات Intel أوAMD-V ( يتم التفعيل من BIOS في حالة لم يكن الأختيار الافتراضي)
  3. ذاكرة لا تقل عن 8 GB
لكي تتأكد من أن جهازك يدعم هذه الخاصية فقط نفذ الأمر Systeminfo في موجه الأوامر في ويندوز و اذهب إلى أخر سطر تأكد من أن يظهر لك جميع الأختيارات Yes .
 
في حالة جهازي ستكون الرسالة
A hypervisor has been detected. Features required for Hyper-V will not be displayed.
ما يدل على تفعيل الخاصية
 
 أما أذا كانت الرسالة كالتالي Virtual Machine Platformغير مفعلة لذا تأكد من أن جميع الاختبارات ردت الــ YES


  • تثبيت النظام الفرعي
يوجد العديد من التوزيعات و لمثالنا هذا سوف نقوم بتثبيت Ubuntu , من متجر مايكروسوف قم بالبحث عن Ubuntu ثم قم بالتثبيت 
 

بعد أنتهاء التثبيت قم بالضغط على Launch أو اكتب في مربع البحث أسم التوزيعة Ubuntu عند التشغيل لأول مرة سيطلب منك وضع اسم المستخدم و كلمة السر وذلك بعد انتهاء التثبيت للنظام 

عند طابعة كلمة السر لن يظهر لك أي حرف أو حتى النجمة التي تراها في البرامج الأخرى


الأن لقد أنتهيت من تثبيت النظام و تستطيع استخدام برامج لينكس مباشرة على ويندوز , أن شاء الله يكون الشرح بسيط و مفيد , في هذا المقال .



السبت، 14 أغسطس 2021

QOTD : حكمة اليوم

حكمة اليوم

QOTD

اعتقد أن العنوان يوحي بأن الموضوع يحتوي حكمة اليوم , لكن الموضوع هو عن خدمة من مجموعة اتصالات الانترنت موثقة تعمل على المنفذ 17 للبرتوكول TCP و UDP , و كما يوحي الأسم فهدفها تمكين مدير النظام من بث رسالة تحتوي على حكمة اليوم على أجهزة المستخدمين في الشبكة , هذه الخدمة حاليا غير معروفة لدى الكثيرين و غير مستخدمة , لكن يمكنك تجريبها بأستخدام أحد هذه الخوادم التي لا زالت توفر الخدمة و بدون أي برامج اضافية على جهازك و هذه قائمة الخوادم :
  1. djxmmx.net
  2. alpha.mike-r.com
  3. cygnus-x.net
 
 من موجه الأوامر في جهازك ( ويندوز أو لينكس ) أكتب الأمر التالي :
 
telnet djxmmx.net 17

سيتم طباعة حكمة اليوم ثم انهاء الاتصال :

لمستخدمي جهاز ويندوز الأمر telnet معطل بشكل افتراضي في ويندوز 10 , لتفعيل اتبع الخطوات التالية :

  • من قائمة ابدأ اكتب في مربع البحث Windows features ,  و اختر Turn Windows features on or off
  • من القائمة التي ستظهر لك ابحث عن Telnet Client و تأكد من اختياره , ثم اضغط على الزر Ok


انصحك بزيارة هذه الصفحة التي استفدت منها في هذا الموضوع , تحتوي على مثال باللغة بايثون لعميل و خادم لهذه الخدمة :

الجمعة، 13 أغسطس 2021

بديل برنامج netstat في ويندوز : استخدم powershell للتحقق من اتصالات الجهاز

 بسم الله الرحمن الرحيم

لغة السكريبت powershell التي طورتها  مايكروسوفت تعطيك القدرة على التحكم الكامل في نظامك و أنشاء برامج تمكنك من تحويل الوظائف المملة إلى ألية بشكل كامل، في هذا المقال سوف استعرض الاوامر الاساسية مع بعض الاستخدامات لها، هذا الأوامر سوف تساعدك على استبدال الأمر netstat الذي ما زال موجوداً في نظام ويندوز 10 .
  • الوصول إلى موجه أوامر powershellمن نظامك أختر قائمة إبدأ (Start) :
     

  • أختر  Windows Power Shell


و الأن إلى أول أمر في سطر الأوامر :
Get-NetTCPconnection
 
ملاحظة سطر الأوامر في powershell لا يهتم بحالة الأحرف فأذا كتبت الأمر كالتالي get-nettcpconnection فسينجح تنفيذ الأمر 


هذه الصورة مثال لما سيظهر لك عند تنفيذ الأمر , طبعا ستكون القائمة طويلة لذا اذا اردت ان تظهر لك بالتدريج استخدم هذا الأمر :
Get-NetTCPconnection | more
 و الأن لما هو معنى كل هذا البيانات  لنبدأ بالسطر الأول :


 هذا السطر يظهر العنوان المحلي في الاغلب في الحالات يكون العنوان الخاص بالجهاز على الشبكة المحلية أو العنوان 127.0.0.1 أو العنوان الخاص 0.0.0.0  ( هذا العنوان خاص في حالات مثل عرض عنوان غير معروف كمثال المنفذ في حالة انتظار الانتصال Listen  يعرض العنوان المتصل بهذا العنوان ) .

 

 هذا السطر يعرض رقم المنفذ المحلي , و بالنسبة للأهمية هذا السطر فالمنفذ المحلي للأستخدام النظام للتميز بين الاتصالات الواردة  و لكن قد تحتاجه لمعرفة أذا كان نظامك يعاني من مشكلة تسمى ports exhaustion أو ما يمكن ترجمته لإستهالاك المنافذ , حيث أن عدد المنافذ المحلية و الخارجية محدود ( 0 - 65535 ) , و في بعض الاحيان بسبب برنامج يعاني خطأ برمجي يتسبب في عدم تحرير موارد النظام يستهلك جميع المنافذ المحلية المتاحة  .

 

هنا يأتي العنوان الذي يتم الأتصال به , و في الصورة سوف تجد العنوانين 0.0.0.0 ( الخاص ببرتوكول IP النسخة الرابعة ) و :: ( الخاص ببرتوكول IP النسخة السادسة ) و يكون هذا في حالة عدم معرفة العنوان في حالة المنافذ التي تنتظر الاتصال (listen) .

هنا ترى المنفذ الذي يقوم جهازك فيه بالاتصال بالعنوان الخارجي (Remote Address) وتلاحظ أنه في اخر الصورة تجد المنفذ 443 الخاص ببرتوكول HTTPS .

و هذا السطر يحتوي على حالات الأتصال و الان لشرح هذه الحالات :

  • Bound : هي حالة انتقالية عند حجز المنفذ و العنوان المحلي (Bind) قبل وضعية انتظار الانتظار (Listen) .
عملية انشاء مقبس لخادم , العملية متشابه في جميع لغات البرمجة , و قد تختلف بشكل بسيط


  • هنا سوف تجد مجموعة حالات خاصة بأنشاء الاتصال , أو ما يسمى في برتوكول TCP بالمصافحة (handshake) , و سوف تختصر هذا الصورة معنى كل مرحلة :
  •  
  •  عند بدأ الاتصال يقوم الجهاز الراغب في الاتصال (Client) بحجز منفذ محلي و عنوان ويحول حالته إلى SynSent بعد إرسال رسالة SYN إلى الهدف .
  • في حالة كون المنفذ متاح في الهدف يقول الجهاز المتصل به (Server) بحجز منفذ محلي و وضع حالته  SynRecevied وإرسال رسالة SYN-ACK التي تدل على قبول الاتصال إلى العميل (Client) .
  • بعد ذلك يحول العميل (Client) حالة الاتصال إلى Established و يرسل رسالة تتختم عملية المصافحة و هي رسالة SYN اخرى ليتحول حالة Established و يبدأ تبادل البيانات .
الحالات التي ترتبط بالاتصال بالترتيب و حسب الاسم المستخدم في Powershell :
  1. SyncSent
  2. SynReceived
  3. Established

و الأن إلى شرح الحالات المرتبطة بعملية انهاء الاتصال و سنبدأ بصورة تشرح خطوات إنهاء الاتصال في برتوكول TCP :

  • يقوم الجهاز الذي يرغب بأنهاء الاتصال بأرسال رسالة FIN و تحويل حالة الاتصال إلى FINWAIT1 .
  • عند وصول الرسالة إلى الهدف يتم تحويل حالة الاتصال إلى CloseWait و إرسال رسالة ACK.
  • عند وصول الرسالة إلى الجهاز الراغب بإنهاء الاتصال يتم تحويل حالة الاتصال إلى FINWAIT2 , في هذه الحالة لا يزال الخادم يرسل البيانات .
  •  عند نهاية الارسال يرسل الخادم رسالة LastAck , ليحول الاتصال في الطرف المنهي للاتصال إلى الحالة TimeWait و يتم أرسال رسالة ACK ليتم أنهاء الاتصال في الطرفين .
و هذا ترتيب هذه الحالات بحسب الاسم المستخدم في Powershell :
  1. FinWait1
  2. CloseWait
  3. FinWait2
  4. LastAck
  5.   TimeWait
  6. Closing - حالة انتقالية تخص نظام التشغيل عندما يحاول اغلاق الاتصال
  7. Closed
 قد تتساءل عن سبب وجود هذه الحالات المتعددة للاتصال في بروتوكول TCP , السبب هو انه تم تصميم هذا البروتوكول لضمان وصول جميع البيانات مهما كلف الأمر. 

هناك حالة واحدة لم اتطرق لها بالاسم DeleteTCB و TCB اختصار لـ(Transmission control block) و وفقاُ لموقع  
ietf.com  في TCB هو بيانات الاتصال المحفوظة على الجهاز و التي تحتوي جميع بيانات الاتصال , و بعد أغلاق الاتصال يتم تحرير هذه الذاكرة , و لكن لم يمر على أي اتصال في هذه الحالة , لا اعلم السبب بالتحديد و لكن أتوقع بأن العملية تتم بسرعة في يتمكن الامر من اعادة أي اتصال في هذه الحالة , طبعا هذا مجرد افتراضية .
 
و الأن سننتقل إلى السطر الخاص بالإعدادات الخاصة بالاتصال :
 

هذه العمود خاص بقوالب للاعدادات برتوكول TCP , تسطيع التحكم من خلالها بإعدادت البرتوكول , لعرض القوالب الموجودة في نظامك اكتب الامر التالي :
 
Get-NetTCPSetting | more

هذه الإعدادت تخص وقت الإستجابة (Network latency) و التعامل مع إزدحام الشبكة (congestion) و تخصيص وقت إنهاء الاتصال , هذا الموضوع سأفرد له موضوع كامل في المستقبل القريب ( أن شاء الله ) .
 
و العمود الأخير و هو OwingProcess و هو معرف العملية (Process Id) التي قامت بفتح المنفذ .

هذا المعرف سيمكنك من التعرف على البرنامج الذي قام بأنشاء الاتصال .


والأن بعدما تعرف على الأمر بشكل عام سنعرض بعض الأمثلة التي ستفيدك :
 
  • عرض الاتصالات بشكل تدريجيا
 
Get-NetTCPSetting | more

 
  •  عرض الاتصالات بحسب الحالة :
     
    Get-NetTCPSetting -state CloseWait 
    

    قائمة بالحالات الموجودة في PowerShell:
    1. Bound
    2. Closed
    3. CloseWait
    4. Closing
    5. DeleteTCB
    6. Established
    7. FinWait1
    8. FinWait2
    9. LastAck
    10. Listen
    11. SynReceived
    12. SynSent
    13. TimeWait 
     

    •  عرض الاتصالات بحسب معرف البرنامج (PID) :
     
     لنفترض أنك تريد أن تعرف الاتصالات التي تحصل من جهازك و البرنامج التي تستخدم هذه الاتصالات يوفر الأمر اختيار لعرض الاتصالات بحسب رقم معرف العملية (PID) :
     
    Get-NetTCPSetting -OwningProcess ProcessIDNumber 
    

    لكنني سوف اعطيك طريقة أعتقد بأنها أفضل بكثير من أنك تبحث بشكل يدوي على رقم المعرف , أنظر لها الأمر التالي:

     
    Get-Process -Id (Get-NetTCPConnection -State Established ).OwningProcess
    

    هنا سيعرض جميع البرامج التي تمتلك اتصالات في حالة اتصال (Established) , كما تستطيع تغير الحاله كما تريد كمثال التالي لعرض البرامج التي تتنظر الاتصال (Listen):
    Get-Process -Id (Get-NetTCPConnection -State Listen ).OwningProcess
    


     و الأن لنجعل الأمر اكثر تحديد و نحصل على الاتصالات الجارية (Established) على المنفذ 443 (HTTPS) :
     
    Get-Process -Id (Get-NetTCPConnection -State Established -RemotePort 443 ).OwningProcess
    


     و الأن لهذا المثال الذي سيظهر لك وقت بدأ الاتصالات في حالة Established و ترتيبه بحسب الوقت :
     
    Get-NetTCPConnection -State Established | Sort-Object CreationTime |Format-Table local*,remote*,State,CreationTime
    

    تراه هنا القوة و المرونة التي تعطيك لغة Powershell , تستطيع القيام بتعديل المخرجات بحسب ما تريده , يجب أن انبه على مشكلة في بعض المعطيات بهذا الأمر خاصة , في بعض الحالات لا يقوم النظام بتعديل القيمة الخاصة بوقت الإنشاء فتحصل على الوقت :
    1/1/1601 4:00:00 AM


    طبعا هنالك الأوامر الأبسط مثل تحديد عنوان أو منفذ كان محلي أو خارجي باستخدام هذه الأوامر :

    • Get-NetTCPConnection  -LocalPort 443 
    • Get-NetTCPConnection -LocalAddress 127.0.0.1
    • Get-NetTCPConnection -RemotePort 443
    •  Get-NetTCPConnection -RemoteAddress 8.8.8.8
     
    تستطيع أن تحدد مثل نوع الحالة مع المنفذ و العنوان :
     
    Get-NetTCPConnection -State Listen -LocalPort 139 -LocalAddress 127.0.0.1 -State Listen
    
     
    و الأن إلى المثال الأخير الذي سيطبع لك مسار البرنامج و معرف العملية و تاريخ الإنشاء مع المنفذ :

    Get-NetTCPConnection |Select-Object LocalPort,OwningProcess,CreationTime,@{name='ProcessName';expression={(Get-Process -Id $_.OwningProcess).Path}}
    
     
     
    و الأن إلى الأمر الخاص ببرتوكول UDP , طبعا هنالك اختلاف جوهري في التصميم ما بين برتوكول TCP و برتوكول UDP , كما لاحظت في برتوكول TCP فهنالك الكثير من الحالات و التحقق من بدأ الاتصال و عملية لبدأ الاتصال و أنهاءه , أما في برتوكول UDP فتم تصميمه بطريقة (Fire and Forget) , فالمرسل للبيانات يرسلها بدون الاهتمام بوصول البيانات و الطرف الثاني يكون في حالة واحده فقط و هي Listen  و الهدف من هذا هو السرعة لذا يستخدم في تطبيقات الوسائط عبر الانترنت .
     
    الأمر التالي يعرض لك المنافذ في وضعية Listen :
     
    Get-NetUDPEndpoint
     
    سترى هذا القائمة التي تظهر فقط العنوان و المنفذ المحلي :
     

     
     و الأن إلى الأمر الذي سيعرض لنا تاريخ الإنشاء ومعرف العملية للبرنامج ( PID ) :

    Get-NetUDPEndpoint  | select local*,CreationTime,OwningProcess
     
     و لمعرفة اسماء العمليات (PID) سنستخدم هذا الأمر :

    Get-Process -id (Get-NetUDPEndpoint).OwningProcess
     
     و الأن للمثال الأخير :
     
    Get-NetUDPEndpoint |Select-Object LocalPort,OwningProcess,CreationTime,@{name='ProcessName';expression={(Get-Process -Id $_.OwningProcess).Path}}
     
    هذه نسخة الأمر الخاصة UDP المشابه لذي استخدمناه في برتوكول TCP , سيتم طباعة تاريخ الإنشاء و مسار البرنامج و معرف العملية (PID) و المنفذ المحلي .
     
    و الأن في الختام أريد أن اجيب على سؤال تكرر في المدونة , وهو كيف أعرف من هذه المعطيات بأنه تم أختراق جهازي ؟ , الجواب مع تطور عمليات الأختراق اصبح الأمر ليس بالسهولة كما في كان في السابق , لكن قد يفيد في حالة أن المخترق يستخدم برنامج مستقل و قام بأنشاء خادم في جهازك يتصنت على أحد المنافذ , لكم ماذا لو كان المخترق محترفا و قام باستخدام ثغرة في احد البرامج الموجودة على جهازك , فعندما تقوم بالتدقيق فيظهر لك بأن البرنامج الذي يحاول الاتصال هو احد برامج المعروفة لديك , لذا فالتأكيد وجود أختراق لجهازك يتطلب أكثر من هذا الأمر , كما ان الكثير من برامج الاختراق تقوم بالاتصال بخوادم ويب (HTTPS) بدل أن تقوم بتنصت على منفذ على جهازك (Reverse Shell) كما أن البيانات المرسلة مشفرة فيصعب اعتراضها و تحليلها .
     

     
     
     

الأربعاء، 21 يوليو 2021

 بسم الله الرحمن الرحيم

بعد توقف دام سنين طويلة , سوف اعود لهذه المدونة , و احب ان اعبر عن أسفي لك من استفسر أو طلب موضوع و لم استطع ان ارد عليه لترك المدونة لهذه الفترة الطويلة. 

حدث الكثير في عالم التكنولوجيا , اصبح الكثير مما كتبته يحتاج للتحديث و التطوير و هذا ما سأعمل عليه أن شاء الله تعالى

و أن شاء الله نعود افضل و نواصل في نشر العلم النافع

 

 

الجمعة، 30 أغسطس 2013

ملف مضغوط بحجم 4.2 كيلوبايت يحتوي على بيانات بحجم 43000 تيربايت

بسم الله الرحمن الرحيم

قد يبدو لك العنوان مستحيلاً و رائعا في نفس الوقت , حيث أن برنامج للضغط يعمل بهذه الكفاءة قد يوفر عليك الكثر من الوقت في نفل البيانات في الشبكة .
و لكن هذا الملف ليس من صنع برنامج ضغط خارق بل من صنع مخترقي الأنظمة للتعطيل النظام و برامج معينة (  برامج مكافحة الفيروسات في معظم الحالات ) .

  • كيف يعمل هذا الملف ؟
يكون مساحة الملف في الغالب صغيرة جداُ مما يصعب اكتشافه , ويحتوي على كمية من البيانات العديمة النفع و ذلك للاستهلاك موارد النظام عند فك الملف .


  • كيف يؤثر هذا الملف على برنامج حماية الفيروسات ؟
 
كجزء من اساليب الحماية يقوم معظم برامج الحماية الحديثة بمسح الملفات الجديدة في النظام بشكل ألي للبحث عن الفيروسات , و بالنسبة للملفات المضغوطة يتم أولا فك ضغط الملف و في حالة الملف المحتوي على الثغرة سوف يتم استهلاك مساحة القرص الصلب و حدوث انهيار للنظام .


  • كيف يمكن ان يحتوي ملف بهذا المساحة على هذه الكميات من البيانات ؟
لفهم هذا اللغز لابد لك من فهم كيفية عمل خوازمية الضغط المستخدمة في ملفات (zip) , و لنبدأ بسلسلة البيانات التالية كمثال عن البيانات الغير مضغوطة :

AAAAABBBBCCCCBAAAA

تلاحظ بأن هنالك تكرار للأحرف بشكل كبير مما يؤدي لزيادة طول السلسلة ,  و لكن ماذا لو قمنا بأعادة كتابة سلسلة الحرف A في بداية السلسلة من (AAAAA) إلى (5A) حيث يرمز العدد في أول السلسلة لتكرار القيمة يليه القيمة المكررة , و الأن لنعد كتابة السلسلة السابقة باستخدام هذه الخوازمية :

5A4B4C1B4A

تلاحظ هنا حدوث تطلق لطول السلسلة بعد تطبيق الخوازمية , و الأن بعد أن أصبحت لديك فكرة عن عمل الخوازمية الخاصة ببرنامج الضغط , لنفترض بأننا قمنا بأرسال سلسلة نصية تتكون من الحرف A بطول 10000 سيكون تمثيلها بعد تطبيق خوازمية الضغط عليها كالتالي :
 10000A

تلاحظ هنا فعالية خوازمية الضغط في حالة كان الملف يتكون من سلسلة ضخمة من نفس القيمة , مما يكون عديم النفع للمستخدم العادي و لكن ليس للمخترق , حيث يقوم بأرسال كمية هائلة من البيانات التي تتكون من نفس القيمة ( صفر في العادة ) لبرنامج الضغط لتكوين ملف مضغوط مشبوه .


  • هل زال هذا الملف يشكل خطراً على برامج حماية الفيروسات ؟
معظم برامج الحماية الحديثة تقوم بالتعرف على هذا النوع من الملفات مباشرة و تتجنب فتحها .

  • هل يوجد مثال على هذا النوع من الملفات ؟
يوجد مثال عملي على الموقع http://www.unforgettable.dk , و الملف الموجود في هذا الموقع تم تصميمه بتضمين العديد من الملفات المضغوطة معاُ مما يزيد من فعاليته في ايقاف عمل برنامج الحماية من الفيروسات .

ملا حظة : تم تزويد الملف الموجود في الموقع بكلمة سر لمنع برنامج الحماية من الفيروسات من فتحه .

  • المصادر :
  1. http://en.wikipedia.org/wiki/Decompression_bomb
  2. http://research.swtch.com/zip
  3. http://www.steike.com/code/useless/zip-file-quine

الأربعاء، 3 يوليو 2013

المقارنة بين محتويات مجلدين في لينكس

بسم الله الرحمن الرحيم

يتواجد في نظام لينكس الأمر diff الذي يستخدم للمقارنة بين ملفين نصين و طباعة السطور المختلفة بين الملفين كالتالي :
diff 1.txt 2.txt

و في مثالنا لنفترض بأن الملف الأول 1.txt يحتوي على خمس أسطر و كل سطر يحتوي على الأعداد من 1 إلى 5 و الملف الثاني يحتوي على الأعداد من 1 إلى 6 :



و من الممكن أستخدام الأمر diff للمقارنة بين الملفات الموجودة في مجلدين مختلفين و طباعة الأختلاف بينهما بأستخدام الأمر التالي:

diff -rq 1/ 2/

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