錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務,錦州廣廈維修電腦,公司IT外包服務
topFlag1 設為首頁
topFlag3 收藏本站
 
maojin003 首 頁 公司介紹 服務項目 服務報價 維修流程 IT外包服務 服務器維護 技術文章 常見故障
錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務技術文章
玩壞windows掃雷之一

作者: 佚名  日期:2017-06-20 16:13:13   來源: 本站整理

本帖最后由 1364847132 于 2017-6-20 02:19 編輯

前幾天看見吾愛的一個帖子:windows掃雷玩壞系列之各種玩 好像很好玩的樣子。
反正高考完了沒事做,然后我就繼續改了一下這個。有不足之處請大家指出。
效果圖:  增加了無敵這個選項。
需要工具:
1.資源工具,這里我用的Restorator(就是吾愛破解工具包里的那個)。
2.LordPE,用來加區段的。也可以用現成的工具:[PEtools] EXE區段添加,支持區段名 空間大小設置
3.od

首先用Restorator打開掃雷,按F6打開編輯模式改成這樣
 
把每個選項后面的數字記下來(我也不知道那叫啥) 我們添加的選項后面是十進制的530,十六進制就是0x212.然后保存。
保存后打開發現菜單里已經有了這個選項,但是并沒有什么實際作用,F在來給它添加點內容
od載入,下斷bp SetMenu,F9運行。
停下來后取消斷點Alt+F9執行到用戶代碼。來到了這里。
[Asm] 純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
01003CE5  /$  8B4424 04     mov eax,dword ptr ss:[esp+0x4]
01003CE9  |.  A3 C4560001   mov dword ptr ds:[0x10056C4],eax
01003CEE  |.  E8 23D8FFFF   call winmine.01001516
01003CF3  |.  A1 C4560001   mov eax,dword ptr ds:[0x10056C4]
01003CF8  |.  24 01         and al,0x1
01003CFA  |.  F6D8          neg al
01003CFC  |.  1BC0          sbb eax,eax
01003CFE  |.  F7D0          not eax
01003D00  |.  2305 945A0001 and eax,dword ptr ds:[0x1005A94]
01003D06  |.  50            push eax                                ; /hMenu = 00000001
01003D07  |.  FF35 245B0001 push dword ptr ds:[0x1005B24]           ; |hWnd = 01E7015A ('掃雷',class='掃雷')
01003D0D  |.  FF15 C4100001 call dword ptr ds:[<&USER32.SetMenu>]   ; \SetMenu
01003D13  |.  6A 02         push 0x2
01003D15  |.  E8 36DCFFFF   call winmine.01001950
01003D1A  \.  C2 0400       retn 0x4

我們進第一個call看看。發現里面的所有call都指向了01003CC4,再看看push的參數是不是很熟悉。沒錯就是剛剛我叫你們記下的數字(上面紅色字體)。 
下面的代碼我已經把注釋打好了。
[Asm] 純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
01001516  /$  33C0          xor eax,eax
01001518  |.  66:3905 A0560>cmp word ptr ds:[0x10056A0],ax
0100151F  |.  0F94C0        sete al
01001522  |.  50            push eax
01001523  |.  68 09020000   push 0x209                              ;  初級
01001528  |.  E8 97270000   call winmine.01003CC4
0100152D  |.  33C0          xor eax,eax
0100152F  |.  66:833D A0560>cmp word ptr ds:[0x10056A0],0x1
01001537  |.  0F94C0        sete al
0100153A  |.  50            push eax
0100153B  |.  68 0A020000   push 0x20A                              ;  中級
01001540  |.  E8 7F270000   call winmine.01003CC4
01001545  |.  33C0          xor eax,eax
01001547  |.  66:833D A0560>cmp word ptr ds:[0x10056A0],0x2
0100154F  |.  0F94C0        sete al
01001552  |.  50            push eax
01001553  |.  68 0B020000   push 0x20B                              ;  高級
01001558  |.  E8 67270000   call winmine.01003CC4
0100155D  |.  33C0          xor eax,eax
0100155F  |.  66:833D A0560>cmp word ptr ds:[0x10056A0],0x3
01001567  |.  0F94C0        sete al
0100156A  |.  50            push eax
0100156B  |.  68 0C020000   push 0x20C                              ;  自定義
01001570  |.  E8 4F270000   call winmine.01003CC4
01001575  |.  FF35 C8560001 push dword ptr ds:[0x10056C8]
0100157B  |.  68 11020000   push 0x211                              ;  顏色
01001580  |.  E8 3F270000   call winmine.01003CC4
01001585  |.  FF35 BC560001 push dword ptr ds:[0x10056BC]
0100158B  |.  68 0F020000   push 0x20F                              ;  標記
01001590  |.  E8 2F270000   call winmine.01003CC4
01001595  |.  FF35 B8560001 push dword ptr ds:[0x10056B8]
0100159B  |.  68 0E020000   push 0x20E                              ;  聲音
010015A0  |.  E8 1F270000   call winmine.01003CC4
010015A5  \.  C3            retn

