经典连连看游戏破解实现

查看 171|回复 11
作者:Nattevak   
继上次破解扫雷后,这是我上手破解的第二个小游戏,这次选择的目标是QQ连连看,但是并不是QQ游戏里面的网络版,是从网上找的单机版,毕竟我QQ号这么多年了,我怕他封我号{:301_980:}
水平有限,水平有限
破解连连看并不是说玩个小游戏都需要去使用作弊手段,只是为了学习思路和方法{:1_893:}
此游戏辅助功能实现仅为新手小白就是我,利用游戏自带的CALL实现的一些基础功能,没有大佬的深度学习,神经网络(这里的词汇是我想到的比较牛X的词汇,不一定与此相关),纯新手文章,不足之处还望各位大佬指出,感谢{:1_893:}
  
代码部分:

MFCLLK.zip
(2.71 MB, 下载次数: 313)
2021-12-18 16:19 上传
点击文件名下载附件
辅助工具代码及界面
下载积分: 吾爱币 -1 CB

连连看游戏链接:链接:https://pan.baidu.com/s/176znO8k00sUM5Pc-BOCg9g   提取码:7gx9
PS:先展示一下最终成品辅助界面


image.png (40.29 KB, 下载次数: 0)
下载附件
2021-12-18 15:10 上传

一、数据分析
1.游戏时间
找到时间的地址,之后通过NOP时间可以实现0秒通关的效果。


image.png (170.88 KB, 下载次数: 0)
下载附件
1.1
2021-12-18 15:15 上传

2.方块数量
同样的搜索方法寻找到方块数量,其实这里最后也没用上。


image.png (432.79 KB, 下载次数: 0)
下载附件
1.2
2021-12-18 15:18 上传

二、游戏分析
1.在rand函数处下断点
由于连连看游戏每一局的方块排布都是不相同的,所以肯定会有Rand函数,这里就从Rand函数的位置下手


image.png (107.51 KB, 下载次数: 0)
下载附件
2.1.1
2021-12-18 15:21 上传

2.重新排列游戏时触法断点,通过栈回溯寻找数组基地址


image.png (158.95 KB, 下载次数: 0)
下载附件
2.2.1
2021-12-18 15:22 上传

3.在初始化数组的下方找到了疑似初始化操作的地址,循环结束后对比内存中的数据与游戏数据
这个位置需要多观察,尤其需要注意数据窗口的情况


image.png (299.78 KB, 下载次数: 0)
下载附件
2.3.1
2021-12-18 15:22 上传

4.循环结束后观察内存数据与游戏界面,可以发现相同值对应的图案也相同


image.png (209.13 KB, 下载次数: 0)
下载附件
2.4.1
2021-12-18 15:24 上传

5.接下来分析指南针道具,设置内存访问断点


image.png (155.84 KB, 下载次数: 0)
下载附件
2.5.1
2021-12-18 15:25 上传

6.程序断下来都进行栈回溯,因为不能明确具体是哪一个CALL,故将每个CALL都设置上断点,逐一尝试


image.png (49.12 KB, 下载次数: 0)
下载附件
2.6.1
2021-12-18 15:25 上传



image.png (156.01 KB, 下载次数: 0)
下载附件
2.6.2
2021-12-18 15:25 上传

7.找到指南针连接的两个地址


image.png (141.88 KB, 下载次数: 0)
下载附件
2.7.1
2021-12-18 15:26 上传



image.png (380.7 KB, 下载次数: 0)
下载附件
2.7.2
2021-12-18 15:26 上传



image.png (129.7 KB, 下载次数: 0)
下载附件
2.7.3
2021-12-18 15:27 上传

8.寻找ECX赋值的位置,此处复制ESI的值去CE中搜索


image.png (80.47 KB, 下载次数: 0)
下载附件
2.8.1
2021-12-18 15:28 上传



image.png (202.12 KB, 下载次数: 0)
下载附件
2.8.2
2021-12-18 15:28 上传

9.确定45DEBC为我们寻找的地址


image.png (195.75 KB, 下载次数: 0)
下载附件
2.9.1
2021-12-18 15:29 上传

三、DLL注入
1.使用PCHunter查看连连看程序的消息钩子


image.png (182.65 KB, 下载次数: 0)
下载附件
3.1.1
2021-12-18 15:32 上传

2.使用Spy++获取窗口名


image.png (144.16 KB, 下载次数: 0)
下载附件
3.1.2
2021-12-18 15:32 上传

3.编写对应功能代码
①指南针
1)指南针CALL调用顺序
      调用道具CALL
            0041DE5C |. FF50 28 CALL DWORD PTR DS:[EAX+0x28] ; 使用道具 41E691
      调用指南针CALL
            0041E696 . E8 C5960100 CALL kyodai1.00437D60 ; 指南针 41E76C
      获取连接点
            0041E76C . E8 CEAA0000 CALL kyodai1.0042923F ; 获取两个可以连接的点
