# 03 - والبايت كله لا يكفي ... | 2B أم لا 2B

لذا ، أيها الأصدقاء ، في 1 أبريل ، حان الوقت للكشف عن البطاقات ، ما هو بالضبط " 2B أم لا 2B ". هذا نص مشترك من مؤلف العمل.نحس ومألوف لك جدك كافر

صورة

تأكد من تنزيل الأرشيف مع العمل على Pouet وقراءة المقال التمهيدي (كذبة أبريل) ، بالإضافة إلى التعليقات عليه. شاهد الفيديو الأول مع شرح عملي لكيفية عمل رمز ثنائي البايت على x86. وعندها فقط حاول إتقان النص بأكمله أدناه.


نعم ، 2B أم لا 2B هي حقًا بيئة لإطلاق العديد من أعمال التشفير ، بسيطة جدًا ، وربما أصغرها. ومع ذلك ، فقد متطلباتها وحدودها.

إذا لم يكتشفها شخص آخر ، يتم تشغيل أداة 2b.com من تحت DOS (DOSBox و FreeDOS و MS-DOS) وتنتقل إلى منطقة سطر الأوامر (عند الإزاحة 82 * دولارًا من قطعة PSP) ، وتشغيل الرمز الذي تم نقله إلى التنفيذ سطر الأوامر في ثنائي. في الواقع ، قد يحتوي هذا الرمز على شكل سلسلة يمكن كتابتها على لوحة المفاتيح (أي تتكون من أحرف ASCII برموز من 33 إلى 126) ، ولكن المزيد عن ذلك لاحقًا.

* الأرقام السداسية العشرية التي سنكتبها في تدوين باسكال $ XX ، وهذا مريح ، و fasm يسمح لك بذلك.

ما هو المهم أن تعرف؟


لا شيء ، نوصي باستخدام fasm كمترجم ، جميع أدواتنا مكتوبة خصيصًا لذلك.

أولاً ، يمكن أن يبلغ حجم الكود الرئيسي 125 بايت كحد أقصى (هذه هي القيود على طول سطر الأوامر) وسيبدأ كبرنامج COM عادي ، فقط مع إزاحة 82 دولارًا ، وليس 100 دولار ، كالمعتاد. مباشرة بعد الكود الرئيسي ، سيتم إضافة رمز إرجاع (CR) برمز 13 ($ 0D) تلقائيًا ، وسيتم تحديد الأمر jmp short $82($ EB ، $ 80) بسعر 100 دولار .

ثانيًا ، نظرًا لأنه من المفترض أن يكون الإطلاق من ملف BAT (جيدًا ، أو من مترجم سطر الأوامر) ، يجب ألا يحتوي الرمز على بعض الأحرف. بادئ ذي بدء ، هذه أحرف إعادة توجيه الإدخال / الإخراج ("<" و ">" و "|") ، بالإضافة إلى حرف استبدال المعلمات ومتغيرات البيئة ("٪"). في بعض الأنظمة (بما في ذلك Windows ، دعم إطلاق برامج DOS من تحت V86) ، فإن الأحرف "&" ، "^" لها أيضًا معنى خاص. الأحرف الخاصة ذات الرموز التي تصل إلى 32 غير مدعومة من قبل كل DOS ، وبعضها غير مدعوم من قبل أي أو لا شيء تقريبًا (DOSBox لديها مجموعة ضئيلة للغاية) ، لذلك نستبعد كل هذه الأحرف أيضًا.

ثالثًا ، تكون قيم البدء لجميع السجلات والعلامات هي نفسها عند بدء تشغيل برنامج COM. في الغالبية العظمى من DOS ، سيكون في البداية: ax = bx = 0 (دائمًا تقريبًا) ، cx = $ FF ، dx = cs = ds = es = ss ، si = $ 100 ، di = sp = $ FFFE (مع ما يكفي من التشغيل ذاكرة) ، bp = $ 9XX (البايت المنخفض مختلف في كل مكان ، ولكن ارتفاع رابعه ، أي عاب ، عادة = 1) ، أعلام cf = df = 0. لاستخدامها أم لا ، الأمر متروك لك.

الأهم من ذلك كله ، النقطة الثانية مربكة هنا ، أليس كذلك؟
لنفترض أننا بحاجة إلى الكتابة:

   mov ah,0
   int $16
   cmp al,27
   je x

ثم على الفور هناك 5 أحرف ممنوعة في وقت واحد: 0 في mov ah,0، $ 16 في int $16، $ 3C (الحرف "<") و 27 ($ 1B) في cmp al,27بعض الأرقام مع رمز <32 in je xإذا كان xموجودًا في مكان قريب من الرمز.

ماذا أفعل؟ ما يمكن استبداله بأوامر أخرى يتم استبداله بما يلي:

  • بدلاً من ذلك mov ah,0نكتب xor ah,ahأو حتى cbw(عند الإمكان) ؛
  • بدلاً من ذلك ، cmp al,27نكتب not al+ sub al,not 27أو xor al,not 27+ inc al، بل والأفضل (لأننا هنا نحتاج إلى انتظار الضغط على المفتاح ومقارنة الرمز المستلم مع رمز المفتاح ESC) - dec ah.

C int $16أكثر تعقيدًا ، ولكن إذا فكرت في الأمر ، فيمكن استبدال البناء xor ah,ah+ int $16، على سبيل المثال ، بـ mov ah,$83+ ror ah,1+ int $21.

