标题: ASCII Assembly技术简介
作者: Demon
链接: https://demon.tw/programming/ascii-assembly.html
版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。
ASCII Assembly(ASCII汇编)指的是仅使用ASCII中可打印字符(0x20-0x7E)的汇编,也有人称之为ASCODE。名字只是称呼而已,玫瑰花即使换了一个名字,还是一样芬芳。
第一次知道ASCII Assembly是在中国DOS联盟的一个名为《批处理输入密码但不显示字符的代码》的帖子中:
: by Herbert Kleebauer :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: @echo off echo hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x>in.com set /p password=Enter password:<nul for /f "tokens=*" %%i in ('in.com') do set password=%%i pause del in.com echo. echo The Password is:"%password%"
当时还是十足的菜鸟,跟大多数人一样,我也搞不懂为什么一行乱码就能实现如此强大的功能,只能望洋兴叹,深感自己的渺小。
虽然现在仍然是菜鸟,但是现在看来,上面的代码却不再神秘,只不过是DOS汇编而已,正如qzwqzw在帖子中所言:
没有什么神秘可言
可执行程序是二进制文件文本文件也是二进制文件
它们本质上没有什么区别
in.com 程序的特殊性在于
所有的代码全部分布于ASCII码表的可显示字符范围中
当然这样的程序不是碰巧得到的
而是人为的构造出来的
其中需要用到许多技巧
比如最常见的中断调用代码int 21(CD 21)
因为不在ASCII可显示字符范围内
所以用到许多压栈、出栈、增减代码来构造
所以它的代码段是动态变化的
————————————————————
这样的代码被叫做 ASCODE
这样的技术被称作 ASCII Assemble
一门即将消失的技术
可想而知,这样的代码构造起来是困难的
在网上流传的ASCODE只有很少量的是人为构造的
—————————————————
因为已经有成熟的技术可以将任何二进制文件转变为ASCODE
这样的过程叫encode
而ASCODE执行的过程需要decode
合称codec
——————————————————————–
codec 的算法已知的超过4种
比较有名的应该是Herbert Kleebauer的算法
不过它要求原程序必须有org 170H的类似标记
因为前面的文件头被用来存放decode代码
————————————-
所有的这些信息可以从usenet中查找
当然也可以在google group中找到
访问Herbert Kleebauer的主页也是个不错的主意
ASCII Assembly技术的起源应该是在DOS那个年代。DOS系统中存在.com可执行文件格式,.com文件没有复杂的结构,只是纯粹的二进制代码,为ASCII Assembly的编写提供了很好的条件。
32位的Windows也提供了DOS虚拟机来运行.com文件,所以上面的代码在Windows下仍然可以运行,不过虚拟机和真正的DOS还是有一定区别的。
ASCII Assembly技术不仅可以用在批处理中,还有可以用来编写shellcode,下面的网站总结了每个可打印的ASCII字符所对应的汇编指令:
http://skypher.com/wiki/index.php/Hacking/Shellcode/Alphanumeric/x86_printable_opcodes
有了这张表,编写自己的ASCII Assembly并不困难,以下是我写的简单示例:
赞赏:: By Demon :: https://demon.tw @echo off echo,, P_0E^<0E^>$ 4?500501PZ5##5#+-!#https://demon.tw$>demon.com demon.com pause
微信赞赏支付宝赞赏
随机文章:
[…] « ASCII Assembly技术简介 […]