标题: [其他] ascode 应用之 获取输入字符 getch.com [打印本页]
作者: CrLf 时间: 2012-11-30 15:01 标题: ascode 应用之 获取输入字符 getch.com
本帖最后由 CrLf 于 2012-12-23 15:15 编辑
方案一,关键代码为 ,HP_4Y0EZ0Eb508-00,!5D35Dw,!,内嵌于代码中使用,代码短,但其中的特殊字符需视情况转义:- @echo off
-
- echo>getch.com ,HP_4Y0EZ0Eb508-00,!5D35Dw,! //getch.com 内嵌方案
- getch
- rem 生成并调用 getch.com
-
- echo %errorlevel%
- del /f getch.com>nul
- rem 删除 getch.com
-
- pause
复制代码
方案二,关键代码为 ::,HP_4Y0E\0Ed508-00,!5D35Dw,!,代码稍长,既可位于头部标签也可内嵌使用,更通用:- ::,HP_4Y0E\0Ed508-00,!5D35Dw,! //getch.com 标签头方案
- @echo off
-
- type %0>getch.com&&getch
- rem 生成并调用 getch.com
-
- echo %errorlevel%
- del /f getch.com>nul
- rem 删除 getch.com
-
- pause
复制代码
实例:- @echo off&chcp 437|GRAFTABL>nul 936
- echo 输入任意字符,获取 asc 在%%errorlevel%% 中
- echo;
-
- echo>getch.com ,HP_4Y0EZ0Eb508-00,!5D35Dw,! //在这个示例中,使用的是内嵌方案
- getch
-
- echo ASC = %errorlevel%
- for /f "tokens=* delims=0" %%a in ("%=exitcode%") do echo HEX = 0x%%a
- echo CHR = %=exitcodeascii%
- pause
复制代码
汇编原型其实只有 8 字节,作用是获取一个输入字符,并从退出码中返回该字符的 asc:- mov ah,8
- int 21
- mov ah,4c
- 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字节- @echo off
- echo,, P_0E30E50E75!!5!)-!TL-!>getch.com
- getch.com
- echo %errorlevel%
- 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 |