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

[其他] 【第三方】CAPI 注入版【1.2 1D910】

[复制链接]
发表于 2012-10-9 21:17:39 | 显示全部楼层
回复 45# defanive


    跳到自定义函数后ret? 求解释啊
 楼主| 发表于 2012-10-10 03:56:28 | 显示全部楼层
回复 46# garyng
嗯都是这样的,不是么
发表于 2012-10-10 12:10:05 | 显示全部楼层
回复 47# defanive


    我用的是笨方法啊,又学一招了,谢谢!
发表于 2012-10-11 20:42:33 | 显示全部楼层
求助一下这种方式为何内存会出现读取错误?
  1. @echo off
  2. ..\CAPI
  3. set CAPI=COM Init
  4. set CAPI=COM Create InternetExplorer.Application
  5. set obj=%CAPI_Ret%
  6. set CAPI=COM Method %obj% Navigate $about:blank
  7. set CAPI=COM PUT %obj% Visible ;1"
复制代码
执行obj.navigate("about:blank")时内存出错
 楼主| 发表于 2012-10-12 07:04:41 | 显示全部楼层
回复 49# 3dnowex
这个比较奇怪,我试了一下,IE对象的其他方法和属性调用都正常
但是Navigate和Navigate2调用会导致崩溃
原因暂时不明,正在研究中
发表于 2012-10-12 17:31:41 | 显示全部楼层
回复 50# defanive
在想bat是否能联合vbs通过这种方法做界面。
capi如果能自带一个调用函数,把其地址传给RegisterClass的参量WNDCLASS的lpfnWndProc,系统执行这个窗口消息处理函数的时候即跳入capi的内函数,capi开一个cmd新线程,将主动权bat指定的函数,执行到goto :EOF再次返回capi的内函数随后返回系统←不知这样是否可行呢?
 楼主| 发表于 2012-10-13 09:07:09 | 显示全部楼层
回复 51# 3dnowex
这正是我在开发手记里面说的那个想法,结果是失败了
一切都做得很正常,但是唯一的问题在于,新线程返回到旧的执行点的时候,会有问题
CMD不是用独立的内存保存批处理代码执行位置的,也就是说新线程的批处理代码执行位置会把旧线程的位置代替掉
所以说杯具了,尽管调用了新线程,但是没办法返回到之前执行的位置
PS 有另外一个新想法,正在试验中
发表于 2012-10-13 11:42:18 | 显示全部楼层
本帖最后由 netbenton 于 2012-10-13 11:56 编辑

有个提议,语法能不改成这样:
set /capi 返回变量名1=[功能] [参数1] [参数2]…… [参数N]<行结束符>  返回变量名2=[功能] [参数1] [参数2]…… [参数N]<行结束符>   返回变量名3=[功能] [参数1] [参数2]…… [参数N]<行结束符> …………返回变量名N=[功能] [参数1] [参数2]…… [参数N]<行结束符>

PS:
1.也就是返回值直接存到指定变量,并且,一个set /capi 执行了多行capi命令~;
这样不但可以提速,有些情况还可以免受干扰,对需要多个api调用才能成完成的功能,更是有利
甚至“返回变量名2” 做成可以直接是用户的内存地址,即有些临时的api调用,没必要存到cmd 的环境变量。

2.如果某个调用语句很长时用变量,拼接法即可:

set 语句= 返回变量名1=[功能] [参数1] [参数2]…… [参数N]<行结束符>
set 语句=%语句% 返回变量名2=[功能] [参数1] [参数2]…… [参数N]<行结束符>
set 语句=%语句% 返回变量名3=[功能] [参数1] [参数2]…… [参数N]<行结束符>
……
set /capi %语句% 返回变量名N=[功能] [参数1] [参数2]…… [参数N]<行结束符>
发表于 2012-10-13 12:34:22 | 显示全部楼层
netbenton的想法很好的说,但是如果set 的字串太多,也会影响效率的吧
 楼主| 发表于 2012-10-14 05:28:37 | 显示全部楼层
回复 53# netbenton
我很喜欢返回变量名的想法,但是暂时似乎没有办法做到
set语句的处理是在cmd内部进行的,处理完最后再调用SetEnvironmentVariableW
所以除非有办法找到处理set的代码位置,不然都没办法做任何处理
对于多行命令同时执行的话,我认为没什么必要
这种多个命令同时执行是普通第三方遗留下来的传统
普通的第三方是启动新进程,因此启动进程的时间远远大于实际执行代码的时间
所以说把多行代码合并在一起就可以省去启动进程的时间
但是CAPI是基于注入的,所以说实际上跳转到钩子函数的耗时基本上非常少(我本机测试,20000条set命令,加了钩子只比不加钩子慢了0.06s)
所以说这样对速度的提升并没有很显著的效果
直接set CAPI=xxx&set CAPI=yyy基本上就可以做到一样了(虽然看起来稍微难看一点)
返回变量名是一个很好的想法,以为很直接的省去了set xxx=%CAPI_Ret%这一行命令
但是杯具的是貌似没办法做成set /CAPI ret_var=xxx的语法
最多可以做成set CAPI=ret_var xxx,但是这样大改语法结构了
总之谢谢建议,对于CAPI的语法调用问题我还是觉得很蛋疼,已经尽量尝试做到最好了
目前大致的结构是set CAPI=[主类] [子类] [标识符][参数1] [标识符][参数2] ...
将命令分成主类和子类是为了减少程序员的记忆量,也让代码容易阅读
发表于 2012-10-14 13:26:48 | 显示全部楼层
回复 55# defanive
新手od断ReadConsole跟了下XP的cmd.exe下运行set /a,发现进入到4AD05A42处的内函数中有个字符串的比较(/a /p),这里是否能做些手脚实现set /capi或者set /c这样的功能呢?
 楼主| 发表于 2012-10-14 14:50:07 | 显示全部楼层
回复 56# 3dnowex
麻烦的在于不同版本的cmd函数地址也不一样,不方便做判断
cmd没有一个开放给外界的接口,很蛋疼 = =
感觉走到最后都只能走回API Hook的路上
 楼主| 发表于 2012-11-5 04:27:51 | 显示全部楼层
更新:1.2, Build 1D910, x32
发表于 2012-11-8 16:14:12 | 显示全部楼层
强!!
之前看到你的CAPI,就希望谁能做个 注入版,没想到真出来了
而且这么强大!!
发表于 2012-11-19 15:15:58 | 显示全部楼层
.很强大 ...有没有开源.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 01:44 , Processed in 0.020888 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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