يبقى je $+10. هناك طريقتان على الأقل: إما أن تقفز إلى الخلف (إلى مسافة كافية) ، ومن هناك تذهب إلى الأمام. أو استبدال البايت في التعليمات البرمجية. على سبيل المثال، يمكنك كتابة z: je ($*2+3)-x، ولكن في مكان ما فوق: not byte [si-($100-(z+1))].

نتيجة لذلك ، نحصل على:

   not byte [si-($100-(z+1))]  ;  2-  ( ) je  si=$100
   mov ah,$83
   rol ah,1  ; ah=7
   int $21  ;   ,    al
   not al
   sub al,not 27  ; cmp al,27
z: je ($*2+3)-x  ;    x (   )

حلول بديلة


بالطبع ، في المقدمة النهائية لأكثر من 100 بايت من الشخصيات الممنوعة ، يمكن أن يكون هناك الكثير (على سبيل المثال ، 15-20 وأكثر) ، وفي كل مرة يكون مثل هذا التلاعب مهنة كئيبة نوعًا ما ، علاوة على ذلك ، غالبًا ما تؤدي إلى زيادة في طول الرمز.

لذلك ، يمكنك اللجوء إلى التشفير. إما الرمز بالكامل ، أو الأماكن الفردية. في المثال 2b_life.asm ، نقوم بتشفير كل الكود بإضافة $ AC لكل بايت. بعد التشفير الأول ، يتبقى لدينا حوالي 4 أحرف ممنوعة ، والتي يمكننا العمل عليها من خلال استبدالها بأوامر أخرى. بالطبع ، فإن اختيار طريقة التشفير (إضافة ، فرعية ، xor ، لا ، إلخ) ، بالإضافة إلى المفتاح ، يستغرق أيضًا بعض الوقت ، ولكن هذا هو أقل الشرور. رمز وحدة فك الترميز هو 8 بايت فقط - وهذا مقبول تمامًا في هذه الحالة. يحدث التشفير تلقائيًا باستخدام التوجيهات.repeat، loadو store(أي نحصل على كود تشفير بالفعل).


يتم تشفير المواقع الفردية في مثال 2b_note.asm . هنا ، مرة أخرى ، بمساعدة repeat، loadويتم إضافة storeالقيمة $ 3D إلى بعض وحدات البايت ، ويتم تخزين قائمة عناوين هذه البايت بشكل منفصل (1 بايت من العنوان لكل بايت). في المجموع ، نقوم بتشفير 20 بايت + 13 بايت يشغلها برنامج فك التشفير. نعم ، كانت الطريقة الأولى أكثر اقتصادا :)

في بداية المقال ، وعدنا بالتحدث عن الرمز ، والذي يمكن أن يتخذ شكل سلسلة تتكون من أحرف ASCII برموز من 33 إلى 126 (بحيث يمكن كتابتها ، على سبيل المثال ، دون صعوبات خاصة على لوحة المفاتيح). هذا ممكن ، على سبيل المثال ، إذا تم تشفير الرمز باستخدام أحرف سداسية عشرية أو ما شابه. نعم ، هذا مضيعة للوقت ، ولكن إذا تم تشفيره باستخدام طريقة BASE64 ، فقد يتضح أن النفقات أكبر ، لأن وحدة فك الترميز يجب أن تتكون من هذه الأحرف فقط.


أدوات


لتسهيل كتابة التعليمات البرمجية ضمن " 2B أو لا 2B " تم إنشاء 4 ملفات:

  • 2b.draft.asm – 128- BAT-, 2b ( , - , ). , .
  • 2b.draft44.asm – 44- , ASCII- 33 126. - : + «A» ( «A»...«P»), + «K» ( «K» «Z»). – 37 (+ 2 pusha + popa, ). : (125 — 37) / 2 = 44 ( 43, pusha + popa). :). , – 2b_snow.asm 2b_hello.asm
  • 2b.check.inc – include- . , , ( BAT-).
  • 2b.debug.inc – include- ( COM- BIN- ).

?


ظلت مجموعة المنصات الحالية التي تم كتابة نصوصها الداخلية دون تغيير تقريبًا لسنوات عديدة ، إذا كنت لا تأخذ في الاعتبار فئة Wild (AON ، مكاوي اللحام ، براعم القطن). نحن نقدم لك ... ليس فقط منصة جديدة ، ولكن على الأقل بعض التنوع ، مع قيودها. إن القيود والتغلب عليها هي جوهر demoscene كعملية. سيكون من الممتع رؤية المسابقة بأكملها في إطار هذا المفهوم في أقرب مكان ديموباتي ، حيث سيتمكن مؤلفون مختلفون من تجربة أيديهم في "2B or not 2B compo" :)

--- EOF ---

#FF - والبايت بأكمله لا يكفي ... | الطيار)
# 00 - ICBM ... | دعوة للمراجعة عبر الإنترنت 2020
# 01 - IBMP ... | ما هي المقدمة؟
# 02 - MBM ... | صليب التغييرات
# 03 - IBMP ... | 2B أم لا 2B
# 04 - MBM ... | نأخذ BC من الأبواق
# 05 - ICBM ... | أنمي
# 06 - IBMP ... |

قناة الترفيه عن الأرصاد الجوية في Telegram:teleg.run/bornded

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

لذا فازوا - لذا فزنا!

All Articles