Board logo

标题: [其他] ascode 应用之 获取输入字符 getch.com [打印本页]

作者: CrLf    时间: 2012-11-30 15:01     标题: ascode 应用之 获取输入字符 getch.com

本帖最后由 CrLf 于 2012-12-23 15:15 编辑

方案一,关键代码为 ,HP_4Y0EZ0Eb508-00,!5D35Dw,!,内嵌于代码中使用,代码短,但其中的特殊字符需视情况转义:
  1. @echo off
  2. echo>getch.com ,HP_4Y0EZ0Eb508-00,!5D35Dw,! //getch.com 内嵌方案
  3. getch
  4. rem 生成并调用 getch.com
  5. echo %errorlevel%
  6. del /f getch.com>nul
  7. rem 删除 getch.com
  8. pause
复制代码
方案二,关键代码为 ::,HP_4Y0E\0Ed508-00,!5D35Dw,!,代码稍长,既可位于头部标签也可内嵌使用,更通用:
  1. ::,HP_4Y0E\0Ed508-00,!5D35Dw,! //getch.com 标签头方案
  2. @echo off
  3. type %0>getch.com&&getch
  4. rem 生成并调用 getch.com
  5. echo %errorlevel%
  6. del /f getch.com>nul
  7. rem 删除 getch.com
  8. pause
复制代码
实例:
  1. @echo off&chcp 437|GRAFTABL>nul 936
  2. echo 输入任意字符,获取 asc 在%%errorlevel%% 中
  3. echo;
  4. echo>getch.com ,HP_4Y0EZ0Eb508-00,!5D35Dw,! //在这个示例中,使用的是内嵌方案
  5. getch
  6. echo ASC = %errorlevel%
  7. for /f "tokens=* delims=0" %%a in ("%=exitcode%") do echo HEX = 0x%%a
  8. echo CHR = %=exitcodeascii%
  9. pause
复制代码
汇编原型其实只有 8 字节,作用是获取一个输入字符,并从退出码中返回该字符的 asc:
  1. mov ah,8
  2. int 21
  3. mov ah,4c
  4. int 21
复制代码
但为了让所有字节都在 0x20-0x7f 范围内以便写入 bat 使用,所以长度被扩到了 30 字节上下,不知哪位有办法再压缩下。
作者: plp626    时间: 2012-12-4 23:04

不错,
想起一个问题,为什么more chcp mode 这些命令也是.com, 但是启动后却不会改变当前代码页,很有意思。。
作者: CrLf    时间: 2012-12-4 23:11

本帖最后由 CrLf 于 2012-12-6 16:12 编辑

回复 2# plp626


    反汇编 chcp.com 入口点下一行看到  push        01001190,就不用向下看了,那货是 32位的 exe 挂个 com 的名,俩后缀通用的。
    话说我更好奇的是,为什么 exe 保存为 bat 也可运行?cmd 怎么进行区分的?(召唤大神 demon...)

    就知道老兄会感兴趣,有没兴趣一起玩?暂时还不想谋杀脑细胞挑战复杂运算,回头继续抖代码,碰到些障碍和疑惑,求大神 qzw 火力支援
作者: Demon    时间: 2012-12-5 00:08

回复  plp626


    其实那货是 exe,俩后缀通用的。
    话说我更好奇的是,为什么 exe 保存为 bat 也 ...
CrLf 发表于 2012-12-4 23:11



查注册表exe com bat都是%1 %*

应该是由系统识别的,至于具体怎么识别我也不知道。
作者: BAT-VBS    时间: 2012-12-5 10:24

exe、com这些可执行文件是不是通过本身的十六进制编码识别的啊?
比如你用Ultra Edit查看一个文件的十六进制编码
作者: broly    时间: 2012-12-23 19:22

本帖最后由 broly 于 2012-12-23 19:34 编辑

回复 4# Demon


    我觉得是这样的:

1.双击一个文件,系统首先会查找注册表信息。
这里查到的是%1 %*的意思就是直接执行,不需要解析器。

2.bat com exe都是直接执行的,系统PE装载器开始识别文件的PE头结构。
(有关PE头文件的知识不懂的朋友可以网上找资料)
通过PE头可以判断时候为可执行文件,并判断其子系统类型。
_IMAGE_OPTIONAL_HEADER 结构的 Subsystem 项可以判断在DOS、WIN32、windows控制台等子系统下运行。
http://msdn.microsoft.com/ZH-CN/library/windows/desktop/ms680339(v=vs.85).aspx)
用UE之类的软件打开可执行文件,会发现有This program cannot be run in DOS mode 一类的文字,其实就是PE头的一些信息

