怎么查如何举报vs开挂挂啊?

视频: 我的世界中文动画-菜鸟历险记-第22集-好的坏的和用外挂的-Machinima
分享给好友
您需要先安装&,才能下载视频哦
用优酷App或微信扫一扫,在手机上继续观看。
我的世界中文动画-菜鸟历险记-第22集-好的坏的和用外挂的-Machinima
分享给站外好友
把视频贴到Blog或BBS
flash地址:
<input type="text" class="form_input form_input_s" id="link3" value=''>
<input id="link4" type="text" class="form_input form_input_s" value=''>
基佬蒸气浴被反干...
招募了外挂高手追杀菜菜...
节目制作经营许可证京字670号
京公网安备号
药品服务许可证(京)-经营-您现在的位置: >>
>> 如何看待剑三官网上的对待外挂处理方法
如何看待剑三官网上的对待外挂处理方法
  以下为官网上的内容:
  ●外挂帐号处理规则:
  a.首次查处将给予7天封停角色的处罚。b.同个角色第二次查处将直接给予永久封停角色的处罚。
  ●利用游戏BUG处理规则:
  a.清除所有不正当获得的优势和利益。
  b.封停涉及角色对应的帐号。
  c.永久停止使用涉及帐号。
  谈下我个人看法!
  首先,7天封停只是对于角色处罚!而一个ID里可以有3个角色!
  其次,同个角色2次查处后是永久封停角色!也就是说该帐号下的其他角色依旧可以使用!
  我比较支持象那样!一次检测到以后就对帐号进行封停处理!注意是帐号!不是角色!
  封停后玩家可以通过传真身份证复印件申请解冻帐号,但是当时用过外挂的那个角色将被删除.不影响帐号以及帐号内的其他角色!
  金山既然在论坛的置顶里开了帖!说不是抄袭WOW的游戏!我同意!因为我参与了封测!我看到了很多亮点!金山说要抄袭的是暴雪做游戏的态度,对待玩家的态度!我也同意!他们向来以品质为先!那么,在关键时刻,对待外挂的处理上!我也希望金山能做到暴雪那样!
  接着,额外说点题外话!游戏有BUG是游戏开发上的失误造成的,玩家利用BUG恶意获利要得到如此的惩罚!那么,当金山的BUG影响到玩家利益的时候,是否金山也能给予玩家100%的相关补偿呢?还是仅仅一句抱歉和谅解呢?
  如果我没有记错的话,WOW里前段时期,战场里利用BUG刷荣誉的BUG,9C特地在官网发出了相关公告申明!公告里指出发现有玩家利用这个BUG,并严格申明,如果利用此BUG情节严重者,一旦发现,将进行永久封号处理!不巧的是!林大了,什么鸟都有,偏偏就有人那么做了!号被封了!可被封者偏偏又不甘心,向9C发起了诉讼!最后案子的宣判是,玩家胜!9C必须为玩家恢复帐号相关数据!
  我觉得,对于外挂的处理,不够严厉!谁都知道,外挂这种问题,堵得早,震得牢!堵得晚,等于扼杀自己游戏的人气!不堵就是在为自己的游戏减寿!
  我很小市民!也许金山给这一次机会是考虑大家也有犯错误的时候!但是,我的看法就是,这一次错误反正只是针对这一个号!我每个号都有一次这样的机会,何况服务器人那么多也未必抓得住我!不用这一次机会白不用!被抓住也就是这个角色7天不上线,反正游戏里本来就需要离线时间来积累修为!不上线的时候我玩另外一个号就是了!即便我素质很高,当别人都那么干的时候,我就不想输在起跑线上了!每个人都象我那么想的时候,我想说,即便第2次使用被发现了.
  当所有人都这样的时候,金山,你是封?还是不封?有没有WOW当年那一夜封掉35W帐号的魄力?你可玩得起?如果没有那魄力,不如一开始就把防御工作做做好!
  再说对于BUG的处理,当玩家发现严重BUG汇报的时候,金山说的只是感谢!当玩家的利益因BUG而损失的时候,金山给予的总是抱歉和谅解,即便补偿也要申请,并且往往补偿和损失不成对等正比,但当玩家发现BUG利用它获取金山利益的时候,金山是要封号的!那么,为什么我们贡献的时候没有给予我们回报!我们索取的时候就要受到惩罚呢?什么事情都是双方面的?希望西山居这次不要让一个我等了很久的游戏毁在BUG以及外挂上!
  以上言论,仅仅是我针对看了官方公告以及论坛广大剑三玩家的回帖后谈的一些个人看法!
  大家觉得应该采取什么样子的处理呢?
  -------------------------------------
  此文章为多玩坛友转载文章,如果您是本文的原作者,请到论坛短消息&给心+水&,我们会立刻把作者加上!
  尊重原创作者,多玩欢迎您来投稿!
  投稿地址:
