吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11627|回复: 93
收起左侧

[原创] 经典连连看游戏破解实现

  [复制链接]
Nattevak 发表于 2021-12-18 15:43
继上次破解扫雷后,这是我上手破解的第二个小游戏,这次选择的目标是QQ连连看,但是并不是QQ游戏里面的网络版,是从网上找的单机版,毕竟我QQ号这么多年了,我怕他封我号{:301_980:}
水平有限,水平有限
破解连连看并不是说玩个小游戏都需要去使用作弊手段,只是为了学习思路和方法{:1_893:}
此游戏辅助功能实现仅为新手小白就是我,利用游戏自带的CALL实现的一些基础功能,没有大佬的深度学习,神经网络(这里的词汇是我想到的比较牛X的词汇,不一定与此相关),纯新手文章,不足之处还望各位大佬指出,感谢{:1_893:}
  
代码部分: MFCLLK.zip (2.71 MB, 下载次数: 382)
连连看游戏链接:链接:https://pan.baidu.com/s/176znO8k00sUM5Pc-BOCg9g   提取码:7gx9

PS:先展示一下最终成品辅助界面
image.png

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

1.1

1.1


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

1.2

1.2


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

2.1.1

2.1.1


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

2.2.1

2.2.1


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

2.3.1

2.3.1


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

2.4.1

2.4.1


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

2.5.1

2.5.1


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

2.6.1

2.6.1

2.6.2

2.6.2


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

2.7.1

2.7.1

2.7.2

2.7.2

2.7.3

2.7.3


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

2.8.1

2.8.1

2.8.2

2.8.2


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

2.9.1

2.9.1



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

3.1.1

3.1.1


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

3.1.2

3.1.2


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)在连连看的数据窗口下一个内存写入断点

3.3.1

3.3.1


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

3.3.2

3.3.2


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

3.3.3

3.3.3


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)全屏消除原理是在单消的基础上增加一个循环,直至消除完成,则退出循环

3.3.4

3.3.4


2)测试代码
[C] 纯文本查看 复制代码
        //全屏消除
        CMFCLLKApp* pApp = (CMFCLLKApp*)AfxGetApp();
        //循环消除
        for (size_t i = 0; i < 100; i++)
        {
                int nRet = ::SendMessage(pApp->m_hWnd, WM_DATA2, 0, 0);
                if (nRet == -1)
                {
                        break;
                }
        }

        //判断循环结束,即坐标点为0
        if (pt1.x == 0 && pt1.x == pt1.y)
        {
                return -1;
        }

④实现炸弹
1)寻找道具炸弹的参数

3.3.5

3.3.5

3.3.6

3.3.6


2)炸弹使用效果

3.3.7

3.3.7


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)闹钟道具

3.5.1

3.5.1

3.5.2

3.5.2


2)镜子道具

3.5.3

3.5.3

3.5.4

3.5.4


3)禁手道具

3.5.5

3.5.5


4)蒙眼道具

3.5.6

3.5.6


5)障碍道具

3.5.7

3.5.7


6)重列道具

3.5.8

3.5.8



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

3.6.1

3.6.1


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
注入前

3.6.2

3.6.2


注入后

3.6.3

3.6.3


4)游戏效果图展示

3.6.4

3.6.4

免费评分

参与人数 27威望 +1 吾爱币 +48 热心值 +23 收起 理由
Camus2021 + 1 + 1 谢谢@Thanks!
wj919800373 + 1 + 1 谢谢@Thanks!
sonypsp001 + 1 + 1 谢谢@Thanks!
KP31 + 1 + 1 我很赞同!
maiwens + 1 + 1 谢谢@Thanks!
hellozhanghe + 1 + 1 热心回复!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
fanyinya + 1 + 1 热心回复!
liuhong111 + 1 + 1 热心回复!
zxougweschyjb + 1 热心回复!
YYL7535 + 1 + 1 谢谢@Thanks!
冰茶荼 + 1 我花两积分下载了个连连看.......
dbmk + 1 + 1 谢谢@Thanks!
wxue + 1 + 1 谢谢@Thanks!
lgc81034 + 1 谢谢@Thanks!
chinawolf2000 + 1 + 1 热心回复!
xushengld1 + 1 + 1 用心讨论,共获提升!
笙若 + 1 + 1 谢谢@Thanks!
plasd + 1 + 1 热心回复!
杨辣子 + 1 + 1 热心回复!
52jcool + 1 + 1 我很赞同!
gba626 + 1 我很赞同!
wy476451146 + 1 + 1 热心回复!
Myst + 2 + 1 我很赞同!
smile1110 + 3 + 1 谢谢@Thanks!
protectpai + 1 + 1 热心回复!
xsk666 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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

我很抱歉,我只是一个还没入门的新手小白,并没有这么厉害的技术,期待您分析后发布文章,我一定第一时间学习
KMn04z 发表于 2022-1-17 16:29
Nattevak 发表于 2021-12-24 08:01
请问是在32位的操作系统上运行的吗

不是,我是在64位操作系统运行的。昨天试了一下发现可以使用,还玩了一盘,结果今天再试发现又不可以了。
niuniu401 发表于 2021-12-18 16:12
aptx486900 发表于 2021-12-18 16:19
以后可以试试。
xl8802667 发表于 2021-12-18 16:25
真是想什么来什么呀,谢谢楼主
测试学学 发表于 2021-12-18 16:44
可以学习学习
kuangnuyishi 发表于 2021-12-18 16:47
经典,非常感谢楼主,
wwcc240 发表于 2021-12-18 16:50
谢谢分享啦!
icjhao 发表于 2021-12-18 17:50
哈哈哈哈哈哈现在连连连看都可以破解了
Adgerlee 发表于 2021-12-18 17:59
很有趣的游戏
ynboyinkm 发表于 2021-12-18 18:27
不错不错,是学习和练手的的好方式!!!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 00:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表