مرحبًا مجددًا. في الدرس السابق استخدمت PowerShell لرؤية الملفات والعمليات والخدمات، ولاحظت أن بعض القيم تظهر بصورة مألوفة مثل حجم ملف أو PID. قريبًا، حين تبدأ فحص الذاكرة والتفريغات الثنائية وتعليمات Assembly، ستجد القيم نفسها معروضة غالبًا بصيغة مختلفة: ثنائية أو سداسية عشرية.
هدف هذا الدرس هو أن تتعامل مع هذه الصيغ بوصفها تمثيلات مختلفة للقيمة نفسها، لا بوصفها أرقامًا غامضة جديدة. ستتمكن من تحويل القيم بين العشري والثنائي والسداسي عشري يدويًا، ثم التحقق من حساباتك بأدوات آمنة داخل مختبر Windows.
المسار المقترح يستغرق نحو 40–45 دقيقة: فهم الفكرة، ثم قراءة قصيرة، ثم تطبيق يدوي وعملي.
القيمة واحدة، لكن طريقة كتابتها تتغير
النظام العددي له أساس: عدد الرموز المتاحة فيه، وقيمة كل منزلة فيه.
| النظام | الأساس | الرموز المسموحة | مثال شائع في التحليل |
|---|---|---|---|
| العشري | 10 | من 0 إلى 9 | أحجام الملفات، أرقام العمليات، الوقت |
| الثنائي | 2 | 0 و1 | البتات والأعلام وتمثيل البيانات داخل العتاد |
| السداسي عشري | 16 | من 0 إلى 9 وA إلى F | الذاكرة، البايتات، الثوابت، تفريغات الملفات |
هذه القيم الثلاث متساوية عدديًا:
لكن كل صيغة تبرز شيئًا مختلفًا:
- العشري مناسب غالبًا للقراءة البشرية اليومية.
- الثنائي يوضح كل بت على حدة.
- السداسي عشري يجعل البيانات الثنائية الطويلة أقصر وأسهل في التقسيم إلى بايتات.
البادئة 0x تعني أن ما بعدها مكتوب بالسداسي عشري، مثل 0xCB. أما البادئة 0b فتدل عادة على الثنائي، مثل 0b11001011. البادئة نفسها ليست جزءًا من القيمة المخزنة في الذاكرة؛ إنها إشارة للقارئ أو للأداة إلى طريقة قراءة الرموز.
انتبه خصوصًا إلى هذا الفرق:
لكن:
إذًا لا يجوز افتراض أن 10 و0x10 لهما القيمة نفسها.
الفكرة المشتركة: وزن كل منزلة
أنت تستخدم النظام العشري يوميًا دون تفكير. العدد يعني:
أي ثلاث مئات، وست عشرات، وخمس آحاد.
النظام الثنائي يعمل بالطريقة نفسها، لكن أوزان الخانات هي قوى العدد :
| موضع البت من اليمين | الوزن |
|---|---|
| 0 | |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 |
لتحويل القيمة الثنائية 11001011 إلى عشري، اجمع أوزان الخانات التي تحتوي على 1:
لا تضف أوزان الخانات التي تحتوي على 0.
اقرأ المادة العربية التالية لتثبيت هذه الفكرة، ثم شاهد كيف تُستخدم القسمة المتكررة لعكس العملية. لا تحتاج إلى قراءة بقية المقالة الآن؛ ركز فقط على الأقسام المحددة.
تعرف على نظام العد الثنائي Binary أساس الحوسبة - الأنظمة والأنظمة المدمجة - أكاديمية حسوب
اقرأ من مقال أكاديمية حسوب لأنه يشرح المنزلة الثنائية والسداسية العشرية بالعربية، مع أمثلة حسابية مفيدة للتحليل منخفض المستوى.
ابدأ بقسم «نظرية النظام الثنائي»: ركز على جدول قوى العدد 2 وعلى المثال الذي يفكك العدد العشري 203 إلى بتات. بعده انتقل إلى القسم الفرعي «التحويل» واقرأ مثال القسمة المتكررة من جدول عمليات القسمة حتى النتيجة؛ الفكرة الأساسية هي تسجيل البواقي ثم قراءتها بالعكس. ثم انتقل إلى قسم «النظام الست عشري Hexadecimal». اقرأ شرح الحروف والقيم وجدول المطابقة بين الثنائي والسداسي والعشري، ثم اتبع مثال تحويل ست عشري الذي يشرح لماذا يمثل كل رقم سداسي أربع بتات وكيف تُكوَّن القيم الأطول.
من عشري إلى ثنائي: طريقتان مفيدتان
الطريقة الأولى: اختيار قوى العدد 2
لنحوّل إلى ثنائي. نبحث عن أكبر قوة للعدد 2 لا تتجاوز 45:
- تدخل في 45، إذًا بت يساوي
1. - يبقى .
- لا تدخل في 13، إذًا بت يساوي
0. - تدخل، فيبقى .
- تدخل، فيبقى .
- لا تدخل.
- تدخل.
لذلك:
عند التعامل مع بايت كامل، نكتب أصفارًا في اليسار حتى يصبح الطول 8 بتات:
هذه الأصفار اليسرى لا تغير القيمة العددية، لكنها توضح أن التمثيل المقصود عرضه ضمن بايت واحد.
الطريقة الثانية: القسمة المتكررة على 2
هذه الطريقة تعمل لأي عدد عشري. اقسم العدد على 2، وسجل الباقي في كل مرة:
| العملية | خارج القسمة | الباقي |
|---|---|---|
| 22 | 1 | |
| 11 | 0 | |
| 5 | 1 | |
| 2 | 1 | |
| 1 | 0 | |
| 0 | 1 |
بعد أن يصل خارج القسمة إلى صفر، اقرأ البواقي من الصف الأخير إلى الصف الأول:
استخدم طريقة قوى العدد 2 عندما تريد قراءة قيمة ثنائية قصيرة بسرعة في مصحح الأخطاء. واستخدم القسمة المتكررة عندما تحتاج إلى تحويل قيمة عشرية يدويًا بطريقة مضمونة.
لماذا السداسي عشري هو اللغة اليومية للمحلل؟
كتابة بايت واحد بالثنائي تحتاج إلى 8 رموز مثل 11001011. لكن السداسي عشري يختصره إلى رمزين فقط: CB.
السبب الرياضي بسيط:
أي أن كل رقم سداسي عشري يمثل بالضبط أربع بتات. تسمى مجموعة الأربع بتات أحيانًا نصف بايت أو Nibble.
| سداسي عشري | ثنائي | عشري |
|---|---|---|
0 | 0000 | 0 |
1 | 0001 | 1 |
7 | 0111 | 7 |
8 | 1000 | 8 |
9 | 1001 | 9 |
A | 1010 | 10 |
B | 1011 | 11 |
C | 1100 | 12 |
D | 1101 | 13 |
E | 1110 | 14 |
F | 1111 | 15 |
لذلك:
نقسم CB إلى رقمين:
Cتقابل1100Bتقابل1011
ثم نضع المجموعتين بجوار بعضهما:
وبما أن:
إذن:
هذه العلاقة تجعل السداسي عشري مناسبًا جدًا لمحررات Hex، ونافذة الذاكرة في x64dbg، والثوابت التي ستراها في Ghidra.
قاعدة عملية لا بد من تثبيتها
- كل رقم سداسي عشري يمثل 4 بتات.
- كل رقمين سداسيين يمثلان بايتًا واحدًا، أي 8 بتات.
- البايت الواحد يملك 256 احتمالًا مختلفًا:
لذلك يمتد نطاق قيمة البايت غير الموقّع من:
وبالسداسي عشري:
00 إلى FF
مثلًا:
سنناقش لاحقًا الفرق بين تفسير البايت بوصفه قيمة موقعة أو غير موقعة. في هذا الدرس، ركز على أن البايت هو ثمانية بتات، وأن FF هو أعلى نمط ممكن لبايت واحد.
من سداسي عشري إلى عشري
أوزان الخانات السداسية هي قوى العدد 16:
| موضع الخانة من اليمين | الوزن |
|---|---|
| 0 | |
| 1 | |
| 2 | |
| 3 |
لتحويل 0x3F8 إلى عشري:
تذكر أن F تساوي 15:
لا يلزم أن تحفظ قوى 16 الكبيرة كلها الآن. احفظ أول ثلاث قيم فقط: ، و، و. ستكفيك هذه القيم لتفكيك كثير من الثوابت الصغيرة والبايتات والكلمات التي تقابلها في المراحل الأولى من التحليل.
من عشري إلى سداسي عشري
يمكنك استخدام القسمة المتكررة نفسها، لكن على 16 بدل 2.
لتحويل إلى سداسي عشري:
| العملية | خارج القسمة | الباقي |
|---|---|---|
| 12 | 11 | |
| 0 | 12 |
حوّل البواقي التي تتجاوز 9:
- 11 تكتب
B - 12 تكتب
C
ثم اقرأ البواقي من الأسفل إلى الأعلى:
CB
إذن:
هذه الطريقة صحيحة دائمًا، لكن مع الوقت ستبدأ في تمييز القيم الشائعة مباشرة. مثلًا، من المفيد أن تصبح مألوفة لديك هذه التحويلات:
| عشري | سداسي عشري | ثنائي ضمن بايت |
|---|---|---|
| 0 | 00 | 00000000 |
| 1 | 01 | 00000001 |
| 10 | 0A | 00001010 |
| 16 | 10 | 00010000 |
| 32 | 20 | 00100000 |
| 64 | 40 | 01000000 |
| 128 | 80 | 10000000 |
| 255 | FF | 11111111 |
مختبر عملي: التحويل يدويًا ثم التحقق في Windows
خصص نحو 15–20 دقيقة لهذا المختبر داخل آلة Windows الافتراضية. لا تحتاج إلى عينة أو برنامج غير موثوق؛ الهدف بناء سرعة قراءة القيم فقط.
1. أنشئ ورقة ملاحظات للتحويل
افتح ملفًا نصيًا داخل مجلد المختبر، وسجل فيه الجدول التالي. احسب القيم أولًا يدويًا، ثم تحقق منها لاحقًا:
| عشري | ثنائي ضمن 8 بتات | سداسي عشري |
|---|---|---|
| 13 | ||
| 42 | ||
| 64 | ||
| 127 | ||
| 128 | ||
| 200 | ||
| 255 |
أثناء الحل، اكتب أوزان البتات فوق القيمة الثنائية:
128 64 32 16 8 4 2 1
هذه الطريقة تمنع خطأ شائعًا: قراءة البتات من اليسار وكأن وزنها يبدأ بـ1. البت الأيمن دائمًا وزنه 1 في القراءة العددية المعتادة.
2. تحقق من نتائجك بـ PowerShell
بعد الحساب اليدوي، افتح PowerShell ونفذ الأوامر التالية:
[Convert]::ToString(203, 2)
يعرض هذا التمثيل الثنائي للقيمة العشرية 203.
"{0:X}" -f 203
يعرض هذا القيمة نفسها بالسداسي العشري، والمتوقع أن ترى:
CB
وللتحويل من نص سداسي عشري إلى عشري:
[Convert]::ToInt32("CB", 16)
المتوقع:
203
استخدم هذه الأوامر للتحقق، لا بدلًا من الحساب. في التحليل العكسي، قد تحتاج إلى تقييم قيمة قصيرة بسرعة وأنت متوقف عند نقطة توقف؛ لا يكون من العملي فتح محول في كل مرة.
3. استخدم محول الأنظمة بوصفه مدققًا مستقلًا
المورد التالي يحتوي على محول تفاعلي وخلاصة لطريقتي التحويل. استخدمه بعد إكمال جدولك اليدوي: أدخل قيمة عشرية مثل 200، ثم راقب صيغتها الثنائية والسداسية. بعد ذلك أدخل قيمة مثل 0xCB وتأكد من ظهور 203.
محوّل الأنظمة العددية: ثنائي وسداسي عشري وثُماني
استخدم هذا المورد كأداة تحقق سريعة، لا كبديل عن فهم قيمة المنزلة أو طريقة القسمة المتكررة.
في أعلى الصفحة، استخدم حقل «القيمة» وأدخل أعدادًا عشرية أو قيمًا مسبوقة بـ0x أو 0b. لاحظ المخرجات في حقول الثنائي والعشري والسداسي. بعد التجربة، انتقل إلى قسم «أسئلة شائعة» واقرأ مثال أساس إلى عشري، الذي يوضح ضرب كل خانة في قوة الأساس المناسبة، ثم راجع الفقرة التالية التي تشرح القسمة المتكررة عند التحويل من العشري.
4. وثّق النتيجة بصيغة محلل
أضف إلى ملاحظاتك هذا المثال:
القيمة: 203 decimal
الثنائي ضمن بايت: 11001011
السداسي العشري: 0xCB
التحقق: PowerShell Convert.ToString و ToInt32
اكتب دائمًا الأساس أو البادئة عندما يكون هناك احتمال للغموض. عبارة مثل “القيمة هي 10” ناقصة في ملاحظات التحليل إذا لم يعرف القارئ هل تقصد عشريًا أم سداسيًا.
أخطاء شائعة ينبغي تجنبها
اعتبار A حرفًا لا رقمًا.
في السداسي العشري، A تعني 10، وF تعني 15. لذلك 0x1A ليس “واحدًا ثم حرف A”، بل:
نسيان الأصفار اليسرى عند الحديث عن حجم ثابت.
القيمتان 0xA و0x0A لهما القيمة العددية نفسها، لكن 0x0A يوضح أنها ممثلة ضمن بايت من رقمين سداسيين.
تقسيم الثنائي إلى مجموعات خاطئة عند تحويله إلى Hex.
ابدأ دائمًا من اليمين، واجمع البتات في كتل من أربعة. إذا بقيت مجموعة ناقصة في اليسار، أضف أصفارًا يسارها.
مثال:
101101
يصبح:
0010 1101
ثم:
2D
لذلك:
الخلط بين قيمة البايت وطريقة عرضه.
القيمة 255 و0xFF و11111111 تصف النمط العددي نفسه. الذي يتغير هو طريقة الكتابة والسياق الذي يجعل إحدى الطرق أوضح من الأخرى.
الخلاصة
أصبحت الآن قادرًا على قراءة والتحويل بين ثلاثة تمثيلات أساسية ستظهر باستمرار في الهندسة العكسية:
- الثنائي أساسه 2، وتحدد كل خانة فيه بتًا بقيمة 0 أو 1.
- العشري أساسه 10، وهو مناسب للعرض المعتاد لقيم مثل PID والحجم.
- السداسي العشري أساسه 16، ويستخدم الرموز
AإلىFللقيم من 10 إلى 15. - كل رقم سداسي عشري يمثل 4 بتات، وكل رقمين سداسيين يمثلان بايتًا من 8 بتات.
- يمكنك التحويل إلى العشري بجمع أوزان الخانات، والتحويل من العشري بالقسمة المتكررة على الأساس المطلوب.
- البادئات مثل
0xو0bتمنع الالتباس عند توثيق القيم.
في الدرس التالي ستبني على هذا الأساس لتفسير الأعداد الصحيحة الموقعة وغير الموقعة داخل الذاكرة: كيف يمكن لنمط البتات نفسه أن يقرأ كقيمة موجبة كبيرة أو قيمة سالبة، بحسب نوع البيانات وطوله.
Can't find a good explanation? Sign up and we'll make it for you
Sign up