对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组合,你还可以输入什么序列来激活内挂?
按下xyzzy后 不管按了什么键 最后按shift都不影响挂的激活
然后按ctrl的意思是 按了xyzzy后 不按shift 鼠标在雷区时 可以按ctrl获得当前雷块的状态
呵呵 这么个小游戏 设计得还挺人性化 为了照顾有些人不想用挂还被某个地方憋住了 所以还弄出两种作弊方式... 顶一个。。。。。。。。。。。。。 哦哦哦哦哦哦哦哦哦
页:
[1]