返回列表 发帖

[其他] 第三方命令CAPI:批处理调用API

CAPI
By Defanive
1.0(VC++) 5.51KB
批处理调用API

比APICall功能要强很多,APICall可以退役了
CAPI的特性在于可以直接访问、操作批处理中的变量

提供3个基本方法:Put、Get、Call

参数的标识方式:
[标识][数据]
总共有如下的标识及其意义:
.  字节
;  短整型
#  长整型
$  字符串
*  变量
~  已加密的变量
@  移动指针COPY
Put:
用于批处理变量中写入数据,基本语法为
CAPI Put [~][变量名] [标识][数据] [标识][数据]...COPY
其中变量名可加~标识,表示这是个被加密的变量
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 .66COPY
Put方法可以让批处理直接以字节等格式操作变量内容
可以直接产生特殊字符

Get:
将变量中的数据以一定格式输出,基本格式为
CAPI Get [~][变量名] [标识][长度] [标识][长度]...COPY
如下例
rem 将var变量中的前两个字节输出
CAPI Get var .2COPY
类似用法参见Put方法
可用的标识为 . ; # $ @

Call:
调用API,基本格式为
CAPI Call [Dll名] [API名] [标识][数据] [标识][数据]...COPY
errorlevel为API的执行返回值
可用的标识为 # $ * ~

注意,CAPI是以Unicode方式调用和储存值的(为了兼容cmd中的变量储存方式)
因此API应选用Unicode版
使用~进行加密变量内容是为了防止API执行结果中含有\0(这样会中断变量内存块,使得CMD出错)

2L展示几个简单的API应用

http://bcn.bathome.net/s/tool/index.html?key=CAPI
3

评分人数

    • sl543001: 加油技术 + 1
    • raymai97: 强,才5.51kb就能实现这些功能,加油!技术 + 1
    • batman: 神品出世了,批的春天来了PB + 30 技术 + 1
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

本帖最后由 defanive 于 2011-8-28 23:04 编辑

一些简单的例子

获得CMD的句柄
@echo off
CAPI Call kernel32 GetConsoleWindow
echo %errorlevel%
pauseCOPY
闪烁CMD窗口
@echo off
CAPI Call kernel32 GetConsoleWindow
set hCMD=%errorlevel%
CAPI Call user32 FlashWindow #%hCMD% #1
pauseCOPY
计算字符串长度
@echo off
set str=Defanive
CAPI Call kernel32 lstrlenW $%str%
echo %errorlevel%
pauseCOPY
计算字符串长度2(这样可以保留特殊字符)
@echo off
set str=Defanive
CAPI Call kernel32 lstrlenW *str
echo %errorlevel%
pauseCOPY
获得鼠标的坐标
@echo off
set pos=xxxxyyyy
CAPI Call user32 GetCursorPos ~pos
CAPI Get ~pos #2
pauseCOPY
综合例子,获取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!
pauseCOPY
通过API可以让批处理变得更强大
API编程相关可以在网上查找资料学习
2

评分人数

    • sl543001: 加油技术 + 1
    • CrLf: 赞一个,很黄很暴力!PB + 10 技术 + 2
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

回复 5# caruko
应该是后者的用法
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

回复 7# caruko
有些API句柄只能是在进程运行时的,进程销毁后句柄也被销毁
要让API执行的结果能够完整保留,除非注入到CMD执行或者常驻进程
两个方案的可行性都不佳。。。
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

回复 9# caruko
这个我已经做到了,但是注入过程非常容易被报毒
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

回复 12# netbenton
应该可行,但是速度怎么样就不知道了。。感觉set /p不会快,执行大的循环的话效率自然就下去了。。
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

回复 16# xie
CAPI我做了一个dll注入的版本,成品做好很久了,但是一直都没时间发上来
由于是在cmd进程里面执行的代码,所以可以做GDI绘图等等。。
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

回复 18# xie
新方法做的被杀率比较低,貌似就只有几款国外的杀出来。。
看使用者意愿,自己权衡使用
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

返回列表