Autohotkey使用大漠插件

最近想要使用Autohotkey找多色,用ahk实现了个不过效率实在太低,想着用现成的大漠插件来搞定,所以琢磨了下。

前文

大漠插件网上能比较容易找到的一般就两个版本:

  • 3.1.1233 (直接可以使用)
  • 5.1413 (需要破解注册)

本机上3.1.1233直接被ESET杀了,所以使用5.1413,但是需要注册。

网上的破解补丁都是易语言或者按键精灵的,观察了一下按键精灵的补丁插件发现是COM实现的,所以尝试用Autohotkey来直接调用该插件,结果失败。

网上找到个帖子说了破解方法,就直接用C++实现了个:

lzq91514 发表于 2016-12-8 19:35
内存.写整数 (进程_取自进程ID (), 十六转十进制 (读模块基址 (进程_取自进程ID (), “dm.dll”)) + 十六转十进制 (“1063D0”), 1, )

破解补丁

dmcrack.h

dmcrack.cpp

编译成dll放置到dm.dll同目录下,搞定这些之后就可以在Autohotkey中使用大漠插件了:

dm.test.ahk

相关问题

在Initialize标签中ComObjCreate出来的对象可以在其他标签中使用但是无法在函数中使用,得加Global dm。

其次看大漠插件的手册,其中有一些带变参指针函数,如果直接使用无法得到返回值,得使用ComVar(ComVar以及相关函数可以从参考链接中获取)来传递引用:

xpos := ComVar(), ypos := ComVar()
xpos[] := 0, ypos[] := 0
ret := dm.GetCursorPos(xpos.ref, ypos.ref)
OutputDebug % ret "," xpos[] "," ypos[]

Autohotkey调试

使用OutputDebug输出信息然后使用DebugView工具插件输出内容。如果想单步调试的话可以用AutoGUI,它有个Variables功能可以看到所有变量以及类型,十分方便。

参考链接:

https://www.52pojie.cn/thread-562114-1-1.html
https://autohotkey.com/boards/viewtopic.php?t=4827
https://ahkcn.github.io/docs/commands/ComObjActive.htm

转载请注明: 本文《Autohotkey使用大漠插件》来源于bstaint的博客