2)测试代码
[C] 纯文本查看 复制代码if (Msg == WM_DATA1)
    {
        //指南针
        OutputDebugString(L"指南针");
        //0x45DEBC
        //0041DE4D | .  8B86 94040000 MOV EAX, DWORD PTR DS : [ESI + 0x494]
        //0041DE53 | .  8D8E 94040000 LEA ECX, DWORD PTR DS : [ESI + 0x494] ;  ECX赋值
        //0041DE59 | .  52            PUSH EDX
        //0041DE5A | .  53            PUSH EBX
        //0041DE5B | .  53            PUSH EBX
        //0041DE5C | .FF50 28       CALL DWORD PTR DS : [EAX + 0x28] ;  使用道具 41E691
        _asm {
            mov ecx,0x45DEBC
            mov ecx, [ecx]
            lea ecx,DWORD PTR ds:[ecx + 0x494]
            push 0xF0
            push 0
            push 0
            mov eax,0x0041E691
            call eax
        }
        return DefWindowProc(hWnd, Msg, wParam, lParam);
    }
②实现单消
1)在连连看的数据窗口下一个内存写入断点


image.png (235.92 KB, 下载次数: 0)
下载附件
3.3.1
2021-12-18 15:36 上传

2)通过栈回溯找到调用的CALL


image.png (97.82 KB, 下载次数: 0)
下载附件
3.3.2
2021-12-18 15:37 上传

3)在反汇编代码中找到消除CALL


image.png (190.2 KB, 下载次数: 0)
下载附件
3.3.3
2021-12-18 15:37 上传

4)测试代码
[C] 纯文本查看 复制代码if (Msg == WM_DATA2)
    {
        //0041E75E > \8B8E F0190000 MOV ECX, DWORD PTR DS : [ESI + 0x19F0] ;  Case F0(BM_GETCHECK) of switch 0041E749
        //0041E764                  .  8D45 D8       LEA EAX, DWORD PTR SS : [EBP - 0x28]
        //0041E767                  .  50            PUSH EAX
        //0041E768                  .  8D45 E0       LEA EAX, DWORD PTR SS : [EBP - 0x20]
        //0041E76B                  .  50            PUSH EAX
        //0041E76C.E8 CEAA0000   CALL kyodai1.0042923F;  获取两个可以连接的点
        //1.获取可以连接的两个点
        POINT pt1 = { 0 };
        POINT pt2 = { 0 };
        _asm {
            mov ecx, 0x45DEBC
            mov ecx, [ecx]
            lea ecx, DWORD PTR ds : [ecx + 0x494]
            mov ecx, DWORD PTR ds : [ecx + 0x19F0]
            lea eax, pt1.x
            push eax
            lea eax, pt2.x
            push eax
            mov eax, 0x0042923F
            call eax //获取可以消除的图案坐标
        }
        
        CString strCode;
        strCode.Format(L"pt1:%d,%d pt2:%d,%d", pt1.x, pt1.y, pt2.x, pt2.y);
        OutputDebugString(strCode.GetBuffer());
        //2.调用消除CALL
        //00129BB8   00000000  0
        //00129BBC   0012BB50  数组地址
        //00129BC0   00129BEC  坐标点1
        //00129BC4   00129BF4  坐标点2
        //00129BC8   014AB930  坐标点数组
        //00129BCC   00000002  数值
        _asm {
            mov ecx, 0x45DEBC
            mov ecx, [ecx]                          //传递ecx的值  
            push 0x4                                //参数1 固定值        
            lea eax, DWORD PTR ds : [ecx + 0x494]   //0012BB50
            mov eax, DWORD PTR ds : [eax + 0x19F0]
            add eax, 0x40
            push eax                                //参数2 变量地址 坐标数组地址  
            lea eax, pt1.x                          //参数3 点1地址  
            push eax
            lea eax, pt2.x                          //参数4 点2地址  
            push eax
            lea eax, DWORD PTR ds : [ecx + 0x494]   //014AB930
            mov eax, DWORD PTR ds : [eax + 0x19F0]
            mov eax, DWORD PTR ds : [eax + 0x4]
            push eax                                //参数5 数组地址
            push 0                                  //参数6 0  
            
            mov eax, 0x0041C68E                     //CALL kyodai1.0041C68E
            call eax                                //调用消除  
        }
        return DefWindowProc(hWnd, Msg, wParam, lParam);
    }
③全屏消除
1)全屏消除原理是在单消的基础上增加一个循环,直至消除完成,则退出循环


image.png (228.73 KB, 下载次数: 0)
下载附件
3.3.4
2021-12-18 15:38 上传

