标题: [其他] ascode 应用之 获取输入字符 getc.com [打印本页]
作者: CrLf 时间: 2014-11-22 23:14 标题: 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
-
- pause
复制代码
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
- q
复制代码
汇编原型:复制代码
-------------------------------------------------------------
另附仅长 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"
- pause
复制代码
作者: amwfjhh 时间: 2014-11-22 23:57
Great job!
既然新开一贴了,干脆延伸一下,说说ascode的基本思路吧。
作者: CrLf 时间: 2014-11-23 02:05
本帖最后由 CrLf 于 2014-11-25 16:46 编辑
回复 2# amwfjhh
看此贴5楼:
http://bbs.bathome.net/redirect. ... 0&fromuid=30406
作者: yiwuyun 时间: 2014-11-25 07:17
本帖最后由 yiwuyun 于 2014-11-25 07:38 编辑
能不能把debug解释一下,好多年没看了,忘完了。它是调用21号中断实现输入吗?db 33 21 3d
是哪个指令?是不是就是调用中断的指令。为何不直接写中断。
直接不支持64位系统啊。重写个64位的内嵌吧。
作者: 极品小猫 时间: 2014-11-25 10:04
汇编各种看不懂
作者: CrLf 时间: 2014-11-25 17:21
回复 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 的许多功能
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |