# 03 - Et un octet entier ne suffit pas ... | 2B ou pas 2B

Alors, mes amis, le 1er avril, il est temps de révéler les cartes, ce qui est exactement « 2B ou pas 2B ». Il s'agit d'un texte commun de l'auteur de l'ouvrage.jin_x et déjà familier à toi grand-père incroyant

image

Assurez-vous de télécharger l'archive avec le travail sur Pouet et de lire l'article d' introduction (poisson d'avril), ainsi que ses commentaires. Regardez la première vidéo avec une démonstration pratique du fonctionnement du code à deux octets sur x86. Et alors seulement, essayez de maîtriser l'intégralité du texte ci-dessous.


Oui, 2B ou pas 2B est vraiment un environnement pour lancer divers travaux de codage de taille, très simples et, peut-être, les plus petits de ceux qui existent. Cependant, il a ses propres exigences et limites.

Si quelqu'un d'autre ne l'a pas détecté , l' outil 2b.com est lancé sous DOS (DOSBox, FreeDOS, MS-DOS) et passe à la zone de ligne de commande (à l'offset 82 $ * du segment PSP), lançant le code qui a été transféré à l'exécution ligne de commande en binaire. En fait, ce code peut bien avoir la forme d'une chaîne qui peut être tapée sur le clavier (c'est-à-dire se composer de caractères ASCII avec des codes de 33 à 126), mais plus à ce sujet plus tard.

* Les nombres hexadécimaux que nous écrirons en notation Pascal $ XX, c'est pratique, et fasm vous permet de le faire.

Qu'est-ce qu'il est important de savoir?


Null, nous vous recommandons d'utiliser fasm comme compilateur , tous nos outils sont écrits spécifiquement pour cela.

Premièrement, le code principal peut avoir une taille maximale de 125 octets (ce sont les restrictions sur la longueur de la ligne de commande) et démarrera comme un programme COM normal, uniquement avec un décalage de 82 $, et non de 100 $, comme d'habitude. Immédiatement après le code principal, un symbole de retour chariot (CR) avec le code 13 ($ 0D) sera automatiquement ajouté et la commande jmp short $82($ EB, $ 80) sera située à 100 $ .

Deuxièmement, puisque le lancement est censé provenir d'un fichier BAT (enfin, ou de l'interpréteur de ligne de commande), le code ne doit pas contenir de caractères. Tout d'abord, il s'agit des caractères de redirection d'E / S ("<", ">" et "|"), ainsi que du caractère de substitution de paramètres et des variables d'environnement ("%"). Dans certains systèmes (y compris Windows, prenant en charge le lancement de programmes DOS sous V86), les caractères "&", "^" ont également une signification particulière. Les caractères spéciaux avec des codes jusqu'à 32 ne sont pas pris en charge par tous les DOS, et certains ne sont pas pris en charge par aucun ou presque aucun (DOSBox a un ensemble particulièrement maigre), donc nous excluons également tous ces caractères.

