email:kisser1@126.com
QQ:87784858
把这条指令:
010036FA |. 8008 80 or byte ptr ds:[eax], 80 //置雷(0x8F为地雷标志)
改成:
010036FA 8030 81 xor byte ptr ds:[eax], 81 //置雷(0x8F为地雷标志)
保存即可
1、用OD载入winmine.exe(扫雷)
2、OD停在程序入口处,按Ctrn+N,找到函数rand,右击->"在每个参考上设置断点"
3、F9运行,OD拦截并停在地址为:01003940处
01003940 /$ FF15 B0110001 call near dword ptr ds:[<&msvcrt.rand>; [rand
01003946 |. 99 cdq
01003947 |. F77C24 04 idiv dword ptr ss:[esp+4]
0100394B |. 8BC2 mov eax, edx
0100394D \. C2 0400 retn 4
4、F8单步回上一层函数(核心函数),简单分析如下:
0100367A /$ A1 AC560001 mov eax, dword ptr ds:[10056AC] //宽度
0100367F |. 8B0D A8560001 mov ecx, dword ptr ds:[10056A8] //高度
01003685 |. 53 push ebx
01003686 |. 56 push esi
01003687 |. 57 push edi
01003688 |. 33FF xor edi, edi
0100368A |. 3B05 34530001 cmp eax, dword ptr ds:[1005334]
01003690 |. 893D 64510001 mov dword ptr ds:[1005164], edi
01003696 |. 75 0C jnz short winmine.010036A4
01003698 |. 3B0D 38530001 cmp ecx, dword ptr ds:[1005338]
0100369E |. 75 04 jnz short winmine.010036A4
010036A0 |. 6A 04 push 4
010036A2 |. EB 02 jmp short winmine.010036A6
010036A4 |> 6A 06 push 6
010036A6 |> 5B pop ebx
010036A7 |. A3 34530001 mov dword ptr ds:[1005334], eax
010036AC |. 890D 38530001 mov dword ptr ds:[1005338], ecx
010036B2 |. E8 1EF8FFFF call winmine.01002ED5
010036B7 |. A1 A4560001 mov eax, dword ptr ds:[10056A4] //雷数
010036BC |. 893D 60510001 mov dword ptr ds:[1005160], edi
010036C2 |. A3 30530001 mov dword ptr ds:[1005330], eax
010036C7 |> FF35 34530001 push dword ptr ds:[1005334] //置雷开始
010036CD |. E8 6E020000 call winmine.01003940
010036D2 |. FF35 38530001 push dword ptr ds:[1005338]
010036D8 |. 8BF0 mov esi, eax
010036DA |. 46 inc esi
010036DB |. E8 60020000 call winmine.01003940
010036E0 |. 40 inc eax
010036E1 |. 8BC8 mov ecx, eax
010036E3 |. C1E1 05 shl ecx, 5
010036E6 |. F68431 405300>test byte ptr ds:[ecx+esi+1005340], 8>
010036EE |.^ 75 D7 jnz short winmine.010036C7
010036F0 |. C1E0 05 shl eax, 5
010036F3 |. 8D8430 405300>lea eax, dword ptr ds:[eax+esi+10053>
010036FA |. 8008 80 or byte ptr ds:[eax], 80 //置雷(0x8F为地雷标志)
010036FD |. FF0D 30530001 dec dword ptr ds:[1005330]
01003703 |.^ 75 C2 jnz short winmine.010036C7 //所有地雷都放置好了?
01003705 |. 8B0D 38530001 mov ecx, dword ptr ds:[1005338]
0100370B |. 0FAF0D 345300>imul ecx, dword ptr ds:[1005334]
01003712 |. A1 A4560001 mov eax, dword ptr ds:[10056A4]
01003717 |. 2BC8 sub ecx, eax
01003719 |. 57 push edi
0100371A |. 893D 9C570001 mov dword ptr ds:[100579C], edi
01003720 |. A3 30530001 mov dword ptr ds:[1005330], eax
01003725 |. A3 94510001 mov dword ptr ds:[1005194], eax
0100372A |. 893D A4570001 mov dword ptr ds:[10057A4], edi
01003730 |. 890D A0570001 mov dword ptr ds:[10057A0], ecx
01003736 |. C705 00500001>mov dword ptr ds:[1005000], 1
01003740 |. E8 25FDFFFF call winmine.0100346A
01003745 |. 53 push ebx ; /Arg1
01003746 |. E8 05E2FFFF call winmine.01001950 ; \winmine.01001950
0100374B |. 5F pop edi
0100374C |. 5E pop esi
0100374D |. 5B pop ebx
0100374E \. C3 retn
OK,找到了关键的一条指令了吗?请看下面这条指令:
010036FA |. 8008 80 or byte ptr ds:[eax], 80 //置雷(0x8F为地雷标志)
经过试验,ds:[eax]中的内容如果改成9F,扫雷界面上,就是被挖了的方块。
下面是扫雷的一些数据意思:
8F 表示 地雷方块
8E 表示 有旗方块
8D 表示 问号方块
8A 表示 黑色地雷(挂了的时候所显示的)
挖了之后的数字提示对应规则:
41 42 43 44 45 46 47 48 49
1 2 3 4 5 6 7 8 ?
其他表示被挖了的方块,但无数字提示。
现在,再来看这指令:
010036FA |. 8008 80 or byte ptr ds:[eax], 80 //置雷(0x8F为地雷标志)
如果ds:[eax]的内容是0x8E的话,那么,扫雷的界面上会给方块画上旗子。
该如何使ds:[eax]的内容变成0x8E呢?用免杀的方法jmp去空白地方?方法由你自己选,我为了
省事,把它的值计算了一下
00001111 =0f
xor 10000001 =81
-------------------
10001110 =8e
答案得出来了,改成如下:
010036FA 8030 81 xor byte ptr ds:[eax], 81 //置雷(0x8F为地雷标志)
OK,大功告成了!把修改过的保存下就完事了。睡觉喽~
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!