我們在“標記”前面下斷,就是 01001585。
F9運行,菜單—》游戲—》標記。 ok停下來了。
經過多次實驗發現當這個0x10056BC的值為0就是取消,為1就是勾選。
就下來就需要找到是哪個地方更改了0x10056BC的值。
右鍵—》查找—》所有常量
 
把所有的都下斷,
 
F9運行,菜單—》游戲—》標記。 ok停下來,再取消所有斷點。
這里是很標準的switch語句,
[Asm] 純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
01001DBC  |> \0FB745 10     movzx eax,word ptr ss:[ebp+0x10]        ;  Case 111 (WM_COMMAND) of switch 01001D5B
01001DC0  |.  B9 10020000   mov ecx,0x210
01001DC5  |.  3BC1          cmp eax,ecx
01001DC7  |.  0F8F 0F010000 jg winmine.01001EDC
01001DCD  |.  0F84 FF000000 je winmine.01001ED2
01001DD3  |.  3D FE010000   cmp eax,0x1FE
01001DD8  |.  0F84 EA000000 je winmine.01001EC8
01001DDE  |.  3BC6          cmp eax,esi
01001DE0  |.  0F84 B7000000 je winmine.01001E9D
01001DE6  |.  3D 08020000   cmp eax,0x208                           ;  Switch (cases 209..20F)
01001DEB  |.  0F8E B8030000 jle winmine.010021A9
01001DF1  |.  3D 0B020000   cmp eax,0x20B
01001DF6  |.  7E 61         jle short winmine.01001E59
01001DF8  |.  3D 0C020000   cmp eax,0x20C
01001DFD  |.  74 50         je short winmine.01001E4F
01001DFF  |.  3D 0E020000   cmp eax,0x20E
01001E04  |.  74 20         je short winmine.01001E26
01001E06  |.  3D 0F020000   cmp eax,0x20F
01001E0B  |.  0F85 98030000 jnz winmine.010021A9
01001E11  |.  33C0          xor eax,eax                             ;  Case 20F of switch 01001DE6
01001E13  |.  3905 BC560001 cmp dword ptr ds:[0x10056BC],eax
01001E19  |.  0F94C0        sete al
01001E1C  |.  A3 BC560001   mov dword ptr ds:[0x10056BC],eax
01001E21  |.  E9 24010000   jmp winmine.01001F4A

在01001DC0 下斷。F9運行再隨便點一下菜單內的選項,斷下后看eax就是我們點的選項所對應的數字(見上)。
好了,現在所有要改的地方都找到了,但是程序并沒有空間給我們寫代碼了。于是,添加區段。
 
這里我添加了兩個區段,icode與IDAta
od載入Ctrl+G來到01001DC0。我們分析一下這個switch語句。
[Asm] 純文本查看 復制代碼
1
2
3
01001DC0  |.  B9 10020000   mov ecx,0x210
01001DC5  |.  3BC1          cmp eax,ecx
01001DC7  |.  0F8F 0F010000 jg winmine.01001EDC                     ;  eax>0x210 跳

而我們添加的選項是0x212,這個一定要跳的,所以我們跟著跳下去看看。
[Asm] 純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
01001EDC  |> \2D 11020000   sub eax,0x211                           ;  顏色; Switch (cases 211..251)
01001EE1  |.  74 36         je short winmine.01001F19
01001EE3  |.  83E8 3D       sub eax,0x3D                            ;  這下面是另一個菜單了
01001EE6  |.  74 23         je short winmine.01001F0B
01001EE8  |.  48            dec eax
01001EE9  |.  74 1A         je short winmine.01001F05
01001EEB  |.  48            dec eax
01001EEC  |.  74 11         je short winmine.01001EFF
01001EEE  |.  48            dec eax
01001EEF  |.  0F85 B4020000 jnz winmine.010021A9
01001EF5  |.  E8 231E0000   call winmine.01003D1D                   ;  Case 251 of switch 01001EDC
01001EFA  |.^ E9 5FFDFFFF   jmp winmine.01001C5E
01001EFF  |>  6A 00         push 0x0                                ;  Case 250 of switch 01001EDC
01001F01  |.  6A 04         push 0x4
01001F03  |.  EB 0A         jmp short winmine.01001F0F
01001F05  |>  6A 02         push 0x2                                ;  Case 24F of switch 01001EDC
01001F07  |.  6A 01         push 0x1
01001F09  |.  EB 04         jmp short winmine.01001F0F
01001F0B  |>  6A 00         push 0x0                                ;  Case 24E of switch 01001EDC
01001F0D  |.  6A 03         push 0x3
01001F0F  |>  E8 621E0000   call winmine.01003D76
01001F14  |.  E9 90020000   jmp winmine.010021A9
01001F19  |>  33C0          xor eax,eax                             ;  Case 211 of switch 01001EDC
01001F1B  |.  33FF          xor edi,edi                             ;  ntdll.7C93005D
01001F1D  |.  393D C8560001 cmp dword ptr ds:[0x10056C8],edi        ;  ntdll.7C93005D
01001F23  |.  0F94C0        sete al

