返回列表 发帖

[其他] ascode 应用之 获取输入字符 getc.com

本帖最后由 CrLf 于 2014-11-23 18:03 编辑

getc.com 和功能相似的 getch.com 的区别在于 getc.com 把接收的字符显示在 StdIn 中,而不通过返回值与 cmd 交互
好处是更直观和简短,缺点是这样就不能使用返回值特有的 %=ExitCode% %=ExitCodeAscii% 变量了
@echo off
echo>getc.com ,RP_4P0E`0Eb@@3!= //getc.com 内嵌方案
for /f "delims=" %%a in ('"getc&getc&getc&getc&getc&getc&getc&getc"') do (
   echo 您输入的是 "%%a"
)
rem 等待输入,直到接收了 8 个字节,返回给 cmd
rem 生成并调用 getc.com
del /f getc.com>nul
rem 删除 getch.com
pauseCOPY
debug 汇编指令:
debug getc.com
a
sub al,52
push ax
pop di
xor al,50
xor [di+60],al
xor [di+62],al
inc ax
inc ax
db 33 21 3d
rcx
11
w
qCOPY
汇编原型:
mov ah,1
int 21
retCOPY
-------------------------------------------------------------
另附仅长 11 个字节的精简版:
@echo off
for /f "delims=U" %%a in ('cmd /u /c echo 唉')do set "Tab字符=%%a"
rem 因为论坛会把 Tab 字符变成空格,所以这里先把它保存在变量中
echo VX0L%Tab%..瓮廾>getc.com
rem 实际长度为 11 个字节
for /f "delims=" %%a in ('getc.com') do echo Char="%%a"
pauseCOPY

Great job!
既然新开一贴了,干脆延伸一下,说说ascode的基本思路吧。

TOP

本帖最后由 CrLf 于 2014-11-25 16:46 编辑

回复 2# amwfjhh


看此贴5楼:
http://bbs.bathome.net/redirect. ... 0&fromuid=30406

TOP

本帖最后由 yiwuyun 于 2014-11-25 07:38 编辑

能不能把debug解释一下,好多年没看了,忘完了。它是调用21号中断实现输入吗?db 33 21 3d
是哪个指令?是不是就是调用中断的指令。为何不直接写中断。
直接不支持64位系统啊。重写个64位的内嵌吧。

TOP

汇编各种看不懂

TOP

回复 4# yiwuyun


引用 qzw 大神的说法:

所有的代码全部分布于ASCII码表的可显示字符范围中

当然这样的程序不是碰巧得到的

而是人为的构造出来的

其中需要用到许多技巧

比如最常见的中断调用代码int 21(CD 21)

因为不在ASCII可显示字符范围内

所以用到许多压栈、出栈、增减代码来构造

所以它的代码段是动态变化的

————————————————————

这样的代码被叫做 ASCODE

这样的技术被称作 ASCII Assemble

一门即将消失的技术

可想而知,这样的代码构造起来是困难的

在网上流传的ASCODE只有很少量的是人为构造的


所以它的作用是把 16 位程序变换成只含可见字符的字符串
详见 3 楼链接中的解释,应该足够详细
64位系统不支持16位汇编,而 32 位汇编的文件头无法处理成 ascode,不过有别的办法可以实现相似功能,比如 plp 的批处理获取所有字节,或者 adodb.stream,等等
事实上,xp 的 64 位系统比较少,vista 以上都带有 powershell,可以简单实现 ascode 的许多功能

TOP

返回列表