28 条评论:

  1. 请问一下,编译出来的dmcrack.exe 无法在windows 10 系统上执行,要如何解决呢

    回复删除
  2. 编译出来是dmcrack.dll,是需要用Autohotkey调用的,不是直接执行的。

    回复删除
  3. 谢谢答复,那看起来编译出exe 是我的编译方式出了问题呢

    回复删除
  4. 你是用什么编译的,如果是msvc的话可以用cl /LD dmcrack.cpp编译成dll。

    回复删除
  5. 啊哈哈哈,我是照着一些教程用vs-code编译的,谢谢你的指引。

    回复删除
  6. 你好,请问一下

    我编译出来的可以在自己这台电脑上使用,换电脑就不能识别和运行了

    电脑需要安装什么依赖吗

    回复删除
  7. 你说的不能识别和运行是指什么,有可能你是以Debug模式编译的,换成Release试试。

    回复删除
  8. 是,我在笔记本上编译了dll,参考写了测试脚本,在笔记本上能够正常运行,ahk的dllcall返回数值是0,运行正常

    但是放到另一个笔记本上使用的时候,dllcall返回的是空,应该是ahk调用失败

    回复删除
  9. 你是怎么编译的,如果用vs编译的话改成Release试试,如果你用的是vs2019的话,尝试在电脑上装vc2019运行库。

    回复删除
  10. T^T 我重新编译了一下,之前是debug模式,我一直没注意

    现在改成release,可以放其他电脑使用了,谢谢大佬提醒

    回复删除
  11. 这种方法,如果免注册调用的话,是不能进行破解吗

    回复删除
  12. 你说的免注册调用是指什么,理论上,你只要确保版本符合:
    dm := ComObjCreate("dm.dmsoft")
    ret := DllCall("dmCrack\patch")
    这两句顺序一致就可以破解。

    回复删除
  13. IfNotExist, %A_MyDocuments%\DM2
    FileCreateDir, %A_MyDocuments%\DM2
    FileInstall, .\dm5\dm.dll, %A_MyDocuments%\DM2\dm_test.dll, 1
    FileInstall, .\dm5\DmReg.dll, %A_MyDocuments%\DM2\DmReg.dll, 1
    FileInstall, .\dm5\dmCrack.dll, %A_MyDocuments%\DM2\dmCrack.dll, 1

    ;========�ע�����===========
    ;iPath := A_ahkpath . "\AHKdm\dm.dll"
    ;WhichButton := DllCall("AHKdm\DmReg.dll\SetDllPathW", "Str", iPath, "Int", 0)
    ;MsgBox % WhichButton
    ;dm := ComObjCreate("dm.dmsoft")
    ;ver := dm.Ver()
    ;=========================�ע���ܣ�

    Global dm
    iPath := A_MyDocuments . "\DM2\dm_test.dll"
    WhichButton := DllCall("DmReg.dll\SetDllPathW", "Str", iPath, "Int", 0)
    dm := ComObjCreate("dm.dmsoft")
    ret := DllCall("dmCrack\patch")
    ver := dm.Ver()

    OutputDebug, %ver%

    dm.CreateFolder("E:\123")

    dm.MoveTo(652,320)

    if (ver = "") {
    msgbox, "register failed"
    return
    }

    OutputDebug, "register succeed"

    F12::
    ;;�󶨴���
    hwnd := dm.GetMousePointWindow()
    if (hwnd > 0){
    ret := dm.BindWindow(hwnd,"normal","windows","windows",0)
    Sleep, 2000
    if (ret > 0){
    OutputDebug, "Bind successed"
    }else{
    msgbox, "can't bind"
    ExitApp
    }
    }else{
    MsgBox, "hwnd < 0"
    ExitApp
    }
    dm.MoveTo(652,320)
    Sleep, 10000

    代码是这样,debug的时候

    输出

    5.1423
    "reguster succeed"

    然后快捷键绑定窗口的时候,无效

    回复删除
  14. 能打印版本号应该就注册成功了,如果绑定窗口无效你可以dm.GetLastError()查看具体错误信息,另外绑定窗口失败也可能是部分窗口原因,尝试更换参数,我记得有什么dx,dx2之类的。

    回复删除
  15. 返回值是

    -1 : 表示你使用了绑定里的收费功能,但是没注册,无法使用.

    回复删除
  16. 你可以把文件打包传到网盘里,我这边看看。

    回复删除
  17. 链接: https://pan.baidu.com/s/1PC_wBW6qBoJD6xwK4-wPJQ 提取码: hxvq

    谢谢大佬

    回复删除
  18. 我试了下,https://gist.github.com/bstaint/13dee878f890ac305e85c6f49989d30e,可以正常绑定,首先打开记事本窗口,然后执行代码,另外就是你最好用一些专业的编辑器写代码,不然如果有中文字符会有文件编码问题。

    回复删除
  19. 我重新试了一下,是因为,我修改了dm.dll 的名字,所以失败了吗

    回复删除
  20. 应该,GetModuleHandle这里的dm.dll要跟你文件名一致。

    回复删除
  21. 如果我需要修改名字,只能release更多的crack吗,这个编译可以带参数,支持修改名字吗

    回复删除
  22. 可以改,像这样,另外头文件函数签名也得改下:
    https://gist.github.com/bstaint/2e2cb3374cdad3369ba1752fce13625c

    回复删除
  23. 请问,头文件要怎样修改啊
    --------
    #ifndef DMCRACK_H
    #define DMCRACK_H

    #ifdef __cplusplus
    extern "C" {
    #endif

    __declspec(dllexport) int patch(const TCHAR* module);

    #ifdef __cplusplus
    }
    #endif

    #endif // DMCRACK_H
    ------
    这样子是不对的嘛

    修改后,调用的时候, ret := DllCall("dmCrack\patch", "Str", "dm.dll")
    最后的"dm.dll"这里可以更换dm.dll的重命名是吗

    回复删除
  24. 此评论已被作者删除。

    回复删除
  25. 尝试了几次都是不行的,请大佬解惑

    回复删除
  26. dmcrack.h:
    https://gist.github.com/bstaint/5c2ffbae3b972c7bd373cc030aae803f

    dmcrack.cpp:
    https://gist.github.com/bstaint/2e2cb3374cdad3369ba1752fce13625c

    回复删除
  27. FileInstall, .\dm5\dm.dll, %A_WorkingDir%\dm.dll, 1
    FileInstall, .\dm5\DmReg.dll, %A_WorkingDir%\DmReg.dll, 1
    FileInstall, .\dm5\dm5.dll, %A_WorkingDir%\dmCrack.dll, 1

    Global dm
    iPath := A_WorkingDir . "\dm.dll"
    WhichButton := DllCall("DmReg.dll\SetDllPathW", "Str", iPath, "Int", 0)
    dm := ComObjCreate("dm.dmsoft")
    ret := DllCall("dmCrack\patch", "Str", "dm.dll")
    OutputDebug, ret is %ret%
    ver := dm.Ver()
    OutputDebug, %ver%

    dm.CreateFolder("E:\123")

    dm.MoveTo(652,320)

    err := dm.GetLastError()
    OutputDebug, %err%
    if (ver = "") {
    msgbox, "register failed"
    return
    }
    OutputDebug, "register succeed"
    ;

    -------------
    我编译出来,测试的时候,crack是失败的?

    回复删除
  28. 我更新了下测试代码:
    https://gist.github.com/bstaint/13dee878f890ac305e85c6f49989d30e

    另外注意编译的时候要用:
    cl /D UNICODE /D _UNICODE dmcrack.cpp

    这样编译出来是UNICODE版本,你的Autohotkey也得确保是UNICODE版本,AutoHotkeyU32.exe,如果你还是有问题就运行测试代码看看哪个MsgBox没有内容。

    回复删除