标题: [其他] 第三方命令CAPI:批处理调用API [打印本页]
作者: defanive 时间: 2011-8-28 21:54 标题: 第三方命令CAPI:批处理调用API
CAPI
By Defanive
1.0(VC++) 5.51KB
批处理调用API
比APICall功能要强很多,APICall可以退役了
CAPI的特性在于可以直接访问、操作批处理中的变量
提供3个基本方法:Put、Get、Call
参数的标识方式:
[标识][数据]
总共有如下的标识及其意义:- . 字节
- ; 短整型
- # 长整型
- $ 字符串
- * 变量
- ~ 已加密的变量
- @ 移动指针
复制代码
Put:
用于批处理变量中写入数据,基本语法为- CAPI Put [~][变量名] [标识][数据] [标识][数据]...
复制代码
其中变量名可加~标识,表示这是个被加密的变量
Put方法只能覆盖已有的数据,而不能增加
因此在写入前需保证有足够的空间
可用的标识为 . ; # $ * ~ @
下面的例子具体解释Put方法的用法- rem 将var变量的第一个字节覆盖为65
- CAPI Put var .65
- rem 将var变量的前两个字节覆盖为25105
- CAPI Put var ;25105
- rem 将var变量的前四个字节覆盖为4325441
- CAPI Put var #4325441
- rem 将var变量的值覆盖为ab
- CAPI Put var $ab
- rem 将var变量的值覆盖为var2变量的值
- CAPI Put var *var2
- rem 将var变量的值覆盖为被加密变量var2的原值
- CAPI Put var ~var2
- rem 可以同时执行多个参数,如将var变量的前两个字节覆盖为25105,再将第3个字节覆盖为65
- CAPI Put var ;25105 .65
- rem 将var变量的第一个字节覆盖为65,指针后移1位,将第3个字节覆盖为66
- CAPI Put var .65 @1 .66
复制代码
Put方法可以让批处理直接以字节等格式操作变量内容
可以直接产生特殊字符
Get:
将变量中的数据以一定格式输出,基本格式为- CAPI Get [~][变量名] [标识][长度] [标识][长度]...
复制代码
如下例- rem 将var变量中的前两个字节输出
- CAPI Get var .2
复制代码
类似用法参见Put方法
可用的标识为 . ; # $ @
Call:
调用API,基本格式为- CAPI Call [Dll名] [API名] [标识][数据] [标识][数据]...
复制代码
errorlevel为API的执行返回值
可用的标识为 # $ * ~
注意,CAPI是以Unicode方式调用和储存值的(为了兼容cmd中的变量储存方式)
因此API应选用Unicode版
使用~进行加密变量内容是为了防止API执行结果中含有\0(这样会中断变量内存块,使得CMD出错)
2L展示几个简单的API应用
http://bcn.bathome.net/s/tool/index.html?key=CAPI
作者: defanive 时间: 2011-8-28 22:48
本帖最后由 defanive 于 2011-8-28 23:04 编辑
一些简单的例子
获得CMD的句柄- @echo off
- CAPI Call kernel32 GetConsoleWindow
- echo %errorlevel%
- pause
复制代码
闪烁CMD窗口- @echo off
- CAPI Call kernel32 GetConsoleWindow
- set hCMD=%errorlevel%
- CAPI Call user32 FlashWindow #%hCMD% #1
- pause
复制代码
计算字符串长度- @echo off
- set str=Defanive
- CAPI Call kernel32 lstrlenW $%str%
- echo %errorlevel%
- pause
复制代码
计算字符串长度2(这样可以保留特殊字符)- @echo off
- set str=Defanive
- CAPI Call kernel32 lstrlenW *str
- echo %errorlevel%
- pause
复制代码
获得鼠标的坐标- @echo off
- set pos=xxxxyyyy
- CAPI Call user32 GetCursorPos ~pos
- CAPI Get ~pos #2
- pause
复制代码
综合例子,获取3秒后鼠标所指的窗口标题(或内容)- @echo off
- setlocal enabledelayedexpansion
- set Pos=00000000
- echo 3秒后获得鼠标所指的窗口标题
- CAPI Call kernel32 Sleep #3000
- CAPI Call user32 GetCursorPos ~Pos
- for /f "tokens=1,2" %%a in ('CAPI Get "~Pos" "#2"') do set /a "X=%%a","Y=%%b"
- CAPI Call user32 WindowFromPoint #%X% #%Y%
- set hWnd=%errorlevel%
- echo 窗口句柄:%hWnd%
- CAPI Call user32 SendMessageW #%hWnd% #14 #0 #0
- set Length=%errorlevel%
- echo 标题长度:%Length%
- if "%Length%"=="0" echo 该窗口没有标题&pause&goto :eof
- for /l %%a in (1,1,%Length%) do set "Title=!Title! "
- set /a Length+=1
- CAPI Call user32 SendMessageW #%hWnd% #13 #%Length% *Title
- echo 窗口标题:!Title!
- pause
复制代码
通过API可以让批处理变得更强大
API编程相关可以在网上查找资料学习
作者: cjiabing 时间: 2011-8-29 01:30
虽然对传说中的ApI一无所知,但重要性不言而喻,LZ的神作让我等看到了批处理更遥远的图景,这或许就是新大陆!
作者: sl543001 时间: 2011-8-29 09:47
好东西,必须顶起
作者: caruko 时间: 2011-8-31 10:59
本帖最后由 caruko 于 2011-8-31 11:40 编辑
这个是好东西啊,顶起....
如果 字符变量带有 空格 ,加上引号会出错吗?
$"a b c" 还是 "$a b c" ?
作者: defanive 时间: 2011-8-31 12:19
回复 5# caruko
应该是后者的用法
作者: caruko 时间: 2011-8-31 17:38
我觉得,应该在 程序结束时,用一个开关来选择“释放 API句柄” 或者“不释放API句柄”
这样应用范围就更广了。
作者: defanive 时间: 2011-8-31 18:51
回复 7# caruko
有些API句柄只能是在进程运行时的,进程销毁后句柄也被销毁
要让API执行的结果能够完整保留,除非注入到CMD执行或者常驻进程
两个方案的可行性都不佳。。。
作者: caruko 时间: 2011-9-1 08:47
我有考虑过,注入一个DLL到CMD进程中,然后监视进程中的某个特定变量的值来决定执行什么命令。
这样跟变量的结合就更紧密,不知道有没可行性。
比如 注入一个线程,循环读取 %usercmdline% 变量,如果 %usercmdline% 变量的值等于"play d"\a.mp3"就播放MP3,等于"stop"就停止,等于"exit"就退出线程。
作者: defanive 时间: 2011-9-1 15:01
回复 9# caruko
这个我已经做到了,但是注入过程非常容易被报毒
作者: moonbeam 时间: 2011-10-27 09:17
win7 X64下不能运行:“应用程序无法正常启动(0xc0000018)。”
作者: netbenton 时间: 2012-1-5 12:58
我有方案了,3方起动后,隐藏运行,监听cmd的一个变量,有变化则读取命令去执行。把结果以消息方式返回数据。CMD方用set/p back=,接收反回数据。这样就不会报毒了
作者: defanive 时间: 2012-1-6 13:04
回复 12# netbenton
应该可行,但是速度怎么样就不知道了。。感觉set /p不会快,执行大的循环的话效率自然就下去了。。
作者: 931805085 时间: 2012-1-19 15:29
好东西,一定得顶,不顶可惜啊
作者: clonecd 时间: 2012-5-16 21:44
一个神一样的作品啊。
作者: xie 时间: 2012-9-11 19:33
类似的东东 http://bathome.net/thread-18958-1-1.html
作者: defanive 时间: 2012-9-13 11:31
回复 16# xie
CAPI我做了一个dll注入的版本,成品做好很久了,但是一直都没时间发上来
由于是在cmd进程里面执行的代码,所以可以做GDI绘图等等。。
作者: xie 时间: 2012-9-13 12:26
回复 17# defanive
注入容易被报毒...
作者: defanive 时间: 2012-9-13 13:09
回复 18# xie
新方法做的被杀率比较低,貌似就只有几款国外的杀出来。。
看使用者意愿,自己权衡使用
作者: flaven 时间: 2013-3-4 20:38
新手不知道这个有什么用……但是看上去很强大,还需要好好学习,不知道开发者有没有官网?
作者: cy97cool 时间: 2014-12-8 22:52
要是大神能把C++的源代码分享一下 成为开源项目就好了。。。
期待 啊~
作者: LJY4.0 时间: 2022-5-5 10:06
提示应用程序错误,按确定退出
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |