上一期把“无敌”这个选项加入菜单中了。
这一期改为真正的无敌,另外加了个皮肤
效果图:
首先我们需要把判断踩雷的函数与插旗的函数找到。不知道怎么找的跳转:[Windows] windows扫雷玩坏系列之各种玩
od载入第一期改好的文件
这里是判断是否踩雷
[Asm] 纯文本查看 复制代码 01003517 |. 55 push ebp
01003518 |. 56 push esi
01003519 |. 8B7424 10 mov esi,dword ptr ss:[esp+0x10] ; 取点击的列数
0100351D |. 8BC8 mov ecx,eax ; 取点击的行数
0100351F |. C1E1 05 shl ecx,0x5
01003522 |. 8D9431 405300>lea edx,dword ptr ds:[ecx+esi+0x1005340] ; 取点击对应处的地址
01003529 |. F602 80 test byte ptr ds:[edx],0x80
0100352C |. 57 push edi
0100352D |. 74 66 je short winmine.01003595 ; 这里不跳,就踩中雷了
0100352F |. 833D A4570001>cmp dword ptr ds:[0x10057A4],0x0
01003536 |. 75 50 jnz short winmine.01003588 ; 这里是判断是否是第一步,如果第一步踩中雷就不跳进行重排
01003538 |. 8B2D 38530001 mov ebp,dword ptr ds:[0x1005338]
0100353E |. 33C0 xor eax,eax
01003540 |. 40 inc eax
01003541 |. 3BE8 cmp ebp,eax
这里是插旗的地方
[Asm] 纯文本查看 复制代码 010037AA |> \6A 0E push 0xE
010037AC |. 5F pop edi
010037AD |. 6A FF push -0x1
010037AF |> E8 B6FCFFFF call winmine.0100346A ; 剩余雷数-1
010037B4 |> 57 push edi ; 传入参数次 0xE
010037B5 |. FF7424 18 push dword ptr ss:[esp+0x18] ; 传入参数 插旗的行
010037B9 |. 53 push ebx ; 传入参数 插旗的列
010037BA |. E8 ECF6FFFF call winmine.01002EAB ; 插旗
这里为什么是传入参数0xE呢?
看过上面视频的童鞋就会知道,每个方格的内容是1个字节储存的。
字节的高4位是储存这个是否是雷 0不是雷,8是雷
字节的低4位是储存这个方格的状态的 F是还未点开,E是插旗,D是问号,0就已经点开。
所以上面插旗就是传入的0xE
接下来我们来改
01003536 是踩雷之后跳向炸雷的跳转。但是在这之前应该判断一下是否勾选“无敌”,没有就执行正常的代码炸雷,有就执行插旗的函数。同样这里也没有足够的空间给我们写代码 ,所以直接跳向我们添加的区段后面。
[Asm] 纯文本查看 复制代码 01003536 - E9 5ABB0100 jmp winmine.0101F095
0101F095这样写
[Asm] 纯文本查看 复制代码 0101F095 66:833D 0000020>cmp word ptr ds:[0x1020000],0x1 ; 还记得0x1020000保存的什么吗?
0101F09D 74 05 je short winmine.0101F0A4 ; 先判断是否勾选了“无敌”,勾选了就跳
0101F09F - E9 E444FEFF jmp winmine.01003588 ; 没勾选“无敌”往回跳,执行正常炸雷代码
0101F0A4 60 pushad
0101F0A5 9C pushfd ; 保护现场。
0101F0A6 51 push ecx ; 保存行
0101F0A7 56 push esi ; 保存列
0101F0A8 6A 0E push 0xE
0101F0AA 5F pop edi
0101F0AB 6A FF push -0x1
0101F0AD E8 B843FEFF call winmine.0100346A ; 上面3句直接抄之前的代码
0101F0B2 5E pop esi ; 恢复列
0101F0B3 59 pop ecx ; 恢复行
0101F0B4 C1E9 05 shr ecx,0x5 ; 把ecx向右移5位
0101F0B7 6A 0E push 0xE
0101F0B9 51 push ecx
0101F0BA 56 push esi ; winmine.01005407
0101F0BB E8 EB3DFEFF call winmine.01002EAB ; 插旗
0101F0C0 9D popfd
0101F0C1 61 popad ; 恢复现场
0101F0C2 - E9 CE44FEFF jmp winmine.01003595 ; 跳回正常代码
0101F0B4把ecx向右移5位是因为
[Asm] 纯文本查看 复制代码 0100351F |. C1E1 05 shl ecx,0x5
向左移了5位。
0101F0AD这个call会改变ecx 与 esi 的值,所以先在0101F0A6,0101F0A7把他们压栈。
到此我们就改完了,保存。
下面我们给它加个皮肤。
用E写一个加载皮肤的dll
然后用LordPE把dll改入扫雷的导入表
这里我们发现一个很神奇的事情,如果勾选了检查导入函数是否存在,LordPE会直接载入这个dll,所以我们看见LordPE也换皮肤了。
改好后就完成了。
附件里面用到的文件都有。
2.zip
(686.12 KB, 下载次数: 425)
第一期:http://www.52pojie.cn/thread-617946-1-1.html |