首页
社区
课程
招聘
[原创]扫雷终极爆破法,只改一条指令
发表于: 2007-8-13 11:29 7566

[原创]扫雷终极爆破法,只改一条指令

2007-8-13 11:29
7566
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,大功告成了!把修改过的保存下就完事了。睡觉喽~

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
2
可怜的扫雷 你咋这么可怜啊
2007-8-13 11:48
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
3
呵呵,越来越精彩了。
2007-8-13 12:07
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
4
不过这里面有个问题,就是有标志的地方不一定是雷。这个是目前的缺陷。
2007-8-13 12:13
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
简直是太无耻了
2007-8-13 12:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错,呵。。
2007-8-13 14:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
高,真是精彩
2007-8-14 21:05
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
8
厉害哦... 哈哈
2007-8-14 21:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ttj
9
这个破了没意思了,
2007-8-19 00:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
什么版本的啊,我的怎么不一样
2007-8-19 00:50
0
游客
登录 | 注册 方可回帖
返回
//