ASCII Assembly技术简介

标签: , , , ,

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
:: http://demon.tw
@echo off
echo,, P_0E^<0E^>$ 4?500501PZ5##5#+-!#http://demon.tw$>demon.com
demon.com
pause

随机文章:

  1. 批处理技术内幕:Unicode
  2. WriteFile,WriteConsole和_tprintf的一些差别
  3. VBS显示桌面
  4. WordPress判断用户是否登录
  5. 批处理技术内幕:重定向与管道

一条评论 发表在“ASCII Assembly技术简介”上

  1. […] « ASCII Assembly技术简介 […]

留下回复