玩坏windows扫雷之二
上一期把“无敌”这个选项加入菜单中了。这一期改为真正的无敌,另外加了个皮肤
效果图:
首先我们需要把判断踩雷的函数与插旗的函数找到。不知道怎么找的跳转: windows扫雷玩坏系列之各种玩
od载入第一期改好的文件
这里是判断是否踩雷
01003517|.55 push ebp
01003518|.56 push esi
01003519|.8B7424 10 mov esi,dword ptr ss: ;取点击的列数
0100351D|.8BC8 mov ecx,eax ;取点击的行数
0100351F|.C1E1 05 shl ecx,0x5
01003522|.8D9431 405300>lea edx,dword ptr ds: ;取点击对应处的地址
01003529|.F602 80 test byte ptr ds:,0x80
0100352C|.57 push edi
0100352D|.74 66 je short winmine.01003595 ;这里不跳,就踩中雷了
0100352F|.833D A4570001>cmp dword ptr ds:,0x0
01003536|.75 50 jnz short winmine.01003588 ;这里是判断是否是第一步,如果第一步踩中雷就不跳进行重排
01003538|.8B2D 38530001 mov ebp,dword ptr ds:
0100353E|.33C0 xor eax,eax
01003540|.40 inc eax
01003541|.3BE8 cmp ebp,eax
这里是插旗的地方
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: ;传入参数 插旗的行
010037B9|.53 push ebx ;传入参数 插旗的列
010037BA|.E8 ECF6FFFF call winmine.01002EAB ;插旗
这里为什么是传入参数0xE呢?
看过上面视频的童鞋就会知道,每个方格的内容是1个字节储存的。
字节的高4位是储存这个是否是雷 0不是雷,8是雷
字节的低4位是储存这个方格的状态的F是还未点开,E是插旗,D是问号,0就已经点开。
所以上面插旗就是传入的0xE
接下来我们来改
01003536 是踩雷之后跳向炸雷的跳转。但是在这之前应该判断一下是否勾选“无敌”,没有就执行正常的代码炸雷,有就执行插旗的函数。同样这里也没有足够的空间给我们写代码 ,所以直接跳向我们添加的区段后面。
01003536 - E9 5ABB0100 jmp winmine.0101F095
0101F095这样写
0101F095 66:833D 0000020>cmp word ptr ds:,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位是因为
0100351F|.C1E1 05 shl ecx,0x5
向左移了5位。
0101F0AD这个call会改变ecx 与 esi 的值,所以先在0101F0A6,0101F0A7把他们压栈。
到此我们就改完了,保存。
下面我们给它加个皮肤。
用E写一个加载皮肤的dll
然后用LordPE把dll改入扫雷的导入表
这里我们发现一个很神奇的事情,如果勾选了检查导入函数是否存在,LordPE会直接载入这个dll,所以我们看见LordPE也换皮肤了。
改好后就完成了。
附件里面用到的文件都有。
第一期:http://www.52pojie.cn/thread-617946-1-1.html {:301_975:}谢谢分享。。。
不知道为什么,见到这类玩法总是很喜欢。。
不知道是不是当年流行改企鹅显IP时的后遗症。。。 还有这种操作{:1_903:} 第一次知道还有这种方式,牛啊 还有这种操作 牛人啊 呵呵 有点意思 LordPE 也秀逗了? 高手啊 高手 还有这种操作?