求:用按键精灵制作对对碰外挂的最佳思路!

[复制链接]
查看11 | 回复0 | 2009-1-30 06:28:38 | 显示全部楼层 |阅读模式
求:用按键精灵制作对对碰外挂的最佳思路!

                                                                                                相信很多朋友都使用过QQ游戏的外挂和自己也开发过.但可能你会发现,mouse_event不起作用了.这是为什么呢?我写对对碰外挂的时候也碰到了.下面就把实现和解决过程说明如下.关于如何判断对对碰中是否可以消除的代码略过(大家应该都是通过颜色来判断的),因为这部分不是难点.写好外挂后,反复测试发现,只有第一次运行结果正确,之后就不起作用了,然后动一下鼠标或者点一下鼠标键就又起作用了.想到可能是QQ游戏起作用判断,它能分辨模拟鼠标运作的硬件鼠标动作.(觉得QQ游戏写的很牛,佩服呀~~~)经过查看目录,发现在游戏目录下面一般都会有这个文件kmsinput.sys,使用ida pro打开分析发一下,发现这是nt下的鼠标的驱动,将作为过滤器filter加到的挂接到鼠标驱动中的,这基本上就证实了我的想法,肯定是通过这个驱动程序来分辨模拟鼠标运作还是硬件鼠标动作的.然后就设想:当点击鼠标时,QQ程序应该是通过这个驱动程序来检测是否为硬件鼠标的动作,我们的硬件鼠标是能够检测到的,如果你调用了mouse_event则视为非硬件鼠标动作.就不处理鼠标动作,也就是认为你是模拟鼠标,表示你使用的外挂程序.没办法只能反汇编跟踪调试了,先用ida pro反汇编了一下,发现有很大一部分区域没办法反汇编出来,想到肯定是有加密了.于是我就使用windbg运行来分析了,通过跟踪鼠标点击消息,发现在这个地方会跳转00408519 8b11
