吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 13163|回复: 42
收起左侧

[原创] 对蜘蛛纸牌的详细逆向

  [复制链接]
KaQqi 发表于 2019-8-9 16:42
本帖最后由 KaQqi 于 2019-8-9 17:33 编辑

视频版本正在审核,敬请关注: https://www.bilibili.com/video/av62942317/





一、游戏简介
《蜘蛛纸牌》是由Oberon Games开发的一款休闲益智类游戏,该游戏已由Microsoft于2010年发行。
同时该游戏也是Windows ME及后续版本所自带的小游戏,游戏的目标是以最少的移动次数将牌面中的十叠牌以及待发的五组,共计八副牌整理移除。当所有牌被移除整理到界面的左下方,游戏获胜。
在“游戏”菜单上,单击“开局”开始游戏。牌面上有十叠牌,前四叠每叠6张,后六叠每叠5张,只有每叠的第一张正面朝外,其他均为正面朝内。界面的右下角有五组共计50张牌,没有全部翻开。windows xp版本中,界面的中下方的方框中显示的得分分数(开局为500分)和已操作数。vista版本中,没有该框,分数及操作数显示在界面的最下方。

TIM截图20190809160139.png


规则:https://baike.baidu.com/item/%E8%9C%98%E8%9B%9B%E7%BA%B8%E7%89%8C/877244?fr=aladdin


二、简单的一批的无限分数和0移牌
之所以要水这么容易的内容
是因为
想要实现真正的随意移牌 需要找个位置下手
每次移牌之后分数和次数都会变
从这里回溯 才能找到关键位置


使用Cheat Engine 四字节模式 搜索分数或者移牌数 多次改变搜到结果
会搜到2个 一个是真正的移动次数 一个是移动成功的次数
TIM截图20190809161429.png
我们要移动成功的次数
然后f6 找到修改地址
0102ABFC - FF 40 0C  - inc [eax+0C]
nop掉即可实现分数自定义、步数不增加
简单的一批,不多说



