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 条评论:

匿名 说...

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

bstaint 说...

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

匿名 说...

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

bstaint 说...

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

匿名 说...

啊哈哈哈,我是照着一些教程用vs-code编译的,谢谢你的指引。

青岚 说...

你好,请问一下

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

电脑需要安装什么依赖吗

bstaint 说...

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

青岚 说...

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

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

bstaint 说...

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

青岚 说...

T^T 我重新编译了一下,之前是debug模式,我一直没注意

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

青岚 说...

这种方法,如果免注册调用的话,是不能进行破解吗

bstaint 说...

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

青岚 说...

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"

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

bstaint 说...

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

青岚 说...

返回值是

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

bstaint 说...

你可以把文件打包传到网盘里,我这边看看。

青岚 说...

链接: https://pan.baidu.com/s/1PC_wBW6qBoJD6xwK4-wPJQ 提取码: hxvq

谢谢大佬

bstaint 说...

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

青岚 说...

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

bstaint 说...

应该,GetModuleHandle这里的dm.dll要跟你文件名一致。

青岚 说...

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

bstaint 说...

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

青岚 说...

请问,头文件要怎样修改啊
--------
#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的重命名是吗

青岚 说...
此评论已被作者删除。
青岚 说...

尝试了几次都是不行的,请大佬解惑

bstaint 说...

dmcrack.h:
https://gist.github.com/bstaint/5c2ffbae3b972c7bd373cc030aae803f

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

青岚 说...

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是失败的?

bstaint 说...

我更新了下测试代码:
https://gist.github.com/bstaint/13dee878f890ac305e85c6f49989d30e

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

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