因此,朋友们,在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 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个禁用字符,可以通过替换为其他命令来解决。当然,选择加密方法(加,减,异或,非等)以及密钥也需要时间,但这要少得多。解码器的代码只有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- ).
?
如果不考虑“野生”类别(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频道旁有个聊天室。在其中,您可以尝试对演示场景,汇编器,像素图,跟踪器音乐和其他过程方面提出问题。您可以被回答或发送给其他更具主题的聊天。他们赢了-我们赢了!