3.如果把BAT文件后缀改为EXE,则这不是一个有效的PE文件,启动NTVDM进程把文本内容当作指令进行解析。
把EXE改为BAT,同样是%1 %*,也就是直接执行的,系统加载其PE头发现是可执行文件,则系统调用CreateProcess,加载程序进入内存。
作者: broly    时间: 2012-12-23 19:58

本帖最后由 broly 于 2012-12-23 20:09 编辑

刚才把思路理了一下,补充6楼。

1.系统读注册表,找文件启动方式。

2.exe  bat  com是直接启动类型的。
系统加载其pe。

3.若是可执行文件也直接创建进程运行之。
若不是有效PE且后缀为bat,则创建cmd进程进行解析。
若不是有效PE且后缀为exe,则创建进程ntvdm进程进行解析。
com没有试不清楚
作者: CrLf    时间: 2012-12-24 00:16

回复 7# broly


    话说我现在才知道 com 也是有 pe 的,刚 cd %comspec%\..&debug edit.com 观察了下,我勒个擦擦!还啥都没运行呢,刚载入的 edit.com 的 ds cs ip 神马的竟然被改了,作为一个纯种 com,它是怎么做到的。。
作者: Demon    时间: 2012-12-24 16:01

比你的小3字节
  1. @echo off
  2. echo,, P_0E30E50E75!!5!)-!TL-!>getch.com
  3. getch.com
  4. echo %errorlevel%
  5. pause
复制代码

作者: Demon    时间: 2012-12-27 02:13

回复  broly


    话说我现在才知道 com 也是有 pe 的,刚 cd %comspec%\..&debug edit.com 观察了下, ...
CrLf 发表于 2012-12-24 00:16


com是没有文件头的,edit.com其实是exe,用十六进制打开可以看到前两个字节是MZ

http://en.wikipedia.org/wiki/DOS_MZ_executable
作者: CrLf    时间: 2012-12-27 04:42

本帖最后由 CrLf 于 2012-12-27 04:47 编辑

回复 10# Demon


    噢,有点糊涂,这说明 16 位系统其实也有 exe 呢?还是说这个 edit.com 其实不是 dos 下那个?
作者: Demon    时间: 2012-12-27 12:33

本帖最后由 Demon 于 2012-12-27 12:38 编辑
回复  Demon


    噢,有点糊涂,这说明 16 位系统其实也有 exe 呢?还是说这个 edit.com 其实不是 do ...
CrLf 发表于 2012-12-27 04:42


为什么16位系统没有exe?

edit.com是不是dos下的那个我不知道,我只知道它是DOS MZ executable格式,而不是Portable Executable格式。

两种格式不一样,操作系统根据exe的格式来判断它是DOS程序还是Win程序。

而com是纯机器码,没有文件头。
作者: qzwqzw    时间: 2012-12-27 13:14

话说最近楼主的ASCODE成果很多啊
edit.com根据OS的变化变化过多次
但是大致上有两个大版本
在MSDOS6.22以及以前的MSDOS中
edit.com的最新版本是V1.1
都是纯COM格式的可执行文件
在MSDOS7.1/Win95之后
edit.com升级为V2.0
就变成了16位的MZ-EXE格式的可执行文件
在XP下仍然如此
所以打开edit.com会打开ntvdm虚拟机

exe的格式确实有很多
MZ/NE/LE/PE/LX等
不过常见的也就是MZ和PE两种

另外值得一提的是
除了极个别的例外
PE是兼容MZ格式的
也就是说常规的PE格式32位程序
是可以在16位的DOS环境下运行的
我们看到的“This program cannot be run in DOS mode”提示
就是PE程序在DOS下的运行结果
也就是说它在DOS下输出了一行字
这段提示位于PE程序的MZ区
这个区段的代码是可以自行定义的
很多windows的程序就做了自定义
比如win9x下的regedit.exe
就可以在DOS下对注册表进行备份恢复操作
还有比如win9x下的xcopy.exe程序等等

进入xp之后此类双栖程序没有再发现了
可能是因为win9x还是16/32位混合运行环境
而2k/xp/03等已经是纯32位运行环境
所以此类程序也就完成历史使命了




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2