01001EE1 是判斷是顏色選項就跳,而01001EE3是下一個菜單了,所以我們要把代碼插這中間。但是這中間沒有空間怎么辦,這時候我們添加的區段就派上用場了。
改 
[Asm] 純文本查看 復制代碼
1
01001DC7    - 0F8F 33D20100 jg winmine.0101F000                     ; 跳轉的地址改為我們添加區段的首地址

而0101F000這么寫
[Asm] 純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
0101F000    2D 11020000     sub eax,0x211
0101F005  - 0F84 0E2FFEFF   je winmine.01001F19                     ; 先把本來的兩句抄過來
0101F00B    83F8 01         cmp eax,0x1                             ; 因為這里我們的是0x212,減去0x211后就是0x1了,和0x1比較
0101F00E    74 05           je short winmine.0101F015
0101F010  - E9 CE2EFEFF     jmp winmine.01001EE3                    ; 不是0x212就跳回到之前的代碼執行
0101F015    33C0            xor eax,eax
0101F017    3905 00000201   cmp dword ptr ds:[0x1020000],eax
0101F01D    0F94C0          sete al
0101F020    A3 00000201     mov dword ptr ds:[0x1020000],eax        ; 這4句是給0x1020000值取反的,就是1變成0,0變成1
0101F025  - E9 202FFEFF     jmp winmine.01001F4A

ps:0x1020000是我們添加的idata段的首地址,這個地址就是記錄我們添加的選項是勾選還是沒勾選。
Ctrl+G來到01001516

[Asm] 純文本查看 復制代碼
1
0100155D    - E9 CEDA0100   jmp winmine.0101F030

對應的0101F030這么寫
[Asm] 純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
0101F030    33C0            xor eax,eax
0101F032    66:833D A056000>cmp word ptr ds:[0x10056A0],0x3
0101F03A    0F94C0          sete al
0101F03D    50              push eax
0101F03E    68 0C020000     push 0x20C
0101F043    E8 7C4CFEFF     call winmine.01003CC4
0101F048    FF35 C8560001   push dword ptr ds:[0x10056C8]
0101F04E    68 11020000     push 0x211
0101F053    E8 6C4CFEFF     call winmine.01003CC4
0101F058    FF35 BC560001   push dword ptr ds:[0x10056BC]
0101F05E    68 0F020000     push 0x20F
0101F063    E8 5C4CFEFF     call winmine.01003CC4
0101F068    FF35 B8560001   push dword ptr ds:[0x10056B8]
0101F06E    68 0E020000     push 0x20E
0101F073    E8 4C4CFEFF     call winmine.01003CC4                   ; 這里之前都是把原來的抄過來
0101F078    FF35 00000201   push dword ptr ds:[0x1020000]           ; 這里就是傳入0x1020000的值
0101F07E    68 12020000     push 0x212                              ; 這里是我們添加的選項的數字
0101F083    E8 3C4CFEFF     call winmine.01003CC4
0101F088  - E9 1825FEFF     jmp winmine.010015A5                    ; 跳到剛剛call的返回處

到此我們已經改完了。運行一下沒出錯。


最后總結一下,改的地方一共三處
1.
[Asm] 純文本查看 復制代碼
1
01001DC7    - 0F8F 33D20100 jg winmine.0101F000                     ;  地址改為我們添加區段的首地址

2.
[Asm] 純文本查看 復制代碼
1
0100155D    - E9 CEDA0100   jmp winmine.0101F030