<button onclick='javascript:var _title=document.var _url=document.location.if( document.all ) {var _text=_title+" - "+ _clipboardData.setData("Text",_text);this.innerHTML="已经复制成功,请用 Ctrl+V 粘贴";}'>点击复制文章地址,推荐给QQ和MSN上的朋友
查看更多 () 相关文章,您可以[] []。
看完本文后有何评价?
已有0人评价,点选表情后可看到其他玩家的表态。
<span onclick='javascript:if(document.all){clipboardData.setData("Text",location.href);this.innerHTML="[文章地址已复制]";}'
class="btn">[与更多人共享]
插件下载排行
辅助工具下载
最新插件下载
近期游戏热点
最新装备导航
多玩首页推荐【推荐】如何写一个连连看或对对碰外挂 [文字模式]
- 看雪安全论坛
查看完整版本 :
鸡蛋壳目录:
一、该类外挂的分类
二、两代外挂得到数据方法要点
a.模式识别型
b.内存操作型
三、搜索算法要点
四、模拟游戏的方法
五、特殊功能技术要点
a.突破对鼠标单机事件的检测,实现全自动
b.加速方法思路要点
c.自动道具的要点
d.自动开始的要点
本文将详细介绍连连看、对对碰类型的外挂的制作方法。我希望通过本文,略有windows编程基础的人都能写出第一代的外挂,并努力尝试第二代外挂的编写。
本文主要讲述思路。看完后不要向我询问具体的内存地址是多少。
一、该类外挂的分类
我认为,到现在为止,连连看与对对碰外挂大致可以分两类: 一是模式识别型;二是内存操作型。我把它们分别称为第一代与第二代。之所以分为两代是因为我认为这两种存在着技术与效果的差距。
同时我谨慎地把封包分析或其它类似技术的认为是第三代。什么是其它类似技术,将在展望中讲述。
第一代外挂中,jjj的对对碰外挂比较典型,在第一代外挂中速度也比较快。很多需要注册的对对碰、连连看外挂也属于这一代,但技术上却比较一般。
追风逐月从连连看的1.3版本开始进化到了第二代。可以算是第二代中比较早的了。经过多次更新,对对碰外挂可以认为是目前已知的最高水平。
目前可能已经出现了第三代连连看、对对碰外挂的雏型。魔镜连连看外挂可能已经采用了封包分析的方法。但我没有细细分析过,不敢下结论。&/P&&P&二、两代外挂得到数据方法要点
a. 模式识别型
早先的外挂基本上采用的是种方法。
一开始都着眼于如何得到游戏最基本的数据,就是图像的分布。模式识别是人工智能中的一个名词,我借用过来。由于所有的图像都是显示在屏幕上的,因此有理由相信从屏幕是可以得到数据信息的,只要有合适的识别方法。
模式识别的关键是特征匹配。对于屏幕图像而言,同一种图像可以认为在同一位置的RGB值是近似一样的。这为识别提供了最重要的根据。
Windows提供了一个API: COLORREF GetPixl( HDC, int,int)。通过调用该API我们可以得到点(x,y)处的色彩特征。当GetPixl返回CLR_INVALID时,基本上是因为窗口被挡住了。
得到了色彩特征,还要识别出来,转换为我们需要的图像种类的数据。一般地,可以考虑两种方法:
I. 在程序中硬编码某种图像在该点的 COLORREF 数据.一旦相等,便认为是该种图像。在这种情况下,同一种图像最后得到的编号是相同的。
II.不硬编码,而采用链表的方式,在程序内部存储得到的不同种类的图像的特征,通过互相之间的比较,决定是否是同一类图像。该种情况下,同一图像在不同的运行时刻可能得到不同的编号。这主要是因为,对于对对碰、连连看这样的游戏,只需知道是否是相同的图像,而对是什么图像并不关心。
以上两种方法,第I种我觉得快一些,也方便一点。但是通用性不强。
为了得到比较准确的数据,我认为一般要允许一定的误差。一般来讲,将COLORREF转换为(R,G,B)值后比较科学。同时应该对(R,G,B)允许一定误差。
由于模式识别型这种得到数据的方式,它的先天不足是显而易见的。它的窗口不能被挡住。这使得它不可能实现挂机。同时并不是所有的设备都支持GetPixel().&/P&&P&b.内存分析型
第二代的外挂开始注重获取数据的准确度与严谨性,这时开始采用内存读取数据的方法。
从内存获得数据,最重要的显然是找到地址了。
对于比较显著的地址,比如号码什么的,找起来是比较方便的。利用游戏修改工具直接就可以找到的。这些数据的特点是你在找它们之前就已经知道。
但还有一些数据,在找之前你是不知道的。比如图像的分布,你不知道它是怎么表示的。这时,有时也要靠一些猜测与实验了。
比如,对对碰总共不到十种图案,用一个字节就足够了。一般来说可以试试一个字节的吧。
同时,假如数据所放的位置是固定的(如果不固定,我们就没有必要去找了),那么我们可以相信,当你进行一步游戏后,内存中某些数据会变化,但变化的数据不太会多得让人无法接受。此为其一。其次,一般地,数据区在什么地方也可以估计一下。堆栈的可能性不大。当然不能排除有这种情况的。
如果游戏中数据是 new出来的地方放的,就不要再费力了。某些大型网络游戏,据我所知,不同时候数据是放在不同地方的。那么可能就是通过new 搞出来的内存空间。
如果使用工具,跟踪内存的改变与写入,那么找到数据在什么地方,还是有可能的。
找到了数据在什么地方后,必须能读出来。我所知的有两种方法:一种是采用API: ReadProcessMemory();还有一种是注入DLL后利用共享段获取数据。
当然 ReadProcessMemory()最好改变一下属性,因为不是所有的地方都是可读的。
使用DLL共享数据段应该注意的是,在DLL中必须初始化共享数据,否则编译器不会单独设置共享段,而直接放在一般数据段里了。这时数据就不能共享了。
以上是找到数据.
内存修改主要是用 WriteProcessMemory(). 内存修改是一般是为了突破某些限制。而限制一般是通过比较来决定是不是进行的。所以比较与跳转语句是**的可疑对象。
当然,修改有时需要想像力的。比如有时某个很占用CPU的操作,想把它去掉。怎么办呢?能不能直接通过统计CPU占用率来找到是哪个函数呢?这在某些时候是可行的。Intel有一款软件可以做这个测试,它原本是为了优化程序用的.
还有些时候,API函数也会透露出一些信息。比如加速功能。变速齿轮可以达到这个功能。用PEInfo看一下它导入了哪些API,做一定的联想,也许就是它修改了其中与时间相关的函数。这就为写程序提供了一定的思路。
内存修改要找到一般需要比较好的汇编功底和耐心。动态调试器会有一些作用,但不能完全代替人的作用。当然,如果使用功能更强大的比如 SOftICE这样的ring 0调试器可能功能会强一些,但是softICE几乎是不能完全卸载的。&/P&&P&三、搜索算法要点
连连看需要找到两点之间的一个最多两个弯的通话。我不知道别人是用什么方法。我提供一个思路。最多两个弯,即意味着两点之间基本是这两种情形:-|_ 或者 |-|。简单地讲,就是一个x方向两个y方向或者一个y方向两个x方向。直线可以看作一种特例。
于是,算两个点之间有没有合适的通路可以有下面这种算法:
I.进行一个x方向两个y方向的搜索
具体这样:
先查找x方向的通路可能存在的y的范围。这很简单,只要将两点分别沿y方向各自找到通路的最大集合,然后取交集即可。
得到x方向的通路可能存在的y的范围后,对这些范围查找有没有x方向通路。
II.如果I没有找到,进行一个y方向两个x方向的查找。
III.如果I与II都没有找到,则两点没有合适的通路。
对对碰是要找到交换后三个或以上连续的情况。如果我们不考虑得分大小的话,我们可以只找三个即可。
我见过把8种还是十几种情况罗列的,我认为可以概括为两种情况。
这两种情况是向后交换与向下交换。假如x1与x2水平相临,则x1向后交换与x2向前交换是一样的.所以最终可以把向前交换与向上交换省掉.
我给出一个代码:
int CGamePlay::search(void)
for ( y = 0; y & 8; y++)
for ( x = 0; x & 8; x++)
// 向后交换
if ( map[y][x]!= map[y][x+1] && x != 7)
if ( ( x & 1 && map[y][x+1] == map[y][x-1] && map[y][x+1] == map[y][x-2]) // 向前行检查
||( x & 5 && map[y][x] == map[y][x+2] && map[y][x] == map[y][x+3]) // 向后行检查
||( y & 1 && map[y][x] == map[y-1][x+1] && map[y][x] == map[y-2][x+1]) // 向上列检检查
||( y & 1 && map[y][x+1] == map[y-1][x] && map[y-1][x] == map[y-2][x]) // 同上
||( y & 6 && map[y][x] == map[y+1][x+1] && map[y+2][x+1] == map[y][x]) // 向下列检查
||( y & 6 && map[y][x+1] == map[y+1][x] && map[y+2][x] == map[y+1][x])) // 同上
aim[0].x = aim[0].y =
aim[1].x = x + 1; aim[1].y =
}&/P&&P& // 向下交换
if ( map[y][x] != map[y+1][x] && y != 7)
if ( ( x & 1 && map[y+1][x] == map[y][x-1] && map[y][x-1] == map[y][x-2]) // 向前行检查
||( x & 1 && map[y][x] == map[y+1][x-1] && map[y][x] == map[y+1][x-2]) // 同上
||( x & 6 && map[y][x] == map[y+1][x+1] && map[y][x] == map[y+1][x+2]) // 向后行检查
||( x & 6 && map[y+1][x] == map[y][x+1] && map[y+1][x] == map[y][x+2]) // 同上
||( y & 1 && map[y+1][x] == map[y-1][x] && map[y+1][x] == map[y-2][x]) // 向上列检查
||( y & 5 && map[y][x] == map[y+2][x] && map[y][x] == map[y+3][x])) // 向下列检查
aim[0].x = aim[0].y =
aim[1].x = aim[1].y = y + 1;
return -1;
}&/P&&P&C/C++编译器处理||时,当前边有条件为真时,直接就返回真了,所以很多条件在实际运行时都被忽略了.&/P&&P&四、模拟游戏的方法
以上几步都进行完了,那么外挂必须采取行动了,让游戏转起来.
常见的方法有两种: 一种是模拟输入;一种是发送相应消息.
模拟输入主要有几个函数: mouse_event()和 keydb_event()及 SendInput(). 具体使用方法见MSDN或者网上找一下.
发送消息就是向程序发送输入对应的windows消息. 比如 WM_LBUTTONDOWN, WM_LBUTTONUP等等,自动外挂时则是WM_KEYDOWN,WM_KEYUP
我的看法:模拟输入对系统有些干扰,能不用尽量不用.
说到输入,顺便提一句 AttachThreadInput(). 这个很有意思的.可以把一个线程的输入链接到另一个输入中来,与它共享. 所以假如把一个线程链接到QQ的登陆框会怎么样呢?
现在的密码查看大都是发送WM_GETTEXT来得到*号内容的.如果对方主动接管了WM_GETTEXT的行为 ,还是可以规避的. 不知有没有尝试过用输入挂接的方法. 关于AttachThreadInput()这个API函数,在 Advanced Windows Programming 中有详细介绍. &/P&&P&五、特殊功能技术要点
a.突破对鼠标单机事件的检测,实现全自动
对对碰与连连看都利用驱动,在核心态上对鼠标单击事件进行了检测。一般的程序是无法分清鼠标单击事件是物理产生的还是模拟的。但是驱动可以(要是驱动不行那不是完蛋了)。我想可以尝试以下几种方法吧:
1. 把驱动删了,不让它加载。结果发现不行,哈哈。我想,可能是当程序加载驱动失败时它退出了
2. 阻止驱动功能调用。把twin.exe反汇编,查找 DeviceIOControl。 这是windows的一个API,可以用它来向驱动发请求。
BOOL DeviceIoControl(
HANDLE hDevice,
DWORD dwIoControlCode,
LPVOID lpInBuffer,
DWORD nInBufferSize,
LPVOID lpOutBuffer,
DWORD nOutBufferSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped
);&/P&&P&在twin.exe中对该函数的调用地方并不多。:
... 只列出push 语句
此处已有 lea eax,dword ptr [esp+8]
push 0022101f
call dword ptr [] ; 此处调deviceiocontrol&/P&&P&根据入栈顺序,0022101f应该是功能号.
这时调用的功能号是 0022101b&/P&&P&3.在附近。功能号 &/P&&P&4.....
并不多。其中有一个应该是接管鼠标进行检测。&/P&&P&一个很土的办法,写一个程序,加载驱动,发送请求,看看哪个调用是对鼠标进行检测。
加载驱动的方法是 CreateFile().&/P&&P&找到功能号后,对相应的调用的地方修改它的代码,返回值。怎么改呢?DWORD nOutBufferSize, LPDWORD lpBytesReturned这两个参数要注意。 如果我们真的单击一下鼠标,然后读取这两个参数给定的地方的内容。那么以后每次执行到这个地方时,我们接管一下程序,把缓冲区的内容填写好,那么可以骗过twin.exe。
怎么接管呢? 很简单,将该处的DeviceIOControl的调用指向我们的函数,直接通过一个jmp.注意,此处不用HOok DeviceIOControl. 这时,我们需要的缓冲区的参数在堆栈里。我们通过pop,可以得到。 然后就可以做我们要做的了。此处要注意堆栈的平衡。&/P&&P&3. 改变twin.exe里的某个地方。
jnz 004085CB 这句是关键. 所以上面的 cmp eax,166D5C9 改一下就可以了.只要使它不跳转.当然也可以 用nop 填充掉
cmp eax,166D5C9
jnz 004085CB &/P&&P&b. 其它时间关系不再列举.&/P&&P&六.展望
在连连看与对对碰外挂中,读取内存的外挂肯定是大部分,是主流.直接封包的是王者.但是采用图像识别的更具有普遍性,因此也有意义,它可以对付游戏的更新.
you8107当然,修改有时需要想像力的。比如有时某个很占用CPU的操作,想把它去掉。怎么办呢?能不能直接通过统计CPU占用率来找到是哪个函数呢?这在某些时候是可行的。Intel有一款软件可以做这个测试,它原本是为了优化程序用的.
什么工具?说来看看
GoogleDXIntel Vtune
InNULL我觉得呢能写外挂的人,这些理论知识都了解。
如果按照一个具体的外挂制作的流程,大体(如果具体,那就没得说了)讲述每个制作步骤的关键技术,会更有意义。
:confused: 纯粹胡扯,可以无视!
bwin路过。。。。
ToBeVIP再路过。。。。
liuzewei呵呵!发错了修该下!
liuzewei光阴似剑,转眼多年过去了。
我一直乎远乎近的伴随着看雪,但仅仅是潜水。
废话少说了。
刚才无意中看到论坛有个朋友发的一篇讲QQ连连看外挂的帖子,只是感觉帖子中说的不是特别具体。忽的
想起很久以前写过一个火拼QQ连连看的外挂,也拿出来和大家分享下。用的是读取内存的方法,我不会调
试,完全是一条一条的跟出来的```也不知道多久前QQ连连看更新了,这个挂也不能用了。一直也没有时
间将代码更新一下。
我发些我当时保存的资料和代码中最关键的两个数据吧,也让它们出来晒晒```在硬盘上都发霉咯```呵呵
这也算是我在PEDIY上的处女帖吧。
方块编码图.jpg
http://fm192./tribe//54/ACUC.jpg
方块内存图.jpg
http://fm192./tribe//54/ACUC.jpg
有了以上两个图,也不用咱多说了吧,地址虽然变了,但是。。。
下面是判断是否相连的代码,很久前写的,今天修改了下,没有编译过,可能会有小的语法错误,呵呵!
///////////////////////////////////////////////////////////////////////////////
// QQ 连连看方块间连通判断算法
日 by 刘泽围
///////////////////////////////////////////////////////////////////////////////
// 判断在同一行上的两个方块区域之间是否可直接连通
// 方块区域: QQ连连看将整张地图分为 19 行 * 11 列, 这里将 每一小格 称之
为 一个方块区域
bool RowLinkable( int commonRow, int blockACol, int blockBCol )
if ( abs ( blockACol - blockBCol ) &= 1 )
// 如果 blockA 与 blockB 直接相邻 或 为同一 block,则可直接连通
else if ( blockACol & blockBCol )
// blockA 在 blockB 左边
for ( int i = blockACol + 1; i & blockBC i++ )
// 如果 blockA 与 blockB 之间存在数值上非 0 的方块,则不可直接连通
// 数值非 0 表示当前方块区域放有 连连看游戏实体图形
// blockTypes[] 存放整张地图中所有 block 在内存中的值
// commonRow * 19 + i 的计算依据为: 每一行共有 19 列
if ( blockTypes[ commonRow * 19 + i ] != 0 )
// blockB 在 blockA 左边
for ( int j = blockBCol + 1; j & blockAC j++ )
if ( blockTypes[ commonRow * 19 + j ] != 0 )
// 判断在同一列上的两个方块区域之间是否可直接连通
bool ColLinkable( int commonCol, int blockARow, int blockBRow )
if ( abs ( blockARow - blockBRow ) &= 1 )
// 如果 blockA 与 blockB 直接相邻 或 为同一 block,则可直接连通
else if ( blockARow & blockBRow )
// blockA 在 blockB 上边
for ( int i = blockARow + 1; i & blockBR i++ )
if ( blockTypes[ i * 19 + commonCol ] != 0 )
// blockB 在 blockA 下边
for ( int j = blockBRow + 1; j & blockAR j++ )
if ( blockTypes[ j * 19 + commonCol ] != 0 )
// 判断整张地图上任意两个方块区域之间是否可在 两次或两次转折以内 连通
bool Linkable( int blockARow, int blockACol, int blockBRow, int blockBCol )
// 算法思路
// 首先水平扫描, 适用以下情况
□□□□□□□□□□□□□□□□□□□
□□ia□□A□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□ib□□□□□□□□□B□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□A□□ia□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□ib□□□B□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□A□□□□□□□□□□ia□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□B□□□ib□□
□□□□□□□□□□□□□□□□□□□
A: blockA
ia: A 所在行第 i 列的 block
B: blockB
ib: B 所在行第 i 列的 block
// 第 1 步: i 从第 0 列开始往第 18 列扫描
for ( int i = 0; i & 19; i++ )
// 第 2 步: 如果 ia 与 ib 所在的方块区域未放有 连连看游戏实体图形,
或者其所在的方块区域刚好和 A 或 B 处在同一个方块区域
if ( ( blockTypes[ blockARow * 19 + i ] == 0 || i == blockACol )
&& ( blockTypes[ blockBRow * 19 + i ] == 0 || i == blockBCol )
// 第 3 步: 判断在第 i 列上的 ia 与 ib 是否可直接连通
if ( ColLinkable( i, blockARow, blockBRow ) )
// 第 4 步:
1. 判断在 A 所在行上的 A 与 ia 是否可直接连通
2. 判断在 B 所在行上的 B 与 ib 是否可直接连通
if ( RowLinkable( blockARow, blockACol, i )
&& RowLinkable( blockBRow, blockBCol, i )
// 然后垂直扫描, 适用以下三种情况
□□□□□□□□□□
□□ja□□□jb□□□
□□□□□□□□□□
□□A□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□B□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□A□□□□□□□
□□□□□□□□□□
□□ja□□□jb□□□
□□□□□□□□□□
□□□□□□B□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□A□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□B□□□
□□□□□□□□□□
□□ja□□□jb□□□
□□□□□□□□□□
A: blockA
ja: A 所在列第 j 行的 block
B: blockB
jb: B 所在列第 j 行的 block
// 第 1 步: j 从第 0 行开始往第 10 行扫描
for ( int j = 0; j & 11; j++ )
// 第 2 步: 如果 ja 与 jb 所在的方块区域未放有 连连看游戏实体图形,
或者其所在的方块区域刚好和 A 或 B 处在同一个方块区域
if ( ( blockTypes[ j * 19 + blockACol ] == 0 || j == blockARow )
&& ( blockTypes[ j * 19 + blockBCol ] == 0 || j == blockBRow )
// 第 3 步: 判断在第 j 行上的 ja 与 jb 是否可直接连通
if ( RowLinkable( j, blockACol, blockBCol ) )
// 第 4 步:
1. 判断在 A 所在列上的 A 与 ja 是否可直接连通
2. 判断在 B 所在列上的 B 与 jb 是否可直接连通
if ( ColLinkable( blockACol, blockARow, j )
&& ColLinkable( blockBCol, blockBRow, j )
好了,不废话了,希望对大家有用!欢迎交流!:)
发不了贴```只能跟贴了。。。:eek:
北极星2003算法都很简单:
连连看,根据任意两点画个“井”字,然后就不用说了
对对碰,就更不用说了,只是从下往上比较好,可以作为加速条件,因为下面相对稳定
说采用图象匹配方式可以对付更新,纯属扯淡,连连看只要在图像中加入随机噪音,就没戏了。
Bughoho算法都很简单:
连连看,根据任意两点画个“井”字,然后就不用说了
对对碰,就更不用说了,只是从下往上比较好,可以作为加速条件,因为下面相对稳定
说采用图象匹配方式可以对付更新,纯属扯淡,连连看只要在图像中加入随机噪音,就没戏了。
北极星算法功底好强。
加入随机噪音噪音将图象黑白处理也许能解决,不过我看不起这种外挂。
aki北极星算法功底好强。
加入随机噪音噪音将图象黑白处理也许能解决,不过我看不起这种外挂。
我也看不起这种外挂,不过我很看得起能把qq的图片验证识别搞定的人
Bughoho我也看不起这种外挂,不过我很看得起能把qq的图片验证识别搞定的人
北极星能搞定
filx比较有用,收了
liuzewei算法都很简单:
连连看,根据任意两点画个“井”字,然后就不用说了
对对碰,就更不用说了,只是从下往上比较好,可以作为加速条件,因为下面相对稳定
说采用图象匹配方式可以对付更新,纯属扯淡,连连看只要在图像中加入随机噪音,就没戏了。
是啊,昨天晚上我就这么想,换种思路。不从扫描的观点来写算法,而是从 A 和 B 自己的角度来想。对于 A 或 B,它们能走的只有上下左右四个方向,所以,找出当前时刻 A 和 B所能直线到达的所有区域,也就是分别两个 十 字,然后,对这两个 十字 集合求公共子集,最后在公共子集中找出可以所有直接相通的对子就是所有的解。因为QQ连连看不用考虑最优解,那就只要找出其中任一对就可以了。
这样写,比起我上面的方法,可以比较大的提高效率,因为减少了不必要的判断,而且写出来的代码可以更简短。
你说的那个 井 字,确实不错,一眼就被你看出来了。呵呵!藏龙卧虎的地方!
liuzewei公共子集的说法不对,应该是投影到一条水平或垂直线上时的公共部分。
forgot噪音怕啥,模糊到一定程度匹配度最高的还是那一对。
ykzhujiang模式识别。。。
鸡蛋壳算法都很简单:
连连看,根据任意两点画个“井”字,然后就不用说了
对对碰,就更不用说了,只是从下往上比较好,可以作为加速条件,因为下面相对稳定
说采用图象匹配方式可以对付更新,纯属扯淡,连连看只要在图像中加入随机噪音,就没戏了。
用上了我看没什么人玩了。得不偿失
hmilyyang写过一个阿达连连看的外挂,是用模式识别做的,效果还行:)
mxt72连连看都用驱动!
很久以前写过一个,原理非常简单,就是利用他自己的提醒功能,嘿嘿
studykkjs粗略看了下内容,直接定位这儿。。。
似乎论述不够详细
twin.exe是什么东西??
,写一个程序,加载驱动,发送请求,看看哪个调用是对鼠标进行检测。
这个会不会迷失在一大堆调用中??
想看的地方太简略。。。不想看的地方太详细。。。。。555
虽然略有不满意。。还是严重支持下楼主
2. 阻止驱动功能调用。把twin.exe反汇编,查找 DeviceIOControl。 这是windows的一个API,可以用它来向驱动发请求。
BOOL DeviceIoControl(
HANDLE hDevice,
DWORD dwIoControlCode,
LPVOID lpInBuffer,
DWORD nInBufferSize,
LPVOID lpOutBuffer,
DWORD nOutBufferSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped
);&/P&&P&在twin.exe中对该函数的调用地方并不多。:
... 只列出push 语句
此处已有 lea eax,dword ptr [esp+8]
push 0022101f
call dword ptr [] ; 此处调deviceiocontrol&/P&&P&根据入栈顺序,0022101f应该是功能号.
这时调用的功能号是 0022101b&/P&&P&3.在附近。功能号 &/P&&P&4.....
并不多。其中有一个应该是接管鼠标进行检测。&/P&&P&一个很土的办法,写一个程序,加载驱动,发送请求,看看哪个调用是对鼠标进行检测。
加载驱动的方法是 CreateFile().&/P&&P&找到功能号后,对相应的调用的地方修改它的代码,返回值。怎么改呢?DWORD nOutBufferSize, LPDWORD lpBytesReturned这两个参数要注意。 如果我们真的单击一下鼠标,然后读取这两个参数给定的地方的内容。那么以后每次执行到这个地方时,我们接管一下程序,把缓冲区的内容填写好,那么可以骗过twin.exe。
怎么接管呢? 很简单,将该处的DeviceIOControl的调用指向我们的函数,直接通过一个jmp.注意,此处不用HOok DeviceIOControl. 这时,我们需要的缓冲区的参数在堆栈里。我们通过pop,可以得到。 然后就可以做我们要做的了。此处要注意堆栈的平衡。&/P&&P&3. 改变twin.exe里的某个地方。
jnz 004085CB 这句是关键. 所以上面的 cmp eax,166D5C9 改一下就可以了.只要使它不跳转.当然也可以 用nop 填充掉
cmp eax,166D5C9
jnz 004085CB &/P&&P&b.

我要回帖

更多关于 如何举报vs开挂 的文章

 

随机推荐