三.随意摆放
在od中找到这个地址。下断点。移动牌,断下
TIM截图20190809161720.png
函数很小 还没我手写的红警科技全开函数大..
所以关键函数应该不在这里
我们回溯
出来之后注明这个call是增加步数的。
TIM截图20190809161831.png
然后在段首下断点 重新移动牌。我们发现 无论是成功移动还是失败移动 都会断下来。我们将这里定义为移动牌的关键函数。
我们的第一反应就是找跳过这里的跳转,发现无法找到。
成功会增加步数 失败则不会 而是否增加步数取决于 0102D3C4  |.  385D 0B       cmp byte ptr ss:[ebp+0xB],bl
所以我们向上寻找bl 看看有没有和bl有关的跳转 或者修改bl的语句
TIM截图20190809162126.png
很快,我们就找到了第一个和bl有关的大跳转,下断点测试,发现成功时不跳 失败时跳
跳过的内容里还有一个字符串
0102D38C  |.  68 6C600001   push SpiderSo.0100606C                   ;  InvalidSequenceDropMove
二话不说 直接jmp 测试效果
TIM截图20190809162334.png
我们发现 牌是移动了 但是移动的牌卡在那里动不了 新的牌也不能往那个牌上移动 即使新的牌是合法的。。
这个挑战只是控制是否移动的 而移动后很多功能没有添加
就像我们搞红警里的随处建造一样 修改跳转需要修改很多处 而如果修改关键call则只需要修改1处
所以我们决定修改关键call
根据跟踪发现 bl的值是在上面一个超大循环中赋值的
[Asm] 纯文本查看 复制代码
0102D2DB  |> /3B45 D4       /cmp eax,[local.11]
0102D2DE  |. |73 71         |jnb short SpiderSo.0102D351
0102D2E0  |. |8B4D E0       |mov ecx,[local.8]
0102D2E3  |. |8B3C81        |mov edi,dword ptr ds:[ecx+eax*4]
0102D2E6  |. |3BFB          |cmp edi,ebx
0102D2E8  |. |74 58         |je short SpiderSo.0102D342
0102D2EA  |. |3B7D E8       |cmp edi,[local.6]
0102D2ED  |. |74 53         |je short SpiderSo.0102D342
0102D2EF  |. |8BCF          |mov ecx,edi
0102D2F1  |. |E8 D9230300   |call SpiderSo.0105F6CF
0102D2F6  |. |85C0          |test eax,eax
0102D2F8  |. |76 0C         |jbe short SpiderSo.0102D306
0102D2FA  |. |8BCF          |mov ecx,edi
0102D2FC  |. |E8 83290300   |call SpiderSo.0105FC84
0102D301  |. |3858 0D       |cmp byte ptr ds:[eax+0xD],bl
0102D304  |. |74 3C         |je short SpiderSo.0102D342
0102D306  |> |3B7E 50       |cmp edi,dword ptr ds:[esi+0x50]
0102D309  |. |74 37         |je short SpiderSo.0102D342
0102D30B  |. |57            |push edi
0102D30C  |. |FF75 08       |push [arg.1]
0102D30F  |. |8BCE          |mov ecx,esi
0102D311     |E8 95E9FFFF   call SpiderSo.0102BCAB
0102D316  |. |84C0          |test al,al
0102D318  |. |75 11         |jnz short SpiderSo.0102D32B
0102D31A  |. |C645 F3 01    |mov byte ptr ss:[ebp-0xD],0x1
0102D31E  |. |885D F2       |mov byte ptr ss:[ebp-0xE],bl
0102D321  |. |395D EC       |cmp [local.5],ebx
0102D324  |. |75 1C         |jnz short SpiderSo.0102D342
0102D326  |. |897D EC       |mov [local.5],edi
0102D329  |. |EB 17         |jmp short SpiderSo.0102D342
0102D32B  |> |57            |push edi
0102D32C  |. |FF76 50       |push dword ptr ds:[esi+0x50]
0102D32F  |. |8BCE          |mov ecx,esi
0102D331  |. |FF75 E8       |push [local.6]
0102D334  |. |E8 9FFAFFFF   |call SpiderSo.0102CDD8
0102D339  |. |885D F3       |mov byte ptr ss:[ebp-0xD],bl
0102D33C  |. |885D F2       |mov byte ptr ss:[ebp-0xE],bl
0102D33F  |. |885D F1       |mov byte ptr ss:[ebp-0xF],bl
0102D342  |> |8B45 E4       |mov eax,[local.7]
0102D345  |. |8B7D EC       |mov edi,[local.5]                       ;  ntdll.77F46F6C
0102D348  |. |40            |inc eax
0102D349  |> |8945 E4        mov [local.7],eax
0102D34C  |. |385D F1       |cmp byte ptr ss:[ebp-0xF],bl
0102D34F  |.^\75 8A         \jnz short SpiderSo.0102D2DB


由于这个循环比较复杂 我决定上IDA
我们很快找到了上面所说的循环、跳转、增加步数的函数 并分别给他们重命名
TIM截图20190809162719.png
[Asm] 纯文本查看 复制代码
if ( v21 || v22 )                             // 0
  {
    v24 = 0;
    if ( v22
      && v9 != *(Concurrency::details::SchedulingRing **)(v3 + 48)
      && v9 != *(Concurrency::details::SchedulingRing **)(v3 + 80) )
    {
      if ( v9 && Concurrency::details::SchedulingRing::Id(v9) && sub_105FC84(v9) )
        sub_102AF7C(v3, L"InvalidSequenceDropMove", 0);
      sub_10315B6(7, 0, 0);
LABEL_36:
      v24 = 0;
      goto LABEL_37;
    }
    if ( v21 )
    {
      if ( v13 )
        *(_BYTE *)a3 = 1;
      goto LABEL_36;
    }
  }

我们发现 这个跳转是由v21和v22控制的 都为0则执行 而v21 22的初始值分别为1、0 所以我们只需找到给他们赋值0的地方就行了
TIM截图20190809162843.png
在超大循环之中 我们找到了给v21和v22赋值的地方。而有一处,直接给他们俩都赋值为0。
TIM截图20190809163006.png
而这一处是否执行 是由 sub_102BCAB的返回值控制的
于是我们直接在汇编里把call  sub_102BCAB nop掉 mov eax,1
然后崩溃了。。
那就说明这个函数还做了别的事情
我们继续反编译 sub_102BCAB 看看怎么修改返回值
TIM截图20190809163147.png
这个函数的返回值就是sub_1029FF5的返回值 我们继续反编译sub_1029FF5
TIM截图20190809163223.png
我们需要返回值是1 只需要不让那个if(a2)执行即可。在汇编中找到对应代码 直接jmp
TIM截图20190809163322.png
搞定。


