最近想偷个懒调用按键精灵(按键精灵9)的DLL 结果发现DllRegisterServer失败,然后开始下面研究!
而可以自己写个DLL,让按键精灵去创建好插件对象,然后作为参数传递到你的DLL中,可以发现这玩意其实就是个COM组件。这个对象可以任意使用!
按键精灵官方的DLL插件,有没有办法去除只能用于按键精灵中
后来经过一番调查,好像按键官方会给插件作者一个签名工具,这玩意就是对DLL做一些修改,让其他语言不能以常规的方式注册和调用!
用OD跟踪,按键精灵会在主线程启动时创建2个对象“QMDispatch.QMLibrary.Inner”“QMDispatch.QMLibrary”
在注册表里找到分别定位到:按键精灵主程序(EXE)或者小精灵 和 “C:\Users\Administrator\AppData\Roaming\qmacro\qdisp.dll”。
用空白文件只读替换掉“qdisp.dll”将不能正常运行小精灵!插件也不能正常使用,说明这个“QMDispatch.QMLibrary”有这关键作用!(估计是处理变量用的)
然后用按键精灵来“Set a = CreateObject("QMPlugin.Bkgnd")”,发现在按键精灵中能正常创建,但在VBS,VB中提示“自动化类型失败”
用OD跟踪这段语句(别以为按键精灵就不能跟,它的代码还是会送到vbscript.dll执行)它注册之后创建对象是先ole32.CLSIDFromProgIDEx然后ole32.CoGetClassObject(其他的我不是看的很明白)
以我的理解,按键精灵就是个虚拟机,将VBS字符加密储存。运行时送给翻译器解密并加工 然后再次给vbscript.dll翻译执行。
也就是说按键精灵对DLL做了一些特殊修改。而创建对象应该是自己实现了这个特殊的“CreateObject”
由此,可以看出按键精灵对COM组件的调用原理理解的还是比较深的。那么我们是不是也能做出只有自己才能调用COM组件出来?我们又又什么办法来调用按键精灵DLL?本人功力不够,看看有没有人帮忙研究出其中门道
.版本 2
.程序集 主窗口程序集
.程序集变量 已注册子程序内存数据地址, 整数型
.程序集变量 已注册子程序地址, 整数型
.程序集变量 是否已经注册, 逻辑型
.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行
置错误提示管理 (&错误提示管理_)
已注册子程序地址 = 到数值 (&子程序1)
已注册子程序内存数据地址 = lstrcpyn (已注册子程序地址, 已注册子程序地址, 0)
载入 (窗口_主窗口, , 假)
返回 (0) ' 可以根据您的需要返回任意数值
.子程序 错误提示管理_, 逻辑型, , 本命令用来设置当运行时如果产生了导致程序崩溃的严重错误时用来对该错误进行详细提示的子程序地址,如果未进行此项设置,发生严重错误时运行时环境将自动提示该错误的详细信息并直接退出
.参数 错误代码, 整数型, , 用作接收错误代码
.参数 错误文本, 文本型, , 用作接收详细错误文本
' 该子程序必须返回一个逻辑值,返回真表示已经自行处理完毕,系统将不再显示该错误信息,返回假表示由系统来继续显示该错误信息。以上设置必须完全正确,否则结果不能预测,另外,还请注意以下几点: 1、该错误提示子程序不要再引发新的错误; 2、在进入该错误提示子程序后,系统将自动关闭事件消息通知处理机制,也就是说任何事件将无法得到响应; 3、无论如何,当该子程序调用退出后,系统将自动将整个应用程序关闭。 如果省略本参数,系统将恢复错误提示的默认处理方
信息框 (“程序出错!” + #换行符 + “错误代码: 00000” + 到文本 (错误代码), #信息图标, “友情提示”)
返回 (真)
.子程序 FF25_, 整数型
.参数 内存地址, 整数型, , 存放调用子程序地址数据的内存地址
返回 (CallWindowProcA ({ 255, 37 } + 到字节集 (内存地址), 0, 0, 0, 0)) ' JMP DS:
.子程序 _按钮2_被单击
是否已经注册 = 真 ' 假设已经被爆
.如果真 (是否已经注册)
FF25_ (已注册子程序内存数据地址)
.如果真结束
.子程序 _按钮1_被单击
时钟1.时钟周期 = 120
.子程序 子程序1
信息框 (“已经注册”, 0, )
.子程序 子程序2
信息框 (“暗桩”, 0, )
.子程序 _时钟1_周期事件
是否已经注册 = 假 ' 这里表示没能通过注册
.如果 (是否已经注册)
.否则
已注册子程序地址 = 到数值 (&子程序2)
.如果结束
- 上一篇:联系我们
- 下一篇:易语言与Mysql结合写的网络验证