3.
[Asm] 純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
0101F000    2D 11020000     sub eax,0x211
0101F005  - 0F84 0E2FFEFF   je winmine.01001F19                     ; 先把本來的兩句抄過來
0101F00B    83F8 01         cmp eax,0x1                             ; 因為這里我們的是0x212,減去0x211后就是0x1了,和0x1比較
0101F00E    74 05           je short winmine.0101F015
0101F010  - E9 CE2EFEFF     jmp winmine.01001EE3                    ; 不是0x212就跳回到之前的代碼執行
0101F015    33C0            xor eax,eax
0101F017    3905 00000201   cmp dword ptr ds:[0x1020000],eax
0101F01D    0F94C0          sete al
0101F020    A3 00000201     mov dword ptr ds:[0x1020000],eax        ; 這4句是給0x1020000值取反的,就是1變成0,0變成1
0101F025  - E9 202FFEFF     jmp winmine.01001F4A
0101F02A    0000            add byte ptr ds:[eax],al
0101F02C    0000            add byte ptr ds:[eax],al
0101F02E    0000            add byte ptr ds:[eax],al
0101F030    33C0            xor eax,eax
0101F032    66:833D A056000>cmp word ptr ds:[0x10056A0],0x3
0101F03A    0F94C0          sete al
0101F03D    50              push eax
0101F03E    68 0C020000     push 0x20C
0101F043    E8 7C4CFEFF     call winmine.01003CC4
0101F048    FF35 C8560001   push dword ptr ds:[0x10056C8]
0101F04E    68 11020000     push 0x211
0101F053    E8 6C4CFEFF     call winmine.01003CC4
0101F058    FF35 BC560001   push dword ptr ds:[0x10056BC]
0101F05E    68 0F020000     push 0x20F
0101F063    E8 5C4CFEFF     call winmine.01003CC4
0101F068    FF35 B8560001   push dword ptr ds:[0x10056B8]
0101F06E    68 0E020000     push 0x20E
0101F073    E8 4C4CFEFF     call winmine.01003CC4                   ; 這里之前都是把原來的抄過來
0101F078    FF35 00000201   push dword ptr ds:[0x1020000]           ; 這里就是傳入0x1020000的值
0101F07E    68 12020000     push 0x212                              ; 這里是我們添加的選項的數字
0101F083    E8 3C4CFEFF     call winmine.01003CC4
0101F088  - E9 1825FEFF     jmp winmine.010015A5                    ; 跳到剛剛call的返回處



下一期再把無敵的功能真正加進去,其實你們也可以參考最上面的鏈接,自己改.   


熱門文章
  • 機械革命S1 PRO-02 開機不顯示 黑...
  • 聯想ThinkPad NM-C641上電掉電點不...
  • 三星一體激光打印機SCX-4521F維修...
  • 通過串口命令查看EMMC擦寫次數和判...
  • IIS 8 開啟 GZIP壓縮來減少網絡請求...
  • 索尼kd-49x7500e背光一半暗且閃爍 ...
  • 樓宇對講門禁讀卡異常維修,讀卡芯...
  • 新款海信電視機始終停留在開機界面...
  • 常見打印機清零步驟
  • 安裝驅動時提示不包含數字簽名的解...
  • 共享打印機需要密碼的解決方法
  • 圖解Windows 7系統快速共享打印機的...
  • 錦州廣廈電腦上門維修

    報修電話:13840665804  QQ:174984393 (聯系人:毛先生)   
    E-Mail:174984393@qq.com
    維修中心地址:錦州廣廈電腦城
    ICP備案/許可證號:遼ICP備2023002984號-1
    上門服務區域: 遼寧錦州市區
    主要業務: 修電腦,電腦修理,電腦維護,上門維修電腦,黑屏藍屏死機故障排除,無線上網設置,IT服務外包,局域網組建,ADSL共享上網,路由器設置,數據恢復,密碼破解,光盤刻錄制作等服務

    技術支持:微軟等
    主站蜘蛛池模板: 国产精品热久久无码av| 久久亚洲AV无码精品色午夜麻豆| 亚洲6080yy久久无码产自国产| 97碰碰碰人妻视频无码| 最新亚洲人成无码网www电影| 亚洲热妇无码AV在线播放| 亚洲AV无码片一区二区三区| 免费无码一区二区三区蜜桃| 孕妇特级毛片WW无码内射| 日韩成人无码中文字幕| 永久免费av无码不卡在线观看| a级毛片无码免费真人久久| 特级小箩利无码毛片| 亚洲一区二区三区无码国产| 中文字幕无码AV波多野吉衣| 日韩中文无码有码免费视频| 久久久久久国产精品免费无码| 国产免费久久久久久无码| 亚洲av极品无码专区在线观看| 国产精品99无码一区二区| 亚洲AV无码XXX麻豆艾秋| 亚洲AV无码成人精品区在线观看| 久久久久久亚洲av成人无码国产 | 色综合色国产热无码一| 无码人妻视频一区二区三区| 久久久无码精品午夜| 无码国产精品一区二区免费虚拟VR| 中文无码vs无码人妻| 亚洲免费无码在线| 日韩精品人妻系列无码av东京| 亚洲精品无码日韩国产不卡av| 色综合久久久久无码专区 | 久久久久久国产精品无码下载 | 久久亚洲精品成人无码网站| 无码午夜成人1000部免费视频 | 精品欧洲AV无码一区二区男男 | 无码国产精品一区二区高潮| 亚洲av无码一区二区三区四区| 无码精品A∨在线观看十八禁| 亚洲熟妇无码八V在线播放| 精品久久久久久无码专区|