Board logo

标题: [其他] 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% 变量了
  1. @echo off
  2. echo>getc.com ,RP_4P0E`0Eb@@3!= //getc.com 内嵌方案
  3. for /f "delims=" %%a in ('"getc&getc&getc&getc&getc&getc&getc&getc"') do (
  4.    echo 您输入的是 "%%a"
  5. )
  6. rem 等待输入,直到接收了 8 个字节,返回给 cmd
  7. rem 生成并调用 getc.com
  8. del /f getc.com>nul
  9. rem 删除 getch.com
  10. pause
复制代码
debug 汇编指令:
  1. debug getc.com
  2. a
  3. sub al,52
  4. push ax
  5. pop di
  6. xor al,50
  7. xor [di+60],al
  8. xor [di+62],al
  9. inc ax
  10. inc ax
  11. db 33 21 3d
  12. rcx
  13. 11
  14. w
  15. q
复制代码
汇编原型:
  1. mov ah,1
  2. int 21
  3. ret
复制代码
-------------------------------------------------------------
另附仅长 11 个字节的精简版:
  1. @echo off
  2. for /f "delims=U" %%a in ('cmd /u /c echo 唉')do set "Tab字符=%%a"
  3. rem 因为论坛会把 Tab 字符变成空格,所以这里先把它保存在变量中
  4. echo VX0L%Tab%..瓮廾>getc.com
  5. rem 实际长度为 11 个字节
  6. for /f "delims=" %%a in ('getc.com') do echo Char="%%a"
  7. 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