【目标程序】:Win2000的 Winmine.exe
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:Win2000、Ollydbg1.10、ExeScope
【逆向原因】:我有一舍友, 十分精于扫雷游戏,闲暇之时与其比试,总是败多胜少,遂逆
向一热键作弊(本文改成了菜单)功能,后常胜 ^_^ 。今日无事,逆向菜
文一篇,希望能对刚入门的菜鸟朋友们有些许帮助。
【逆向过程】:
————————————————————————————————————————
一、分析
1、弄清程序的流程,将自己的处理代码,挂在消息响应流程中。
// 用DefWindowProcW下断,然后向上翻看,即可看到消息响应流程
// 点击菜单后,会来到如下代码处
010019AD > /8B4D 10 mov ecx, dword ptr ss:[ebp+10] ; 点击的菜单ID
010019B0 . 0FB7C1 movzx eax, cx
010019B3 . 3D 0B020000 cmp eax, 20B
010019B8 . 7F 76 jg short winmine.01001A30 ; 大于 0x20B 跳到后边
010019BA . 3D 09020000 cmp eax, 209
010019BF . 7D 2D jge short winmine.010019EE
010019C1 . 2D FE010000 sub eax, 1FE
010019C6 . 74 1C je short winmine.010019E4
010019C8 . 48 dec eax
010019C9 . 48 dec eax
010019CA . 0F85 7C030000 jnz winmine.01001D4C
010019D0 . 33FF xor edi, edi ; Case 200 of switch 010019B3
010019D2 . 57 push edi ; /ShowState => SW_HIDE
010019D3 . FF35 A8520001 push dword ptr ds:[10052A8] ; |hWnd = NULL
010019D9 . FF15 EC100001 call dword ptr ds:[<&USER32.ShowWi>; /ShowWindow
010019DF . E9 A2000000 jmp winmine.01001A86
010019E4 > E8 26190000 call winmine.0100330F ; Case 1FE of switch 010019B3
010019E9 . E9 5E030000 jmp winmine.01001D4C
010019EE > 8D81 F7FDFFFF lea eax, dword ptr ds:[ecx-209] ; Cases 209,20A,20B of switch 010019B3
010019F4 . 66:A3 C0520001 mov word ptr ds:[10052C0], ax
010019FA . 0FB7C0 movzx eax, ax
010019FD . 8D0440 lea eax, dword ptr ds:[eax+eax*2]
01001A00 . C1E0 02 shl eax, 2
01001A03 . 8B88 28500001 mov ecx, dword ptr ds:[eax+100502>
01001A09 . 890D C4520001 mov dword ptr ds:[10052C4], ecx
01001A0F . 8B88 2C500001 mov ecx, dword ptr ds:[eax+100502>
01001A15 . 8B80 30500001 mov eax, dword ptr ds:[eax+100503>
01001A1B . 890D C8520001 mov dword ptr ds:[10052C8], ecx
01001A21 . A3 CC520001 mov dword ptr ds:[10052CC], eax
01001A26 . E8 E4180000 call winmine.0100330F
01001A30 > /B9 4E02000
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:Win2000、Ollydbg1.10、ExeScope
【逆向原因】:我有一舍友, 十分精于扫雷游戏,闲暇之时与其比试,总是败多胜少,遂逆
向一热键作弊(本文改成了菜单)功能,后常胜 ^_^ 。今日无事,逆向菜
文一篇,希望能对刚入门的菜鸟朋友们有些许帮助。
【逆向过程】:
————————————————————————————————————————
一、分析
1、弄清程序的流程,将自己的处理代码,挂在消息响应流程中。
// 用DefWindowProcW下断,然后向上翻看,即可看到消息响应流程
// 点击菜单后,会来到如下代码处
010019AD > /8B4D 10 mov ecx, dword ptr ss:[ebp+10] ; 点击的菜单ID
010019B0 . 0FB7C1 movzx eax, cx
010019B3 . 3D 0B020000 cmp eax, 20B
010019B8 . 7F 76 jg short winmine.01001A30 ; 大于 0x20B 跳到后边
010019BA . 3D 09020000 cmp eax, 209
010019BF . 7D 2D jge short winmine.010019EE
010019C1 . 2D FE010000 sub eax, 1FE
010019C6 . 74 1C je short winmine.010019E4
010019C8 . 48 dec eax
010019C9 . 48 dec eax
010019CA . 0F85 7C030000 jnz winmine.01001D4C
010019D0 . 33FF xor edi, edi ; Case 200 of switch 010019B3
010019D2 . 57 push edi ; /ShowState => SW_HIDE
010019D3 . FF35 A8520001 push dword ptr ds:[10052A8] ; |hWnd = NULL
010019D9 . FF15 EC100001 call dword ptr ds:[<&USER32.ShowWi>; /ShowWindow
010019DF . E9 A2000000 jmp winmine.01001A86
010019E4 > E8 26190000 call winmine.0100330F ; Case 1FE of switch 010019B3
010019E9 . E9 5E030000 jmp winmine.01001D4C
010019EE > 8D81 F7FDFFFF lea eax, dword ptr ds:[ecx-209] ; Cases 209,20A,20B of switch 010019B3
010019F4 . 66:A3 C0520001 mov word ptr ds:[10052C0], ax
010019FA . 0FB7C0 movzx eax, ax
010019FD . 8D0440 lea eax, dword ptr ds:[eax+eax*2]
01001A00 . C1E0 02 shl eax, 2
01001A03 . 8B88 28500001 mov ecx, dword ptr ds:[eax+100502>
01001A09 . 890D C4520001 mov dword ptr ds:[10052C4], ecx
01001A0F . 8B88 2C500001 mov ecx, dword ptr ds:[eax+100502>
01001A15 . 8B80 30500001 mov eax, dword ptr ds:[eax+100503>
01001A1B . 890D C8520001 mov dword ptr ds:[10052C8], ecx
01001A21 . A3 CC520001 mov dword ptr ds:[10052CC], eax
01001A26 . E8 E4180000 call winmine.0100330F
01001A30 > /B9 4E02000