mov
edx,[ecx]0040851b 6a01
push
0x10040851d ff5208
call
dword ptr [edx+0x8]00408520 3dc9d56601
cmp
eax,0x166d5c9 //这是比较00408525 0f85a0000000 jne twin!CxImage::`copy constructor closure\'+0x6a7b(004085cb) // 这是这里,如果是硬件鼠标动作不跳,如果是模拟就跳转了找到了这个地方,就容易多了,很简单把 cmp eac,0x166d5c9改为cmp
eax,eax剩下的三个字节改为90 90 90.再运行程序和外挂测试通过.大功告成了!哈哈...另个,又研究发现,对对碰的速度是通过Sleep控制的,写了一个api hook,hook到Sleep,将参数VOID WINAPI CTwinHookFunc::MySleep(DWORD dwMilliseconds){... dwMilliseconds = dwMilliseconds/5; // 变为1/5...
p_Sleep(dwMilliseconds); // 调用真正的sleep函数}再次测试,哇靠,好快呀~~~通过实战,挂了半天,发现可以同时对付几个人而且也不会输.胜率为90%,2000多分了.---------------*********************-----------------------这些日子,QQ游戏外挂是风光了一阵.俄罗斯方块,连连看,对对碰这些游戏的外挂层出不穷。其实这一类外挂的原理大体都是一样的。下面我就以QQ游戏对对碰外挂作为例子阐述一下QQ外挂的制作原理。 观察QQ游戏对对碰的游戏界面及游戏规则,发现玩家是在固定的一个游戏区内寻找复合要求的方块然后点击两次鼠标消去方块从而达到得分的目的。因此,我们可以通过模拟人的观察,和鼠标点击来实现外挂自动消除方块,完成全局。 取得可消方块(模拟人观察):要判断哪个方块可以消,我们可以通过获取方块某点的颜色来判断方块的类型,然后建立方块矩阵,然后在矩阵中选择出适合消去的方块。关于取颜色,我们用到几个API函数 GetPixel、GetDC、ReleaseDC。(详细的介绍请参考MSDN或各种API相关资料)? 模拟鼠标击:在此我们使用 mouse_event 来模拟鼠标的移动,点击,弹起。个人认为用postmessage是更好的,在此使用mouse_event只是为了阐述简单。 **************************** \'API类型定义 Private Type POINTAPI? x As Long? y As Long End Type Private Type RECT? Left As Long? Top As Long? Right As Long? Bottom As Long End Type \'方块类型定义 Public Enum BOX_TYPE Ox = 0 Dog = 1 Panda = 2 Chicken = 3 Cat = 4 Frog = 5 Monkey = 6 End Enum \'自定义方块数据类型x,y位方块坐标,type为方块类型. \'在Easy对对碰1.5版中还加如了一些其他属性,例如是否带道具属性. Public Type BOX? x As Integer? y As Integer? type As BOX_TYPE? End Type?? \'Api常量?? \'鼠标事件常量? Private Const MOUSEEVENTF_LEFTDOWN = &H2? Private Const MOUSEEVENTF_LEFTUP = &H4? Private Const MOUSEEVENTF_MOVE = &H1? Private Const MOUSEEVENTF_ABSOLUTE = &H8000?? Public Const HWND_TOPMOST = -1? Public Const SWP_NOSIZE = &H1? Public Const SWP_NOMOVE = &H2? \'自定义常量? \'游戏区左上角坐标? Const GAME_LEFT As Integer = 176? Const GAME_TOP As Integer = 102? \'每个方块的长宽? Const BOX_WIDTH As Integer = 48? Const BOX_HEIGHT As Integer = 48?? \'游戏窗口句柄? Public g_WindowHwnd As Long? \'方块矩阵 (8*8)? Public boxs(7, 7) As BOX ***************************** Public Function getBoxs()? Dim i As Integer??????????????\'矩阵行? Dim j As Integer??????????????\'矩阵列? Dim color1 As Long?????????????\'颜色 (22,22)处? Dim color2 As Long?????????????\'颜色 (22,17)处?? For i = 0 To 7??? For j = 0 To 7????? With boxs(i, j)????? .x = GAME_LEFT + 22 + BOX_WIDTH * j????? .y = GAME_TOP + 22 + BOX_HEIGHT * i????? \'取每个方块坐标(22,22)和(22,17)位置的颜色????? color1 = getColor(.x, .y)????? color2 = getColor(.x, .y - 5)????? \'用两点颜色确定一个方块类型.????? If color1 = 16777215 And color2 = 16777215 Then .type = Panda????? If color1 = 2097151 And color2 = 1353909 Then .type = Chicken????? If color1 = 4473924 And color2 = 14209230 Then .type = Dog????? If color1 = 13828048 And color2 = 3862322 Then .type = Frog????? If color1 = 8623264 And color2 = 5805536 Then .type = MonkeyIf color1 = 10921638 And color2 = 9408399 Then .type = Cat????? If color1 = 15398649 And color2 = 1655140 Then .type = Ox????? End With??? Next j? Next i End Function \'为了方便理解,这里用了一种比较简单的算法 -- 穷举法. \'其主要思想是列举16种消除方块的可能。一旦有匹配的情况出现,则马上执行鼠标点击动作. \'如果你要使你的外挂更强大,就必须采更优秀的算法. !------------------------另:有可以轻松破对对碰纪录的方法!再联系!参考文献:网上                                       
提问者对答案的评价:

                                                                                                有现成的下载一个得了。到百度搜索“魔镜QQ对对碰助手3.42”就可以了。                                       

                                                                                                按键精灵使用入门可爱的蚊子123 2005-02-21 14:02【网友投稿】
  接触了墨香以后才开始接触按键精灵。以前玩传奇的时候,魔法盾啊,火墙啊,都是需要挂机练出来的(当时还基本上没有好用的外  挂,而且传奇里没有打坐回蓝),所以挂机练功用的办法就是卡键……拿个钥匙啊,硬币什么的,把键盘上那个功能键卡住,然后等  他自己长一点蓝再用一下魔法。而墨香里面人物回蓝基本上靠打坐而不是吃药(免去了买药的麻烦),所以用按键挂技能也就风行天  下,几乎无人不用,偶也在慢慢地摸索中学习了按键的用法。  初阶按键精灵使用:录制脚本,挂被动技能。这个很简单,按键带有一个录制功能,点击“录制”按键,然后在游戏里点一下“开始  录制”,接着使用各种技能,直到没蓝,打坐,坐满,再站起来,停止录制,然后给脚本设定一个启动热键和停止热键,再修改为“  运行此脚本直到按下停止键”,脚本就算是做好了。把号扔在野外,按一下启动热键,人物就会自动练被动技能啦。金钟罩,吐纳法  ,紫霞真气霹雳真气什么的,都可以这样练起来,另外,太清真气、破魂击、慑心击什么的,也可以这样练起来,一点点区别就是挂  机前要先点中另一个挂机的人而已。  中阶按键精灵使用:编辑脚本或者自己写脚本,配合录制功能实现日常游戏中的小应用。  应用一:打坐。我的F1里面10个键已经基本上设满,依次是红莲吐焰、天雷破、大漠孤烟、雪雁归巢、金钟罩、紫霞真气、霹雳真气  、吐纳法、饺子、何首乌。那么打坐哪里去了?打坐我放在F2里面了设置为1,然后编写脚本如下:  延时10毫秒  按键  延时10毫秒  按住  延时10毫秒  弹起  延时10毫秒  按键  然后把启动热键设置为“`”(就是“1”键左边的那个小虫虫),这个键按起来很方便而且墨香里没设定它的作用。这样的话用到的  11个技能都有地方放了。另外我把自己修习的刀系的技能都放在F3里,如果练刀的时候,只需把脚本的最后一行改成“按键”就  可以了,每次打坐站起来会自动换到F3。  应用二:求购东西。墨香里不能使用复制和粘贴,所以求购的时候反复打字是一件非常麻烦的事情。以下是我使用的脚本:  延时200毫秒  按键  延时500毫秒  输入文本收购绿宝石蓝宝石乳白石钻石400一个,红宝500!  延时500毫秒  按键  把启动热键设置为CTRL+0,然后你按一次热键,就会自动喊话一次。  应用三:买皮靴。学了拆解以后经常要买皮靴,一次就买好几十双,重复地点鼠标很烦埃所以也用按键来代劳。这个先要录制,与  NPC对话后开始录制,点中皮靴,点“购买”,再点“是”。停止录制,然后把脚本设置为运行20次(一次刚好买满一背包),设置  热键为CTRL+1,以后按下这个键,就会自动买20双皮靴……  另外还有其它应用:比如降级自杀(只需设定为每隔一秒点一下“原地复活”这个位置,反复运行),狂按CTRL(未学技能之前使用  ,也是先录制一个狂按键,然后让它反复运行),等等。  高阶按键精灵使用:新版本的按键精灵里增加了颜色判断、颜色查找等功能,这就为编写自动转玉、自动吃药、自动打怪等功能提供  了实现的前提。脚本比较长,所以我就用源代码贴上来一个示例,是11级的小号在敦煌打大蠢纯找钱用的。  #这是按键精灵生成的脚本源文件  #在理解各条命令的基础上,您可以修改这个文件的内容  #您修改的结果将会在普通视图上有所反映  #######以下这段,判断488,291的颜色是不是7C7676,如果是,就证明被怪挂了,那么点一下原地复活。#########  IfColor4882917c76760  MoveTo488291  Delay50  LeftClick1  Delay1000  EndIf  #######以下这段,判断内力血条的颜色,如果蓝只剩一点点,则打坐30秒钟。#############  IfColor5070766c5f0  KeyDown521  Delay50  KeyUp521  Delay30000  KeyDown521  Delay50  KeyUp521  Delay1000  EndIf  #######以下这段,是在屏幕范围内查找颜色3FB1D7(大蠢纯身上的颜色),并把查到的坐标存进INTX和INTY。######  VBSDimintX  VBSDimintY  VBSCallCallFindColor(130,100,881,771,3FB1D7,intX,intY)  #######以下这段,是判断是否找到,如果找到了,那么就在INTX,INTY处单击鼠标,选定怪物,然后跳转到杀怪脚本#######  IfExpressionintX>100andintY>99  VBSCallCallSetCursorPos(intX,intY)  LeftClick1  Delay50  Gotokill  EndIf  ######以下开始很长一段都是重复查找颜色并点击找到的地方。因为大蠢纯的颜色在不同光线下会不同,所以######  ######这样的颜色查找是越多越好,要是有兴趣的话,做个几百个判断,这样就会不会错失大蠢纯啦。############  VBSCallCallFindColor(130,100,881,771,369FCE,intX,intY)  IfExpressionintX>100andintY>99  VBSCallCallSetCursorPos(intX,intY)  LeftClick1  Delay50  Gotokill  EndIf  VBSCallCallFindColor(130,100,881,771,3AAAD3,intX,intY)  IfExpressionintX>100andintY>99  VBSCallCallSetCursorPos(intX,intY)  LeftClick1  Delay50  Gotokill  EndIf  VBSCallCallFindColor(130,100,881,771,2790B5,intX,intY)  IfExpressionintX>100andintY>99  VBSCallCallSetCursorPos(intX,intY)  LeftClick1  Delay50  Gotokill  EndIf  VBSCallCallFindColor(130,100,881,771,3CAAD3,intX,intY)  IfExpressionintX>100andintY>99  VBSCallCallSetCursorPos(intX,intY)  LeftClick1  Delay50  Gotokill  EndIf  VBSCallCallFindColor(130,100,881,771,36A4D0,intX,intY)  IfExpressionintX>100andintY>99  VBSCallCallSetCursorPos(intX,intY)  LeftClick1  Delay50  Gotokill  EndIf  VBSCallCallFindColor(130,100,881,771,358EA9,intX,intY)  IfExpressionintX>100andintY>99  VBSCallCallSetCursorPos(intX,intY)  LeftClick1  Delay50  Gotokill  EndIf  VBSCallCallFindColor(130,100,881,771,3DB1D6,intX,intY)  IfExpressionintX>100andintY>99  VBSCallCallSetCursorPos(intX,intY)  LeftClick1  Delay50  Gotokill  EndIf  VBSCallCallFindColor(130,100,881,771,35A3CF,intX,intY)  IfExpressionintX>100andintY>99  VBSCallCallSetCursorPos(intX,intY)  LeftClick1  Delay50  Gotokill  EndIf  VBSCallCallFindColor(130,100,881,771,44B4D8,intX,intY)  IfExpressionintX>100andintY>99  VBSCallCallSetCursorPos(intX,intY)  LeftClick1  Delay50  Gotokill  EndIf  ######此处开始是为杀怪脚本##########  Remkill  ######点中怪物或人以后,屏幕顶端会出现一个方框,下一个语句是就是判断是否确定点中了怪物或人。########  IfColor45678873690  ######如果点中的怪物是没血了的或者点中的是人(点中人以后血条显示是没血的),那么跳过,否则杀怪。#####  ######此处判断血条颜色。##############  IfColor453316060791  ######然后就是使用武功技能啦,偶的七月流火设置为1,所以此处按两次1键。##########  KeyDown491  Delay50  KeyUp491  Delay2000  KeyDown491  Delay50  KeyUp491  Delay2000  ######把变量值恢复为0,0,即屏幕内没有怪的状态。##############  VBSintX=0  VBSintY=0  EndIf  EndIf  Delay1000  这个脚本我试验过,加的颜色判断不够多,所以效率很低,周围刷了5次怪只有一次能被判断出来并杀掉。如果加得足够多,估计自  动杀蠢纯打钱是完全可行的。同时,由于我小号死了无所谓,所以没有加入血条判断的脚本。  自动吃药就是判断血条和内力条的颜色。自动转玉是判断玉的颜色并决定是否需要拆开、转化、或者需要叠起来,玉上面显示的数字  “1”或者“5”可用于判断是不是分成单个了或者是不是可以叠起来。此处就不赘述了。  有兴趣研究的跟贴~http://games.sina.com.cn/z/mox/2005-02-21/207051.shtml够麻烦的了,不如下载个现成的外挂呢,这个就不错:http://www.llkwg.com/qqddp/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行