#03-整个字节不足... | 2B与否2B

因此,朋友们,在4月1日,该是展示卡片的时候了,究竟是“ 2B还是不是2B ”。这是该作品作者的共同文字。金_x 爷爷已经很熟了 不信的

图片

确保下载包含Pouet上的著作的存档,并阅读介绍性文章(愚人节),以及对此的评论。观看第一个视频,并实际演示如何在x86上使用两字节代码。然后才尝试掌握下面的全部内容。


是的,不是2B还是2B确实是启动各种sizecoding工作的环境,非常简单,也许是现有的最小的。但是,它有其自身的要求和局限性。

如果其他人没有抓住它,则从 DOS下启动2b.com工具(DOSBox,FreeDOS,MS-DOS),并跳转到命令行区域(在PSP段的偏移量$ 82 *处),启动已转移到执行的代码二进制命令行。实际上,此代码很可能具有可以在键盘上键入的字符串的形式(即,由具有从33到126的代码的ASCII字符组成),但稍后会更多。

*我们将以Pascal记号$ XX编写十六进制数,这很方便,并且fasm允许您执行此操作。

重要的是要知道什么?


空,我们建议使用fasm作为编译器,我们所有的工具都是为此专门编写的。

首先,主代码的最大大小为125个字节(这是对命令行长度的限制),它将作为常规COM程序启动,仅偏移量为$ 82,而不是通常的$ 100。在紧随主代码之后,将自动添加带有代码13($ 0D)的回车(CR)符号,命令jmp short $82($ EB,$ 80)位于$ 100处

其次,由于启动是从BAT文件启动的(嗯,还是从命令行解释器启动的),所以代码不应包含某些字符。首先,这些是I / O重定向字符(“ <”,““>”和“ |”),以及通配符和环境变量(“%”)。在某些系统(包括Windows,支持从V86下启动DOS程序)中,字符“&”,“ ^”也具有特殊含义。并非所有DOS都支持代码最多为32的特殊字符,某些字符几乎不受任何字符的支持(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 in mov ah,0,$ 16 in int $16,$ 3C(字符“ <”)和27($ 1B)in cmp al,27以及一些编号为<32 in的数字(je x如果它x位于代码附近)。

该怎么办?可以用其他命令替换的内容替换为:

  • 相反,mov ah,0我们写xor ah,ah,甚至cbw(如果可能);
  • 取而代之的是,cmp al,27我们编写not al+ sub al,not 27xor al,not 27+ inc al,甚至更好(因为在这里,我们需要等待按键被按下并将接收到的代码与ESC键代码进行比较)- dec ah

C int $16更为复杂,但是如果您考虑一下,则可以用+ + 代替xor ah,ah+ 构造 它仍然存在至少有两种方法:要么向后跳(到足够的距离),然后从那里向前跳。或替换代码中的字节。例如,您可以编写,但要在上方: 结果,我们得到:int $16mov ah,$83ror ah,1int $21

je $+10z: je ($*2+3)-xnot 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个禁用字符,可以通过替换为其他命令来解决。当然,选择加密方法(加,减,异或,非等)以及密钥也需要时间,但这要少得多。解码器的代码只有8个字节-在这种情况下,这是完全可以接受的。使用指令自动进行加密。repeatloadstore(即我们已将代码加密)。


个别位置在2b_note.asm示例中进行了加密在这里,再次的帮助下repeatloadstore$ 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- ).

?


如果不考虑“野生”类别(AON,烙铁,棉签),则为Intras编写的现有平台集实际上多年来一直没有变化。我们为您提供的不仅是一个新的平台,而且还具有局限性,至少为您提供了多种选择。局限性及其克服是恶魔作为一个过程的本质。很高兴在最近的demopati上看到整个比赛都符合这一概念,在那里不同的作者将能够尝试“ 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 ... | 电报

祖父的娱乐频道:teleg.run/bornded

频道旁有个聊天室。在其中,您可以尝试对演示场景,汇编器,像素图,跟踪器音乐和其他过程方面提出问题。您可以被回答或发送给其他更具主题的聊天。

他们赢了-我们赢了!

All Articles