最近我在玩冒险岛(国际服的,mapleglobal),人太多,要想做组队任务(Party Quest),就得飞似的双击鼠标左键和回车。游戏里很多人都有Auto-Clicker(AC),能模拟鼠标双击和按回车,速度很快。现在没有AC几乎做不上组队任务。
于是,我自己写了一个模拟双击的程序。因为有nProtect(GameGuard),几乎把能用于hack的API、native API全hook上了
我花了2周时间,费了九牛二虎之力,终于把我自己写的代码插到了游戏进程(maplestory.exe)。因为不能用SendMessage/PostMessage,我只好通过FindWindow获取游戏窗口句柄,然后找到窗口过程地址,自己调用游戏的窗口过程。下面是我插到游戏进程的地址空间的代码:
.data
szM db 'Maplestory',0
dwWProc dd 0
.data?
bKey db ?
.code
FindM proc hwnd,uMsg,idEvent,dwTime
invoke FindWindow ,0,addr szM
.if eax
mov hWndM,eax
.if bKey==0
ret
.endif
invoke GetClassLong,hWndM,GCL_WNDPROC
mov dwWProc,eax
.while TRUE
.if bKey==0
ret
.endif
;>>>>>>>>>>>>>>>>>>>>>>>>>
push 015201fbh ;点的坐标507,338
push 0
push WM_LBUTTONDOWN
push hWndM
call dwWProc
;>>>>>>>>>>>>>>>>>>>>>>>>>
push 015201fbh
push 0
push WM_LBUTTONUP
push hWndM
call dwWProc
;>>>>>>>>>>>>>>>>>>>>>>>>>
push 015201fbh
push 0
push WM_LBUTTONDBLCLK
push hWndM
call dwWProc
;>>>>>>>>>>>>>>>>>>>>>>>>>
push 015201fbh
push 0
push WM_LBUTTONUP
push hWndM
call dwWProc
;>>>>>>>>>>>>>>>{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
push 001c0001h
push 0000000dh ;回车键
push WM_KEYDOWN
push hWndM
call dwWProc
;>>>>>>>>>>>>>>>>>>>>>>>>>
push 001c0001h
push 0000000dh ;回车键
push WM_KEYUP
push hWndM
call dwWProc
.endw
.endif
ret
FindM endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EntClick proc
.if hWndM==0
invoke SetTimer ,0,0,4,addr FindM
.endif
mov eax,TRUE
ret
EntClick Endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
进入游戏后,EntClick函数先被调用,设置定时器。然后我另一个线程控制bKey来决定是否开始模拟双击和按回车。刚开始我用游戏中的交易功能作试验,双击一次向别人发一次交易申请,再回车就取消交易。bKey=1后,整个屏幕冻住了,没反应,我的网卡灯狂闪
。5秒后,bKey=0,对方告诉我他接到的交易申请已经不可计数了。但是,我用它却进不了组队任务!!!!.......
我不知道SetTimer是怎么工作的,虽然我写了4ms,但听说触发间隔最小是55ms。当FindM这个回调函数被调用时,系统是另开一个线程吗?如果函数没执行完,就到了下一次调用的时间,系统会再开新线程还是等着?(谁能教教我啊)。。。不过我感觉系统好像没创建新线程,因为屏幕冻住了,主线程似乎不处理消息队列中的消息...我想问题可能出在这里,游戏只是向服务器发送“我想做组队任务”消息,而不处理服务器发回来的“你可以做组队任务”
我还试过开一个新线程来调用窗口过程,但开始双击不出10秒,游戏就退出了,什么也没剩下,可能是nProtect的原因。
呜呜呜呜呜呜。。2周时间什么也没干成,谁能给我点思路啊?我先谢谢各位了。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!