1364847132 发表于 2017-6-20 02:17

玩坏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

qaz003 发表于 2017-6-20 03:23

{:301_975:}谢谢分享。。。
不知道为什么,见到这类玩法总是很喜欢。。
不知道是不是当年流行改企鹅显IP时的后遗症。。。

hhhhhhaa 发表于 2017-6-20 02:48

还有这种操作{:1_903:}

dszsdyx 发表于 2017-6-20 03:40

第一次知道还有这种方式,牛啊

yuedingwangji 发表于 2017-6-20 04:16

还有这种操作

tfrist 发表于 2017-6-20 05:03

牛人啊 呵呵 有点意思

tfrist 发表于 2017-6-20 05:06

LordPE 也秀逗了?

chen1234 发表于 2017-6-20 06:34

午夜流星 发表于 2017-6-20 07:12

高手啊 高手

大江守山人 发表于 2017-6-20 07:25

还有这种操作?
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 玩坏windows扫雷之二