2)测试代码
[C] 纯文本查看 复制代码        //全屏消除
        CMFCLLKApp* pApp = (CMFCLLKApp*)AfxGetApp();
        //循环消除
        for (size_t i = 0; i m_hWnd, WM_DATA2, 0, 0);
                if (nRet == -1)
                {
                        break;
                }
        }
        //判断循环结束,即坐标点为0
        if (pt1.x == 0 && pt1.x == pt1.y)
        {
                return -1;
        }
④实现炸弹
1)寻找道具炸弹的参数


image.png (125.34 KB, 下载次数: 0)
下载附件
3.3.5
2021-12-18 15:39 上传



image.png (123.15 KB, 下载次数: 0)
下载附件
3.3.6
2021-12-18 15:39 上传

2)炸弹使用效果


image.png (342.45 KB, 下载次数: 0)
下载附件
3.3.7
2021-12-18 15:40 上传

3)测试代码
[C] 纯文本查看 复制代码if (Msg == WM_DATA3)
    {
        //炸弹
        OutputDebugString(L"炸弹");
        _asm {
            mov ecx, 0x45DEBC
            mov ecx, [ecx]
            lea ecx, DWORD PTR ds : [ecx + 0x494]
            push 0xF4   //与指南针道理大致相同,仅道具的参数不同(指南针此处为0xF0)
            push 0
            push 0
            mov eax, 0x0041E691
            call eax
        }
        return DefWindowProc(hWnd, Msg, wParam, lParam);
    }
⑤道具拓展
代码部分均参考道具炸弹的修改部分,即可实现其余拓展道具功能
1)闹钟道具


image.png (126.73 KB, 下载次数: 0)
下载附件
3.5.1
2021-12-18 15:41 上传



image.png (129.94 KB, 下载次数: 0)
下载附件
3.5.2
2021-12-18 15:41 上传

2)镜子道具


image.png (137.66 KB, 下载次数: 0)
下载附件
3.5.3
2021-12-18 15:42 上传



image.png (144.53 KB, 下载次数: 0)
下载附件
3.5.4
2021-12-18 15:42 上传

3)禁手道具


image.png (116.15 KB, 下载次数: 0)
下载附件
3.5.5
2021-12-18 15:42 上传

4)蒙眼道具


image.png (115.88 KB, 下载次数: 0)
下载附件
3.5.6
2021-12-18 15:43 上传

5)障碍道具


image.png (124.17 KB, 下载次数: 0)
下载附件
3.5.7
2021-12-18 15:43 上传

6)重列道具


image.png (117.4 KB, 下载次数: 0)
下载附件
3.5.8
2021-12-18 15:43 上传

⑥无限时间
NOP时间关键代码,这里的时间比扫雷的还要简单一点
1)使用CE工具NOP掉DEC DWORD PTR DS:[ESI+0xC0]


image.png (195.55 KB, 下载次数: 0)
下载附件
3.6.1
2021-12-18 15:46 上传

2)根据CE原理编写NOP代码
这里的NOP代码和扫雷基本上是一致的,扫雷还需要NOP两个位置的时间自增,这里只有一个地方,更简单一点
[C] 纯文本查看 复制代码    //获取连连看进程ID   
    GetWindowThreadProcessId(hWnd, &Pid);
    //获取连连看进程句柄
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
    //将时间自增的语句使用NOP填充
    result = WriteProcessMemory(hProcess, (LPVOID)g_pTime, &szInc, 6, 0);
3)注入DLL
注入前


image.png (77.88 KB, 下载次数: 0)
下载附件
3.6.2
2021-12-18 15:48 上传

注入后


image.png (58.78 KB, 下载次数: 0)
下载附件
3.6.3
2021-12-18 15:48 上传

4)游戏效果图展示


image.png (237.9 KB, 下载次数: 0)
下载附件
3.6.4
2021-12-18 15:49 上传

下载次数, 下载附件

Nattevak
OP
  


侃遍天下无二人 发表于 2021-12-18 20:40
楼主有兴趣分析分析小幸姐的古剑修改器是怎么做的吗

我很抱歉,我只是一个还没入门的新手小白,并没有这么厉害的技术,期待您分析后发布文章,我一定第一时间学习
KMn04z   


Nattevak 发表于 2021-12-24 08:01
请问是在32位的操作系统上运行的吗

不是,我是在64位操作系统运行的。昨天试了一下发现可以使用,还玩了一盘,结果今天再试发现又不可以了。
niuniu401   

学习啦,刚好可以跟着操作一下
aptx486900   

以后可以试试。
xl8802667   

真是想什么来什么呀,谢谢楼主
测试学学   

可以学习学习
kuangnuyishi   

经典,非常感谢楼主,
wwcc240   

谢谢分享啦!
icjhao   

哈哈哈哈哈哈现在连连连看都可以破解了
您需要登录后才可以回帖 登录 | 立即注册

返回顶部