这样就可以不管谁在上谁在下 直接随便移动了

TIM截图20190809163439.png



四、随意移牌
我们玩了一会之后发现 这样移动牌还是不够随意。。
因为:
TIM截图20190809163609.png
而我们刚刚在逆向的过程中发现 无论是sub_102BCAB 还是sub_102D1DF 都是类SpiderGame的函数。
我们看看这个类内有没有别的函数 能直接从名字入手 达到随意移牌
经过10分钟的筛选 我们发现有一个可疑字符串:
TIM截图20190809163817.png
这就是判断能否drag的函数了。
在下方发现一个可疑跳转
TIM截图20190809163847.png
改成jmp 完事!
这次没有出现功能不完全的情况..



然后 我们就能快快乐乐开开心心的玩了!!


结束语:
这是腐朽的终结 也是新生的萌芽
开启的是黑暗 也是茫然


其实之前逆向了很多游戏 比如扫雷、植物大战僵尸 但是这些论坛里已经有人逆向过了 所以视频就没有发..
只有逆向别人没有逆向的 或许才能获得新生的萌芽8


视频版本已经在上传 正在审核 审核通过将发过来。
https://www.bilibili.com/video/av62942317/
TIM截图20190809162126.png

免费评分

参与人数 22威望 +1 吾爱币 +34 热心值 +18 收起 理由
huaning + 1 + 1 谢谢@Thanks!
Hmily + 1 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lida + 1 我很赞同!
gongdragon + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
网络连接中__ + 1 + 1 我很赞同!
海天一色001 + 1 + 1 谢谢@Thanks!
yosuganosora + 1 谢谢@Thanks!
www.52pojie.cn + 1 + 1 谢谢@Thanks!
gaga520451 + 1 群主好棒
不如吃茶去 + 1 + 1 用心讨论,共获提升!
光头鸠摩智 + 1 + 1 热心回复!
zyu + 1 + 1 膜拜大佬!
zbaby523 + 1 + 1 谢谢@Thanks!
linrunqing521 + 1 挺厉害啊 大神
Lecoeur + 1 + 1 谢谢@Thanks!
挂科的大学狗 + 1 + 1 我很赞同!
龘譶飍靐 + 1 决定把分送给你
笙若 + 1 + 1 谢谢@Thanks!
xiluoyou + 1 + 1 利害啊!
Cyntec + 2 终于把魔爪伸向蜘蛛纸牌了吗?
CrazyNut + 3 + 1 膜拜大佬
GenW + 6 + 1 膜拜大佬!

查看全部评分

本帖被以下淘专辑推荐:

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

 楼主| KaQqi 发表于 2019-8-16 11:33
xiluoyou 发表于 2019-8-9 17:05
原来是WIN7的,我还以为是XP的,但WES7下不能打开,怎么弄?

把2处地址改一下就行
随便拖动
0102B275     /EB 2C         jmp short SpiderSo.0102B2A3

能放下
0102D311  |.  E8 95E9FFFF   |call SpiderSo.0102BCAB
0102A010     /EB 14         jmp short SpiderSo.0102A026


 楼主| KaQqi 发表于 2019-8-9 16:44
本帖最后由 KaQqi 于 2019-8-9 17:34 编辑

蜘蛛纸牌破解版:

要替换到c programFiles microsoft game里蜘蛛纸牌里

SpiderSolitaire.zip

354.61 KB, 下载次数: 127, 下载积分: 吾爱币 -1 CB

Cyntec 发表于 2019-8-9 17:03
xiluoyou 发表于 2019-8-9 17:05
原来是WIN7的,我还以为是XP的,但WES7下不能打开,怎么弄?
陽光盛開悳夏季 发表于 2019-8-9 17:18
w7打不开
fanvalen 发表于 2019-8-9 19:15
话说你们那些想玩的自己照这地址修该就完了呗
iamqlj123 发表于 2019-8-9 19:42
以前最喜欢的一个游戏,比扫雷还上瘾,可惜很久没玩过了。
仔仔禧 发表于 2019-8-9 20:19
额,记得小时候整天玩这个,现在好久没玩这个了
小糊涂虫 发表于 2019-8-9 20:52
都是高手 ,膜拜一下。
yzxqhdx 发表于 2019-8-9 21:22
这玩意也有人逆向吗?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-16 05:57

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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