Troisièmement, les valeurs de départ de tous les registres et drapeaux sont les mêmes que lors du démarrage du programme COM. Dans la grande majorité des DOS, le début sera: ax = bx = 0 (presque toujours), cx = $ FF, dx = cs = ds = es = ss, si = 100 $, di = sp = $ FFFE (avec un nombre suffisant d'opérations mémoire), bp = $ 9XX (l'octet bas est différent partout, mais sa tétrade haute, c'est-à-dire un quartet, généralement = 1), drapeaux cf = df = 0. L'utiliser ou non dépend de vous.

Surtout, le «deuxième» point prête à confusion ici, n'est-ce pas?
Supposons que nous devions écrire:

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

Et puis tout de suite il y a 5 caractères interdits à la fois: 0 in mov ah,0, 16 $ in int $16, 3C $ (caractère "<") et 27 ($ 1B) in cmp al,27et un certain nombre avec le code <32 in je xs'il xest situé quelque part à proximité dans le code.

Que faire? Ce qui peut être remplacé par d'autres commandes est remplacé par:

  • au lieu de cela, mov ah,0nous écrivons xor ah,ahou même cbw(si possible);
  • à la place, cmp al,27nous écrivons not al+ sub al,not 27ou xor al,not 27+ inc al, et encore mieux (car ici, nous devons attendre que la touche soit enfoncée et comparer le code reçu avec le code de la touche ESC) - dec ah.

C est int $16plus compliqué, mais si vous y pensez, alors la construction xor ah,ah+ int $16peut être remplacée, par exemple, par mov ah,$83+ ror ah,1+ int $21.

Cela reste je $+10. Il y a au moins 2 façons: soit faire un saut en arrière (à une distance suffisante), et ensuite aller de l'avant. Ou remplacez l'octet dans le code. Par exemple, vous pouvez écrire z: je ($*2+3)-x, mais quelque part au- dessus: not byte [si-($100-(z+1))].

En conséquence, nous obtenons:

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

Solutions alternatives


Bien sûr, dans l'intro finale pour plus de 100 octets de caractères interdits, il peut y en avoir beaucoup (par exemple, 15-20 et même plus), et chaque fois que faire de telles manipulations est une tâche plutôt morne, de plus, elles conduisent souvent à une augmentation de la longueur du code.

Par conséquent, vous pouvez recourir au cryptage. Soit le code entier, soit des lieux individuels. Dans l'exemple 2b_life.asm, nous chiffrons tout le code en ajoutant $ AC à chaque octet. Après le premier cryptage, il nous reste environ 4 caractères interdits, que nous pourrions résoudre en les remplaçant par d'autres commandes. Bien sûr, le choix de la méthode de cryptage (add, sub, xor, not, etc.), ainsi que de la clé, prend également du temps, mais c'est le moindre de tous les maux. Le code du décodeur n'est que de 8 octets - ce qui est tout à fait acceptable dans cette situation. Le cryptage s'effectue automatiquement à l'aide de directives.repeat, loadet store(c'est-à-dire que le code est déjà chiffré).


Les emplacements individuels sont chiffrés dans l'exemple 2b_note.asm . Ici encore, à l'aide de repeat, loadet storela valeur $ 3D est ajoutée à certains octets, et la liste des adresses de ces octets est stockée séparément (1 octet de l'adresse pour chacun de ces octets). Au total, nous chiffrons 20 octets + 13 octets sont occupés par le déchiffreur. Oui, la première méthode était plus économique :)

Au début de l'article, nous avions promis de parler du code, qui peut prendre la forme d'une chaîne composée de caractères ASCII avec des codes de 33 à 126 (afin qu'il puisse être tapé, par exemple, sans difficultés particulières sur le clavier). Cela est possible, par exemple, si le code est chiffré à l'aide de caractères hexadécimaux ou similaires. Oui, c'est du gaspillage, mais s'il est chiffré à l'aide de la méthode BASE64, les dépenses peuvent s'avérer encore plus importantes, car le décodeur ne doit être composé que de tels caractères.


Outils


Pour la commodité d'écrire du code sous " 2B ou pas 2B " 4 fichiers ont été créés:

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

?


L'ensemble des plates-formes existantes pour lesquelles les intras sont écrits est resté pratiquement inchangé depuis de nombreuses années, si l'on ne tient pas compte de la catégorie Wild (AON, fers à souder, cotons-tiges). Nous vous proposons ... pas seulement une nouvelle plateforme, mais au moins une certaine variété, avec ses limites. Ce sont les limites et leur dépassement qui sont l'essence de la demoscene en tant que processus. Ce serait amusant de voir l'ensemble du concours dans le cadre de ce concept chez le démopati le plus proche, où différents auteurs pourront s'essayer à la «compo 2B ou pas 2B» :)

--- EOF ---

#FF - Et un octet entier ne suffit pas ... | Pilote)
# 00 - ICBM ... | Invitation à la révision en ligne 2020
# 01 - IBMP ... | Qu'est-ce que l'intro?
# 02 - Le MBM ... | La croix des changements
# 03 - IBMP ... | 2B ou pas 2B
# 04 - Le MBM ... | On prend BC par les cornes
# 05 - ICBM ... | Anime
# 06 - IBMP ... |

Chaîne de divertissement de Meteorisms Grandfather dans Telegram:teleg.run/bornded

Il y a un chat à côté de la chaîne. Dans celui-ci, vous pouvez essayer de soulever des questions pour la demoscene, l'assembleur, le pixel art, la musique tracker et d'autres aspects des processus. Vous pouvez recevoir une réponse ou être envoyé vers d'autres chats plus thématiques.

Alors ils ont gagné - alors nous gagnons!

All Articles