# 03 - Und ein ganzes Byte reicht nicht ... | 2B oder nicht 2B

Also, Freunde, am 1. April ist es Zeit, die Karten zu enthüllen, was genau " 2B oder nicht 2B " ist. Dies ist ein gemeinsamer Text des Autors der Arbeit.verhexen und dir schon Großvater bekannt Ungläubige

Bild

Laden Sie unbedingt das Archiv mit der Arbeit an Pouet herunter und lesen Sie den Einführungsartikel (Aprilscherze) sowie Kommentare dazu. Sehen Sie sich das erste Video mit einer praktischen Demonstration der Funktionsweise von Zwei-Byte-Code unter x86 an. Und erst dann versuchen Sie, den gesamten Text unten zu beherrschen.


Ja, 2B oder nicht 2B ist wirklich eine Umgebung zum Starten verschiedener Größencodierungsarbeiten, sehr einfach und vielleicht die kleinste der vorhandenen. Es hat jedoch seine eigenen Anforderungen und Einschränkungen.

Wenn jemand anderes es nicht abgefangen hat, wird Tool 2b.com unter DOS (DOSBox, FreeDOS, MS-DOS) gestartet und springt zum Befehlszeilenbereich (mit einem Versatz von $ 82 * des PSP-Segments), wodurch der Code gestartet wird, der zur Ausführung übertragen wurde Befehlszeile in Binär. Tatsächlich kann dieser Code durchaus die Form einer Zeichenfolge haben, die auf der Tastatur eingegeben werden kann (d. H. Aus ASCII-Zeichen mit Codes von 33 bis 126 bestehen), aber dazu später mehr.

* Hexadezimalzahlen, die wir in Pascal-Notation $ XX schreiben, dies ist praktisch, und fasm ermöglicht es Ihnen, dies zu tun.

Was ist wichtig zu wissen?


Null, wir empfehlen die Verwendung von fasm als Compiler . Alle unsere Tools sind speziell dafür geschrieben.

Erstens kann der Hauptcode eine maximale Größe von 125 Byte haben (dies sind die Einschränkungen für die Länge der Befehlszeile) und wird als reguläres COM-Programm gestartet, nur mit einem Offset von 82 USD, nicht wie üblich von 100 USD. Unmittelbar nach dem Hauptcode wird automatisch ein Wagenrücklaufsymbol (CR) mit dem Code 13 ($ 0D) hinzugefügt, und der Befehl jmp short $82($ EB, $ 80) befindet sich bei $ 100 .

Zweitens sollte der Code einige Zeichen nicht enthalten, da der Start aus einer BAT-Datei (also vom Befehlszeileninterpreter) erfolgen soll. Dies sind zunächst die E / A-Umleitungszeichen ("<", ">" und "|") sowie das Zeichen der Parametersubstitution und der Umgebungsvariablen ("%"). In einigen Systemen (einschließlich Windows, das den Start von DOS-Programmen unter V86 unterstützt) haben die Zeichen "&", "^" ebenfalls eine besondere Bedeutung. Sonderzeichen mit Codes bis zu 32 werden nicht von allen DOS unterstützt, und einige werden von keinem oder fast keinem unterstützt (DOSBox hat einen besonders mageren Satz), daher schließen wir auch alle diese Zeichen aus.

Drittens sind die Startwerte aller Register und Flags dieselben wie beim Starten des COM-Programms. In der überwiegenden Mehrheit von DOS wird es zu Beginn sein: ax = bx = 0 (fast immer), cx = $ FF, dx = cs = ds = es = ss, si = $ 100, di = sp = $ FFFE (mit genügend Betrieb) Speicher), bp = $ 9XX (das niedrige Byte ist überall unterschiedlich, aber seine hohe Tetrade, dh ein Halbbyte, normalerweise = 1), Flags cf = df = 0. Es liegt an Ihnen, es zu benutzen oder nicht.

Vor allem der „zweite“ Punkt ist hier verwirrend, nicht wahr?
Angenommen, wir müssen schreiben:

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

Und dann gibt es sofort 5 verbotene Zeichen gleichzeitig: 0 in mov ah,0, $ 16 in int $16, $ 3C (Zeichen "<") und 27 ($ 1B) in cmp al,27und eine Zahl mit Code <32 in, je xwenn sie xsich irgendwo in der Nähe des Codes befindet.

Was ist zu tun? Was durch andere Befehle ersetzt werden kann, wird ersetzt durch:

  • stattdessen mov ah,0schreiben wir xor ah,ahoder sogar cbw(wenn möglich);
  • Stattdessen cmp al,27schreiben wir not al+ sub al,not 27oder xor al,not 27+ inc alund noch besser (denn hier müssen wir warten, bis die Taste gedrückt wird, und den empfangenen Code mit dem ESC-Tastencode vergleichen) - dec ah.

