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

[其他] 【讨论】CMD解释执行代码的流程

[复制链接]
发表于 2011-8-23 23:38:01 | 显示全部楼层
不怕苦不怕累。。。拿来OD,iDA ~~~Reverse
 楼主| 发表于 2011-8-24 16:50:11 | 显示全部楼层
这些是刚刚注入CMD进行API HOOK获得的数据
下了钩子的API有CreateFileW(用于打开文件),SetFilePointer(用于设置文件指针),ReadFileW(用于读取文件内容)
被注入的批处理代码为
  1. InlineHook
  2. set "a=^"
  3. echo a%a%
  4. b
  5. pause
复制代码
运行的结果为
E:\Batch\InjectCMD>InlineHook
        //CreateFileW,          FileName:E:\Batch\InjectCMD\a.bat, Return:68
        //SetFilePointer,       Handle:68, Distance:0xc, Method:0, Return:0xc
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0xc
        //ReadFileW,            Handle:68, ToRead:8191
        //SetFilePointer,       Handle:68, Distance:0x17, Method:0, Return:0x17
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x17
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x17

E:\Batch\InjectCMD>set "a=^"
        //CreateFileW,          FileName:E:\Batch\InjectCMD\a.bat, Return:68
        //SetFilePointer,       Handle:68, Distance:0x17, Method:0, Return:0x17
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x17
        //ReadFileW,            Handle:68, ToRead:8191
        //SetFilePointer,       Handle:68, Distance:0x22, Method:0, Return:0x22
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x22
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x22
        //ReadFileW,            Handle:68, ToRead:8191
        //SetFilePointer,       Handle:68, Distance:0x25, Method:0, Return:0x25
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x25
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x25

E:\Batch\InjectCMD>echo ab
ab
        //CreateFileW,          FileName:E:\Batch\InjectCMD\a.bat, Return:68
        //SetFilePointer,       Handle:68, Distance:0x25, Method:0, Return:0x25
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x25
        //ReadFileW,            Handle:68, ToRead:8191
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x2a
        //ReadFileW,            Handle:68, ToRead:8191
        //SetFilePointer,       Handle:68, Distance:0x0, Method:2, Return:0x2a
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x2a

E:\Batch\InjectCMD>pause
请按任意键继续. . .     //CreateFileW,          FileName:CONIN$, Return:15


分析数据可以获得以下的事实(或者是猜想?):
1、每次执行一句批处理前都会重新打开文件
2、读取不是以行为单位读取的
3、每次读取的最大长度是8191(除去\0结尾)
4、可以看到echo a%a%[回车换行]b这一句的时候读取了两次批处理,说明CMD已经发现了回车换行符被转义
5、似乎CMD的执行过程与我们想象的都不同

希望大家继续分析这些结果,如果有需要这个注入程序的可以找我要

评分

参与人数 1PB +10 技术 +2 收起 理由
CrLf + 10 + 2 好!追根溯源的新方向。

查看全部评分

 楼主| 发表于 2011-8-24 16:56:58 | 显示全部楼层
这一次注入的批处理内容为:
  1. InlineHook
  2. echo aaaa...(超过8192个a)
  3. pause
复制代码
得到的结果是
E:\Batch\InjectCMD>InlineHook
        //CreateFileW,          FileName:E:\Batch\InjectCMD\a.bat, Return:68
        //SetFilePointer,       Handle:68, Distance:0xc, Method:0, Return:0xc
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0xc
        //ReadFileW,            Handle:68, ToRead:8191
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x200b

        //ReadFileW,            Handle:68, ToRead:8191
        //SetFilePointer,       Handle:68, Distance:0x296b, Method:0, Return:0x2
96b
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x296b

        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x296b


E:\Batch\InjectCMD>echo aaaaaaaaaa...(很多a)
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa //CreateFileW,          FileName:E:\Batch\Inject
CMD\a.bat, Return:68
        //SetFilePointer,       Handle:68, Distance:0x296b, Method:0, Return:0x2
96b
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x296b

        //ReadFileW,            Handle:68, ToRead:8191
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x2970

        //ReadFileW,            Handle:68, ToRead:8191
        //SetFilePointer,       Handle:68, Distance:0x0, Method:2, Return:0x2970

        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x2970


E:\Batch\InjectCMD>pause
请按任意键继续. . .     //CreateFileW,          FileName:CONIN$, Return:15
 楼主| 发表于 2011-8-24 17:05:01 | 显示全部楼层
这似乎说明,CMD必须找到一个回车换行符才会停止继续读取批处理
但是到底是“找到一个回车换行符 -> 预处理 -> 若被转义继续找”还是“读取8191 -> 预处理 -> 若没找到未被转义的回车换行符则继续读取8191”
 楼主| 发表于 2011-8-24 17:31:03 | 显示全部楼层
这次注入的代码是获取换行符的代码
还没分析执行结果,大家帮忙看一下,说不定能明白CMD处理0D0A的方式
  1. InlineHook
  2. set CrLf=^


  3. pause
复制代码
执行结果
E:\Batch\InjectCMD>InlineHook
        //CreateFileW,          FileName:E:\Batch\InjectCMD\a.bat, Return:68
        //SetFilePointer,       Handle:68, Distance:0xc, Method:0, Return:0xc
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0xc
        //ReadFileW,            Handle:68, ToRead:8191
        //SetFilePointer,       Handle:68, Distance:0x18, Method:0, Return:0x18
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x18
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x18
        //ReadFileW,            Handle:68, ToRead:8191
        //SetFilePointer,       Handle:68, Distance:0x1a, Method:0, Return:0x1a
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x1a
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x1a
        //ReadFileW,            Handle:68, ToRead:8191
        //SetFilePointer,       Handle:68, Distance:0x1c, Method:0, Return:0x1c
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x1c
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x1c

E:\Batch\InjectCMD>set CrLf=

        //CreateFileW,          FileName:E:\Batch\InjectCMD\a.bat, Return:68
        //SetFilePointer,       Handle:68, Distance:0x1c, Method:0, Return:0x1c
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x1c
        //ReadFileW,            Handle:68, ToRead:8191
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x21
        //ReadFileW,            Handle:68, ToRead:8191
        //SetFilePointer,       Handle:68, Distance:0x0, Method:2, Return:0x21
        //SetFilePointer,       Handle:68, Distance:0x0, Method:1, Return:0x21

E:\Batch\InjectCMD>pause
请按任意键继续. . .     //CreateFileW,          FileName:CONIN$, Return:15
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 22:32 , Processed in 0.023733 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表