使用windbg挖地雷直接取胜

前面一篇文章探讨了如何直接明挖地雷,通过windbg修改了雷区就可以了. 这次我们更直接,看看如何通过函数飞针直接取胜.
使用windbg直接打开winmine.exe
先运行起来:g   共99个雷.

先看如何把雷个数改为0,  break这个程序. 用x命令显示所有符号
0:005> x winmine!*
01001004 winmine!_imp__RegSetValueExW = <no type information>
0100511c winmine!yCur = <no type information>
01005b8c winmine!__onexitend = <no type information>
01001108 winmine!_imp__GetDlgItemTextW = <no type information>
010010cc winmine!_imp__RegisterClassW = <no type information>
010057a0 winmine!cBoxVisitMac = <no type information>
01001178 winmine!_imp____p__fmode = <no type information>
0100118c winmine!_imp____getmainargs = <no type information>
01005158 winmine!hGrayPen = <no type information>
01002eab winmine!ChangeBlk = <no type information>
01001baa winmine!DoDisplayBest = <no type information>
01002f3b winmine!CountBombs = <no type information>
01001950 winmine!AdjustWindow = <no type information>
01001090 winmine!_imp__GetStartupInfoA = <no type information>
0100518c winmine!pHtmlHelpW = <no type information>
......
no type information 表示我们没有微软私有符号,只有公开符号,不知道变量类型.

内容非常多,还是要过滤一下,看看有没有g开头的,g一般是全局变量的开头
0:005> x winmine!g*
01005950 winmine!g_hReg = <no type information>
0100347c winmine!GameOver = <no type information>
01003df6 winmine!GetDlgInt = <no type information>
看着都不像地雷个数. 再看看c开头的,c一般是整形数
0:005> x winmine!c*
010057a0 winmine!cBoxVisitMac = <no type information>
01002eab winmine!ChangeBlk = <no type information>
01002f3b winmine!CountBombs = <no type information>
010023f1 winmine!CbBitmap = <no type information>
01003119 winmine!CountMarks = <no type information>
010057a4 winmine!cBoxVisit = <no type information>
0100579c winmine!cSec = <no type information>
01005194 winmine!cBombLeft = <no type information>
01002ed5 winmine!ClearField = <no type information>
01003cc4 winmine!CheckEm = <no type information>
01005330 winmine!cBombStart = <no type information>
0100263c winmine!CleanUp = <no type information>

winmine!cBombLeft 像是剩余雷个数,需要验证一下. 先看看内容:
0:005> dd winmine!cBombLeft
01005194  00000063 00000000 00000000 00000000
010051a4  00000000 00000000 00000000 00000000
010051b4  00000000 00000000 00000000 00000000
010051c4  00000000 00000000 00000000 00000000
010051d4  00000000 00000000 00000000 00000000
010051e4  00000000 00000000 00000000 00000000
数值是63,这是16进制,转换10进制:
0:005> ? 63
Evaluate expression: 99 = 00000063
正好是99,猜测靠谱。 修改一下这个值,看看雷个数是否跟着修改了。
0:005> ed winmine!cBombLeft 0
g运行起来,看一下界面:

果然变成0了,猜测正确。
我们还可以通过硬件断点进一步加深理解。
0:003> ba r4 winmine!cBombLeft
ba: 硬件断点break access
r:代表读写的时候都停下来,注意不是只读
4:表示监视4字节
g起来看看何时命中。一刷新就直接命中了。看一下堆栈

0:003> g
Breakpoint 0 hit
eax=00000000 ebx=00000000 ecx=00001b4c edx=00000000 esi=01010dee edi=00000000
eip=010027af esp=000cfc48 ebp=766de761 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
winmine!DrawBombCount+0x2a:
010027af 85c0            test    eax,eax
0:000> k
ChildEBP RetAddr  
000cfc54 01002ad4 winmine!DrawBombCount+0x2a
000cfc60 01001c51 winmine!DrawScreen+0x11
000cfcb8 7512630a winmine!MainWndProc+0x88
000cfce4 75127326 USER32!InternalCallWinProc+0x23
000cfd5c 75126df8 USER32!UserCallWinProcCheckWow+0xd8
000cfdb8 75126e54 USER32!DispatchClientMessage+0xd5
000cfdf4 76ef010a USER32!__fnDWORD+0x2b
000cfe08 010830f0 ntdll!KiUserCallbackDispatcher+0x2e
WARNING: Frame IP not in any known module. Following frames may be wrong.
000cfe70 7512789a 0x10830f0
000cfe80 010023a4 USER32!DispatchMessageW+0xf
000cfee4 01003f95 winmine!WinMain+0x1b4
000cff88 746c343d winmine!WinMainCRTStartup+0x174
000cff94 76f19812 kernel32!BaseThreadInitThunk+0xe
000cffd4 76f197e5 ntdll!__RtlUserThreadStart+0x70
000cffec 00000000 ntdll!_RtlUserThreadStart+0x1b