C ist int $16komplizierter, aber wenn Sie darüber nachdenken, kann die xor ah,ah+ -Konstruktion int $16beispielsweise durch mov ah,$83+ ror ah,1+ ersetzt werden int $21.

Es bleibt je $+10. Es gibt mindestens zwei Möglichkeiten: entweder einen Sprung zurück (in ausreichender Entfernung) oder von dort vorwärts. Oder ersetzen Sie das Byte im Code. Zum Beispiel können Sie schreiben z: je ($*2+3)-x, aber irgendwo oben : not byte [si-($100-(z+1))].

Als Ergebnis erhalten wir:

   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 (   )

Alternativlösungen


Natürlich kann es im letzten Intro für mehr als 100 Bytes verbotener Zeichen ziemlich viel geben (zum Beispiel 15-20 und noch mehr), und jedes Mal, wenn solche Manipulationen vorgenommen werden, ist dies eine ziemlich trostlose Aufgabe, außerdem führen sie häufig zu einer Erhöhung der Codelänge.

Daher können Sie auf Verschlüsselung zurückgreifen. Entweder der gesamte Code oder einzelne Stellen. Im Beispiel 2b_life.asm verschlüsseln wir den gesamten Code, indem wir jedem Byte $ AC hinzufügen. Nach der ersten Verschlüsselung sind noch etwa 4 verbotene Zeichen übrig, die wir durch Ersetzen durch andere Befehle ermitteln können. Natürlich braucht auch die Wahl der Verschlüsselungsmethode (add, sub, xor, not, etc.) sowie des Schlüssels Zeit, aber dies ist das geringere aller Übel. Der Code des Decoders beträgt nur 8 Bytes - dies ist in dieser Situation durchaus akzeptabel. Die Verschlüsselung erfolgt automatisch mithilfe von Anweisungen.repeat, loadUnd store( das heißt wir den Code bereits verschlüsselt bekommen).


Einzelne Speicherorte werden im Beispiel 2b_note.asm verschlüsselt . Auch hier mit Hilfe von repeat, loadund storedem Wert $ 3D einigen Bytes hinzugefügt wird, und die Liste der Adressen dieses Bytes wird separat (1 Byte der Adresse für jedes dieser Byte) gespeichert. Insgesamt verschlüsseln wir 20 Bytes + 13 Bytes werden vom Entschlüsseler belegt. Ja, die erste Methode war wirtschaftlicher :)

Zu Beginn des Artikels haben wir versprochen, über den Code zu sprechen, der die Form einer Zeichenfolge haben kann, die aus ASCII-Zeichen mit Codes von 33 bis 126 besteht (damit er beispielsweise ohne besondere Schwierigkeiten auf der Tastatur eingegeben werden kann). Dies ist beispielsweise möglich, wenn der Code mit Hexadezimalzeichen oder dergleichen verschlüsselt ist. Ja, dies ist verschwenderisch, aber wenn es mit der BASE64-Methode verschlüsselt wird, können sich die Kosten als noch höher herausstellen, da der Decoder nur aus solchen Zeichen bestehen sollte.


Werkzeuge


Zum bequemen Schreiben von Code unter " 2B oder nicht 2B " wurden 4 Dateien erstellt:

  • 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- ).

?


Die Anzahl der vorhandenen Plattformen, für die Intras geschrieben werden, ist seit vielen Jahren praktisch unverändert, wenn Sie die Kategorie Wild (AON, Lötkolben, Wattestäbchen) nicht berücksichtigen. Wir bieten Ihnen ... nicht nur eine neue Plattform, sondern zumindest eine gewisse Vielfalt mit ihren Einschränkungen. Es sind Einschränkungen und deren Überwindung, die die Essenz der Demoszene als Prozess ausmachen. Es wäre schön, den gesamten Wettbewerb im Rahmen dieses Konzepts bei der nächsten Demopati zu sehen, wo verschiedene Autoren sich an der „2B or not 2B compo“ versuchen können :)

--- EOF ---

#FF - Und ein ganzes Byte ist nicht genug ... | Pilot)
# 00 - ICBM ... | Einladung zur Online-Revision 2020
# 01 - IBMP ... | Was sind Intro?
# 02 - Das MBM ... | Das Kreuz der Veränderungen
# 03 - IBMP ... | 2B oder nicht 2B
# 04 - Das MBM ... | Wir nehmen BC bei den Hörnern
# 05 - ICBM ... | Anime
# 06 - IBMP ... | Meteorismen

Großvaters Unterhaltungskanal im Telegramm:teleg.run/bornded

Neben dem Kanal befindet sich ein Chat. Darin können Sie versuchen, Fragen für die Demoszene, Assembler, Pixel Art, Tracker-Musik und andere Aspekte der Prozesse zu stellen. Sie können beantwortet oder an andere, thematischere Chats gesendet werden.

Also haben sie gewonnen - also gewinnen wir!

All Articles