zoukankan      html  css  js  c++  java
  • 用VC6做QQ对对碰外挂程序

    前段时间跟以前的同事玩QQ游戏对对碰,结果输的好惨,后来在网上看到了有对对碰的外挂,但还需要注册,就考虑既然别人可以写出来,我为什么就不能写出来呢?于是花了一个下午的时间仔细研究了一下,把外挂写了出来。
            
    其实原理很简单,只要将棋盘上面的数据保存起来,然后经过分析就可以知道移动哪里的动物,然后再通过模拟鼠标消息来点击两个位置就可以了。
             1
    )获取棋盘数据
              
    要得到棋盘的数据进行分析,思路是这样:首先得获得对对碰的窗口,然后对窗口上面的象素进行分析,从而获取每个格子中的数据。对于每个格子里面的动物,一定可以有几个有特征的点使得可以区分开每个格子中的动物,可以用用23个点的数据保存一个动物,这样把每个格子中动物的数据都获得后,棋盘的数据也就出来了。
            
    首先,要得到对对碰的窗口,这个比较简单,可以用::FindWindow来实现,具体代码如下:
         CQQGameToolDlg * dlg = (CQQGameToolDlg *)parm;//
    这里因为这个函数是作为一个线程来做的,所以得传递一个参数过来
         dlg->hWnd = ::FindWindow(NULL,"QQ
    对对碰");//查询
         if(dlg->hWnd == NULL)
          dlg->hWnd = ::FindWindow(NULL,"
    对对碰");//好像窗口标题有时还不同,不知道是不是我自己搞错了
         if(dlg->hWnd == NULL)
         {
          AfxMessageBox("
    未找到对对碰窗口,请首先启动对对碰!");
          dlg->SetDlgItemText(IDC_BUTTON1,"
    启动");
          dlg->m_bStart = false;
          return 0;
         }
          
    到这里就得到了QQ对对碰的窗口句柄,但是要分析窗口中的象素,还需要得到一个窗口的HDC
        dlg->hDc = ::GetDC(dlg->hWnd);
        
    下面就是得到棋盘的数据了,首先得测试出棋盘左上角的坐标和每个格子的边长,具体测试方法就不给出了,是比较简单的,经过测试得出的数据,棋盘左上角坐标为(176102),每个格子的边长是48
        
    接下来就是保存棋盘数据了
        
    下边的函数是为了获取每一个方格的数据的
        
    参数x,y是棋盘坐标,比如(0,0)代表左上角第一个方格等等。
        
    我们在这里取每个格子中间那条线的象素作为数据进行存储。
        COLORREF * CQQGameToolDlg::GetRectData(int x, int y)
        {
         COLORREF * color;
         color = new COLORREF[48];
         int count = 0;
         for(int i=(x-1)*48 + m_posX;i<(x-1)*48 + m_posX + 48;i++)
         {
          color[count++] = GetPixel(hDc,i,(y-1)*48 + m_posY + 20);
           //
    如果是棋盘的底色,则忽略
          if(color[count-1] == 0x00efaa5a || color[count-1] == 0x00f7c384)
           color[count-1] = 0x000000;
         }
         return color;
        }
        
    下边的函数获取每个格子的特征点的数据:
        
    在这里我们只取六个特征点进行存储,把六个特征点的十六进制保存起来。
        void CQQGameToolDlg::GetCode()
        {
         for(int i=1;i<=8;i++)
          for(int j=1;j<=8;j++)
          {
           CString str;
           COLORREF * c;
           c = GetRectData(i,j);
           str.Format("%x%x%x%x%x%c",c[25],c[26],c[27],c[28],c[29],c[30]);
           data[i][j] = str;
          }
        }
        
    经过上面的函数,则data数组保存的就是棋盘的数据了,到这里,对棋盘数据的获取就结束了。
        2
    )分析棋盘数据
        
    得到棋盘数据以后,需要对棋盘数据进行分析了,思路是分别分横向和纵向遍历所有的格子,先找到两个相同动物相连的格子,然后找到周围6个可能移动的格子,只要在6个格子中找到一个与那两个相同的,就说明可以移动那个格子中的动物了。
        
    比如:

    只要在CDEFGH中找到任意一个与AB相同的动物,就可以了。具体的代码也比较简单,就是对数组的判断和操作了,在这里就不详细给出了。
        3
    )移动动物
        
    从上面的分析我们可以知道需要移动哪里的动物了,现在我们只要标识出来那个位置其实就可以达到目的了,但是为了方便,最好还是不用自己动手,而利用程序自动来完成移动的操作。实现也比较简单,只需要给游戏窗口发送消息就可以实现,代码如下:
        
    由于开始是直接画图上去没有实现自动移动,所以函数名还是用的DrawRect:)
        x,y
    是上面得到的移动的坐标。
        void CQQGameToolDlg::DrawRect(int x, int y)
        {
         int xx,yy;
         xx = (x-1)*48 + 10 + m_posX;
         yy = (y-1)*48 + 10 + m_posY;
        // ::Rectangle(hDc,xx,yy,xx + 10,yy + 10);//
    这里是画一个方块上去,注释掉了。
         LPPOINT lpPoint = new CPoint();
         lpPoint->x = xx;
         lpPoint->y = yy;
         ::ClientToScreen(hWnd,lpPoint);
         LPARAM lParam = MAKELPARAM(xx,yy);//
    鼠标点击的坐标
         ::SendMessage(hWnd,WM_LBUTTONDOWN,MK_LBUTTON,lParam);//
    发送鼠标DOWN的消息
         ::SendMessage(hWnd,WM_LBUTTONUP,MK_LBUTTON,lParam);//
    发送鼠标UP的消息
        }    
        
    这样就完成了一个自动游戏的小工具,还比较简单吧?如果配合变速齿轮,效果会更好的。根据同样的原理,类似这样的游戏其实都是可以做出来这种外挂的,比如连连看、俄罗斯方块、泡泡龙等等,只是需要对游戏本身进行仔细分析才行。


        
    还要补充一点:使用的时候必须让对对碰的棋盘完全显示出来,不能有窗口挡住否则得到的数据就不准确了。
     
  • 相关阅读:
    UITableViewCell隔行换颜色
    NSUserDefaults数据保存使用
    使用API获取(默认付款条件和到期日)
    分类账和法人实体
    如何避免Oracle Form界面倒入.csv文件出现乱码
    XML publisher 填充空白行数
    DBA处理异常常用SQL
    wsh_deliveries_pub.create_update_delivery异常
    sql
    破解Oracle ERP密码
  • 原文地址:https://www.cnblogs.com/tyjsjl/p/2156072.html
Copyright © 2011-2022 走看看