为何命中点没有在访问winmine!cBombLeft ? 原因是硬件断点的命中时事后的,访问完成了才命中。软件断点是事前的。
可以向前反汇编看看,可以看到访问winmine!cBombLeft 
0:000> ub
winmine!DrawBombCount+0x15:
0100279a 8bd8            mov     ebx,eax
0100279c 895c2414        mov     dword ptr [esp+14h],ebx
010027a0 83e301          and     ebx,1
010027a3 7405            je      winmine!DrawBombCount+0x25 (010027aa)
010027a5 6a00            push    0
010027a7 56              push    esi
010027a8 ffd5            call    ebp
010027aa a194510001      mov     eax,dword ptr [winmine!cBombLeft (01005194)]

好了,我们删除这个断点然后继续研究:
0:000> bl
 0 e 01005194 r 4 0001 (0001)  0:**** winmine!cBombLeft
0:000> bc 0

雷个数已经是0了,但游戏并为结束,那是因为没有执行gameover的过程,我们找一下有没有相关函数。
0:000> x winmine!*gameover*
0100347c winmine!GameOver = <no type information>

需要找到窗口线程执行,win7后一般是0号线程,我们观察一下:
0:003> ~* k

0  Id: 1b4c.580 Suspend: 1 Teb: 7efdd000 Unfrozen
ChildEBP RetAddr  
000cfe58 7512791d USER32!NtUserGetMessage+0x15
000cfe74 010023ad USER32!GetMessageW+0x33
000cfee4 01003f95 winmine!WinMain+0x1bd
000cff88 746c343d winmine!WinMainCRTStartup+0x174
000cff94 76f19812 kernel32!BaseThreadInitThunk+0xe
000cffd4 76f197e5 ntdll!__RtlUserThreadStart+0x70
000cffec 00000000 ntdll!_RtlUserThreadStart+0x1b

1  Id: 1b4c.1e10 Suspend: 1 Teb: 7efda000 Unfrozen
ChildEBP RetAddr  
026ffd70 76541775 ntdll!NtWaitForMultipleObjects+0x15
026ffe0c 746c19fc KERNELBASE!WaitForMultipleObjectsEx+0x100
026ffe54 746c268c kernel32!WaitForMultipleObjectsExImplementation+0xe0
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Windows\SysWOW64\winhadnt.dll - 
026ffe70 711418c1 kernel32!WaitForMultipleObjects+0x18
WARNING: Stack unwind information not available. Following frames may be wrong.
026ffe94 7114280f winhadnt!DelPassthru+0xdf1
026fff88 746c343d winhadnt!DelPassthru+0x1d3f
026fff94 76f19812 kernel32!BaseThreadInitThunk+0xe
026fffd4 76f197e5 ntdll!__RtlUserThreadStart+0x70
026fffec 00000000 ntdll!_RtlUserThreadStart+0x1b

2  Id: 1b4c.1e18 Suspend: 1 Teb: 7efd7000 Unfrozen
ChildEBP RetAddr  
025efdf4 76f2f68f ntdll!NtWaitForMultipleObjects+0x15
025eff88 746c343d ntdll!TppWaiterpThread+0x32e
025eff94 76f19812 kernel32!BaseThreadInitThunk+0xe
025effd4 76f197e5 ntdll!__RtlUserThreadStart+0x70
025effec 00000000 ntdll!_RtlUserThreadStart+0x1b

#  3  Id: 1b4c.1e04 Suspend: 1 Teb: 7ef9f000 Unfrozen
ChildEBP RetAddr  
0362ff58 76f7f3e6 ntdll!DbgBreakPoint
0362ff88 746c343d ntdll!DbgUiRemoteBreakin+0x3c
0362ff94 76f19812 kernel32!BaseThreadInitThunk+0xe
0362ffd4 76f197e5 ntdll!__RtlUserThreadStart+0x70
0362ffec 00000000 ntdll!_RtlUserThreadStart+0x1b

确实是0号线程,切换到0号线程,然后修改eip的值为gameover函数,然后g
0:003> ~0s
eax=00000001 ebx=00000001 ecx=00000000 edx=00000000 esi=000cfec0 edi=00000000
eip=751278e7 esp=000cfe58 ebp=000cfe74 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
USER32!NtUserGetMessage+0x15:
751278e7 83c404          add     esp,4

0:000> r eip=0100347c
然后g,结果:

