元始天尊 发表于 2014-3-23 19:27:30

对xp扫雷内挂的分析

先介绍一下xp扫雷内挂用法:
1.打开扫雷界面
2.输入X Y Z Z Y
3.按一下右下角的shift键
这时,鼠标放在雷区活动,你会看到屏幕左上角有个小光点在一闪一闪。(很小很小的,不容易看。最好桌面是深色的,要不看不清),小光点出现,说明鼠标停在的格子不是雷,没有小光点,就是雷区!


经过快1小时的分析,得到如下代码:static int index=0;
static WCHAR str[]=L"XYZZY";
static int xCur=-1,yCur=-1;
static xBoxMax,yBoxMax;//雷区大小,初级为9*9,存储在注册表中
static BYTE data;//雷区数据

switch(uMsg)
{
   case WM_KEYDOWN:
      {
                switch(wParam)
                {
                        case VK_SHIFT:
                              if(index >= 5)
                                        index ^= 0x14;//如果前5字符正确,后面只要index>=5即可
                              return DefWindowProc();
                              break;
                              
                        case VK_F4:      
                        case VK_F5:
                        case VK_F6:
                              ...无关代码
                              break;
                              
                        default:
                              if(index < 5)
                              {
                                        if(str == wParam)
                                                index++;
                                        else
                                                index=0;
                              }
                }
      }
      break;
      
      case WM_MOUSEMOVE:
      {      
                ......
                if(index)
                {
                        if((index == 5 && wParam & MK_CONTROL) || index > 5)
                        {
                              int x=LOWORD(lParam);
                              int y=HIWORD(lParam);
                              xCur=x/16;//这个16显然可以推测为一个雷格子的大小了。。。
                              yCur=(y-39)/16;//39同样可以推测为窗口顶部到雷区上边缘长度
                              if(xCur>0 && yCur>0 && xCur<xBoxMax && yCur<yBoxMax)
                              {
                                        HDC hdc=GetDC(NULL);
                                        //注意下面data是对的,yCur代表行,然而在绘图中却是竖直方向
                                        if(data&0x80)//如果是雷
                                                SetPixel(hdc,0,0,RGB(0,0,0_);//显示为黑
                                        else
                                                SetPixel(hdc,0,0,RGB(255,255,255);                                       
                                        ReleaseDC(NULL,hdc);

                              }
                        }
                }
                break;
      }
      return DefWindowProc();
}


同样,给你们留2个问题啊
1.按照内挂用法,应该是按下5字母后按下shift,那为什么代码中是index == 5 && wParam & MK_CONTROL
而不是index == 5 && wParam & MK_SHIFT呢
我看谁能答出来啊,能答出来就说明流程你看懂了
2.另外除了xyzzy组合,你还可以输入什么序列来激活内挂?



我晕 发表于 2014-3-24 00:15:36

按下xyzzy后 不管按了什么键 最后按shift都不影响挂的激活
然后按ctrl的意思是 按了xyzzy后 不按shift 鼠标在雷区时 可以按ctrl获得当前雷块的状态
呵呵 这么个小游戏 设计得还挺人性化 为了照顾有些人不想用挂还被某个地方憋住了 所以还弄出两种作弊方式...

Anonymous 发表于 2014-3-27 20:23:11

顶一个。。。。。。。。。。。。。

神圣之光达 发表于 2014-3-30 02:44:41

哦哦哦哦哦哦哦哦哦
页: [1]
查看完整版本: 对xp扫雷内挂的分析