[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 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 字节上下,不知哪位有办法再压缩下。
1

评分人数

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

回复 2# plp626


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

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

TOP

回复 7# broly


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

TOP

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

回复 10# Demon


    噢,有点糊涂,这说明 16 位系统其实也有 exe 呢?还是说这个 edit.com 其实不是 dos 下那个?

TOP

返回列表