看一下堆栈:
0:003> ~0s
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=00000102 edi=000cfda0
eip=7513352d esp=000cfd8c ebp=000cfdc8 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
USER32!NtUserWaitMessage+0x15:
7513352d 83c404          add     esp,4
0:000> k
ChildEBP RetAddr  
000cfd8c 75152139 USER32!NtUserWaitMessage+0x15
000cfdc8 7515234f USER32!DialogBox2+0x222
000cfdf4 7515227d USER32!InternalDialogBox+0xe5
000cfe14 751523fc USER32!DialogBoxIndirectParamAorW+0x37
000cfe38 01001b9f USER32!DialogBoxParamW+0x3f
000cfe50 0100350a winmine!DoEnterName+0x1e
000cfe58 7512791d winmine!GameOver+0x8e
000cfe74 010023ad USER32!GetMessageW+0x33
000cfee4 01003f95 winmine!WinMain+0x1bd
000cff88 746c343d winmine!WinMainCRTStartup+0x174
000cff94 76f19812 kernel32!BaseThreadInitThunk+0xe
000cffd4 76f197e5 ntdll!__RtlUserThreadStart+0x70
000cffec 00000000 ntdll!_RtlUserThreadStart+0x1b

确实在执行winmine!GameOver,游戏结束。获得最短时间取胜:

windbg真强大!

使用windbg挖地雷直接取胜相关推荐

  1. 马尔可夫过程和马尔可夫链_Google页面排名和马尔可夫链

    马尔可夫过程和马尔可夫链 Whenever you give a query on Google, you will get the web pages in an order based on th ...

  2. WinDbg加载不同版本CLR

    WinDbg调试.net2.0和.net4.0程序有所不同,因为.net4.0使用新版本的CLR.例如: mscoree.dll 变为 mscoree.dll 和 mscoreei.dll, msco ...

  3. .net下WinDbg使用说明

    加载调试文件 .loadby sos mscorwks #.Net 3.5版本及以下 .loadby sos clr #.Net 4.0 WinDbg的基本命令 !threads #显示所有线程 !d ...

  4. WinDbg安装与使用

    WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件. 主页:http://msdn.microsoft ...

  5. 使用windbg抓取崩溃文件和分析的过程

    在软件编程中,崩溃的场景比较常见的.且说微软技术再牛X,也是会出现崩溃的场景.网上有一段Win98当着比尔盖茨蓝屏的视频非常有意思. (转载请指明出于breaksoftware的csdn博客)     ...

  6. 0627 - 不能再靠功能取胜

    截止目前,我已经先后做了 6 款 mac App,也都先后到了瓶颈.怎么回事呢? 总体来看,主要是 产品太过依赖功能:当功能基本完成时,就没有更多想象空间了. 接下来,在考虑新项目时,要注意避免功能为 ...

  7. Windbg双机调试环境配置(Windows7/Windows XP+VirtualBox/VMware+WDK7600)

    简介:Windbg双机调试内核.驱动 下载软件: 下载Windbg(GRMWDK_EN_7600_1.ISO) 下载VirtualBox 5.2/VMware 12 一.安装WDK,这里要提一点的是D ...

  8. 施一公:年轻人不要花时间去拉关系,尽全力做研究,以实力取胜!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 对每一位刚刚在清华大学生命科学学院或医学院建立独立实验室的年轻PI( ...

  9. Windbg学习 (0x0012) 命令-批处理命令程序

    Windbg学习 (0x0012) 命令-批处理命令 转载于:https://www.cnblogs.com/ywnwa417/p/5678344.html

最新文章

  1. Android 基础 一 AndroidManifest.xml
  2. linux统计分析命令datamash
  3. jupyter notebook 内核好像挂掉了
  4. canvas——橡皮筋式线条绘图应用
  5. winform datagridview 重新绘制datagridview的边框。
  6. python 生意参谋_GitHub - iOSDevLog/sycm: 生意参谋
  7. 通过实战跑分来展示HBase2.x的写入性能
  8. Qt Creator使用语言服务器
  9. Cannot resolve table 't_daily'
  10. pythonmysqlconnector_python操作mysql——mysql.connector
  11. 主流数据库优缺点以及性能分析
  12. Linux Sentaurus-Silvaco虚拟机使用方法
  13. 跨平台第三方平台登录和单点登录
  14. python简单小游戏代码教程,python小游戏程序源代码
  15. 词法分析器设计与实现
  16. 币安智能链监听日志事件
  17. 产品研发管理的系统解决方案
  18. mac深色主题下把chrome主题从默认黑色变回以前的默认白色
  19. Win 7+Word 2007仿宋和楷体不能正常显示的解决方法
  20. ORA-12154 问题解决办法

热门文章

  1. 万能的Attention及其代码实现
  2. 人工智能公司,主要的商业模式是什么?
  3. HTML5的基础认识
  4. [水贴]GALGAME 怎么判定好感度?
  5. 戴尔灵越——BIOS设置tv_x
  6. FTP服务器ip地址修改,文件上传和下载详解
  7. 名帖224 赵孟頫 行书《行书帖选》
  8. linux系统如何连接wf,Kali Linux系统连接Wifi无线网络命令:
  9. C++:OTSU确定标线点云分割阈值
  10. 水果店吸引顾客进店的方法,水果店吸引人气的方法