Reverse engineering 如何在内存中找到表示扫雷舰地雷布局的数据结构?

Reverse engineering 如何在内存中找到表示扫雷舰地雷布局的数据结构?,reverse-engineering,windbg,ida,minesweeper,memory-editing,Reverse Engineering,Windbg,Ida,Minesweeper,Memory Editing,我正在尝试学习逆向工程,使用“扫雷舰”作为示例应用程序。我在一个简单的WinDbg命令中发现了这一点,该命令显示了所有的地雷,但它是旧的,没有任何详细解释,也不是我想要的 我有和,我已将winmine.exe加载到这两个文件中。有没有人能为这两个程序中的任何一个提供一些实用的技巧,以找到代表矿区的数据结构的位置 在WinDbg中,我可以设置断点,但我很难想象在什么位置设置断点,在什么内存位置。类似地,当我在IDA Pro中查看静态代码时,我甚至不确定从何处开始查找表示雷区的函数或数据结构 Sta

我正在尝试学习逆向工程,使用“扫雷舰”作为示例应用程序。我在一个简单的WinDbg命令中发现了这一点,该命令显示了所有的地雷,但它是旧的,没有任何详细解释,也不是我想要的

我有和,我已将winmine.exe加载到这两个文件中。有没有人能为这两个程序中的任何一个提供一些实用的技巧,以找到代表矿区的数据结构的位置

在WinDbg中,我可以设置断点,但我很难想象在什么位置设置断点,在什么内存位置。类似地,当我在IDA Pro中查看静态代码时,我甚至不确定从何处开始查找表示雷区的函数或数据结构


Stackoverflow上是否有逆向工程师可以为我指出正确的方向?

此网站可能更有用:

通常的做法是:

  • 以某种方式获取源代码
  • 拆开,希望剩下的符号能帮助你
  • 猜测数据类型并尝试对其进行操作,然后使用内存扫描程序来限制这种可能性
  • 对赏金的回应

    好的,在第二次阅读中,您似乎想要一个关于如何使用WinDBG之类的调试器的指南,而不是关于如何进行反向工程的常见问题。我已经向您展示了一个网站,它告诉您需要搜索的值,所以问题是,您如何搜索它

    我在这个例子中使用记事本,因为我没有安装扫雷器。但想法是一样的

    你打字

    s <options> <memory start> <memory end> <pattern>
    
    s
    
    按“?”然后按“s”以查看帮助

    找到所需的内存模式后,可以按alt+5打开内存查看器,以获得良好的显示效果

    WinDBG需要一些时间来适应,但它和其他调试器一样好

    “在WinDbg中,我可以设置断点,但是 我现在很难想象 设置断点的点和位置 什么内存位置。类似地,什么时候 我在IDA Pro中查看静态代码,我 甚至不知道从哪里开始找 函数或数据结构 代表雷区。”

    没错

    好的,您可以查找诸如random()之类的例程,这些例程将在构造mines表期间调用。这在我尝试逆向工程时帮了我很大的忙。:)

    通常,设置断点的好地方是对消息框的调用、播放声音的调用、计时器和其他win32 API例程。

    顺便说一句,我现在正在扫描扫雷舰

    更新:提醒我一个很棒的工具,由Eric“Dark Byte”Heijnen编写。

    作弊引擎(CE)是监视和修改其他进程内存空间的好工具。除此之外,CE还有更多的特殊功能,如查看进程的反汇编内存和将代码注入其他进程。


    (该项目的真正价值在于,您可以下载源代码—Delphi—并查看这些机制是如何实现的—我很多年前就这么做了:o)

    查看这篇代码项目文章,它比您提到的博客文章更深入一些

    编辑 这篇文章虽然没有直接介绍“扫雷舰”,但为您提供了一个很好的使用WinDbg搜索内存的分步指南:

    编辑2 再说一次,这不是关于扫雷舰的,但它确实给了我一些思考的食物,让我可以进行内存调试,这里有大量的教程:


    另外,请下载(Nick D.提到)并完成它附带的教程。

    在调试器中开始跟踪的一个好方法是鼠标朝上。所以查找主窗口过程(我认为像spyxx这样的工具可以检查窗口属性,事件处理程序地址就是其中之一)。进入它并找到它处理鼠标事件的位置——如果您能在汇编程序中识别它,就会有一个开关(请查看windows.h中鼠标启动的WM_XXX值)

    在那里放置一个断点并开始介入。在您释放鼠标按钮和屏幕更新之间的某个时间,victum将访问您正在查找的数据结构

    要有耐心,尽量确定在任何给定的时间都在做什么,但不要费心深入研究您怀疑对当前目标不感兴趣的代码。可能需要在调试器中运行几次才能确定它


    了解正常的win32应用程序工作流也会有所帮助。

    您似乎正在尝试反汇编源代码,但需要做的是查看正在运行的程序的内存空间。十六进制编辑器有一个功能,可以让您这样做

    一旦进入内存空间,就需要在处理电路板时拍摄内存快照。区分哪些改变与哪些没有改变。当您认为自己掌握了十六进制内存中数据结构的位置时,请尝试在内存中编辑它,并查看电路板是否因此发生了变化


    您想要的过程与为视频游戏构建“培训师”并无不同。这些通常是基于找到生命值和弹药值在内存中的位置,并动态更改它们。您可能会找到一些关于如何构建游戏训练师的好教程。

    地雷可能会存储在某种二维阵列中。这意味着它要么是一个指针数组,要么是一个C风格的布尔数组

    每当表单收到鼠标移动事件时,就会引用此数据结构。索引将使用鼠标坐标计算,可能使用整数除法。这意味着您可能应该查找
    cmp
    或类似的指令,其中一个操作数是使用偏移量计算的,
    x
    ,其中
    x
    
    .text:0100225D                 mov     [ebp+WndClass.lpfnWndProc], offset mainWndProc
    .text:01002264                 mov     [ebp+WndClass.cbClsExtra], edi
    .text:01002267                 mov     [ebp+WndClass.cbWndExtra], edi
    .text:0100226A                 mov     [ebp+WndClass.hInstance], ecx
    .text:0100226D                 mov     [ebp+WndClass.hIcon], eax
    
    .text:01002292                 call    ds:RegisterClassW
    
    .text:01001BCF                 mov     edx, [ebp+Msg]
    
    .text:01001D5B                 sub     eax, 111h
    .text:01001D60                 jz      short loc_1001DBC
    
    .text:01001D5B                 sub     eax, WM_COMMAND
    .text:01001D60                 jz      short loc_1001DBC
    
    .text:01001DBC HandleWM_COMMAND:                       ; CODE XREF: mainWndProc+197j
    .text:01001DBC                 movzx   eax, word ptr [ebp+wParam]
    .text:01001DC0                 mov     ecx, 210h
    .text:01001DC5                 cmp     eax, ecx
    .text:01001DC7                 jg      loc_1001EDC
    .text:01001DC7
    .text:01001DCD                 jz      loc_1001ED2
    .text:01001DCD
    .text:01001DD3                 cmp     eax, 1FEh
    .text:01001DD8                 jz      loc_1001EC8
    
    .text:01001DBC HandleWM_COMMAND:                       ; CODE XREF: mainWndProc+197j
    .text:01001DBC                 movzx   eax, word ptr [ebp+wParam]
    .text:01001DC0                 mov     ecx, 528
    .text:01001DC5                 cmp     eax, ecx
    .text:01001DC7                 jg      loc_1001EDC
    .text:01001DC7
    .text:01001DCD                 jz      loc_1001ED2
    .text:01001DCD
    .text:01001DD3                 cmp     eax, 510
    .text:01001DD8                 jz      loc_1001EC8 ; here is our jump
    
    .text:01001EC8 loc_1001EC8:                            ; CODE XREF: mainWndProc+20Fj
    .text:01001EC8                 call    sub_100367A     ; startNewGame ?
    .text:01001EC8
    .text:01001ECD                 jmp     callDefAndExit  ; default
    
    .text:0100367A sub_100367A     proc near               ; CODE XREF: sub_100140C+CAp
    .text:0100367A                                         ; sub_1001B49+33j ...
    .text:0100367A                 mov     eax, dword_10056AC
    .text:0100367F                 mov     ecx, uValue
    .text:01003685                 push    ebx
    .text:01003686                 push    esi
    .text:01003687                 push    edi
    .text:01003688                 xor     edi, edi
    .text:0100368A                 cmp     eax, dword_1005334
    .text:01003690                 mov     dword_1005164, edi
    .text:01003696                 jnz     short loc_10036A4
    .text:01003696
    .text:01003698                 cmp     ecx, dword_1005338
    .text:0100369E                 jnz     short loc_10036A4
    
    .text:0100367A startNewGame    proc near               ; CODE XREF: handleButtonPress+CAp
    .text:0100367A                                         ; sub_1001B49+33j ...
    .text:0100367A                 mov     eax, newMineFieldWidth
    .text:0100367F                 mov     ecx, newMineFieldHeight
    .text:01003685                 push    ebx
    .text:01003686                 push    esi
    .text:01003687                 push    edi
    .text:01003688                 xor     edi, edi
    .text:0100368A                 cmp     eax, currentMineFieldWidth
    .text:01003690                 mov     dword_1005164, edi
    .text:01003696                 jnz     short loc_10036A4
    .text:01003696
    .text:01003698                 cmp     ecx, currentMineFieldHeight
    .text:0100369E                 jnz     short loc_10036A4
    
    .text:010036A7                 mov     currentMineFieldWidth, eax
    .text:010036AC                 mov     currentMineFieldHeight, ecx
    .text:010036B2                 call    sub_1002ED5
    
    .text:01002ED5 sub_1002ED5     proc near               ; CODE XREF: sub_1002B14:loc_1002B1Ep
    .text:01002ED5                                         ; sub_100367A+38p
    .text:01002ED5                 mov     eax, 360h
    .text:01002ED5
    .text:01002EDA
    .text:01002EDA loc_1002EDA:                            ; CODE XREF: sub_1002ED5+Dj
    .text:01002EDA                 dec     eax
    .text:01002EDB                 mov     byte ptr dword_1005340[eax], 0Fh
    .text:01002EE2                 jnz     short loc_1002EDA
    
    .text:01002EE4                 mov     ecx, currentMineFieldWidth
    .text:01002EEA                 mov     edx, currentMineFieldHeight
    .text:01002EF0                 lea     eax, [ecx+2]
    .text:01002EF3                 test    eax, eax
    .text:01002EF5                 push    esi
    .text:01002EF6                 jz      short loc_1002F11    ; 
    .text:01002EF6
    .text:01002EF8                 mov     esi, edx
    .text:01002EFA                 shl     esi, 5
    .text:01002EFD                 lea     esi, dword_1005360[esi]
    .text:01002EFD
    .text:01002F03 draws top and bottom borders
    .text:01002F03 
    .text:01002F03 loc_1002F03:                            ; CODE XREF: sub_1002ED5+3Aj
    .text:01002F03                 dec     eax
    .text:01002F04                 mov     byte ptr MineField?[eax], 10h ; top border
    .text:01002F0B                 mov     byte ptr [esi+eax], 10h       ; bottom border
    .text:01002F0F                 jnz     short loc_1002F03
    .text:01002F0F
    .text:01002F11
    .text:01002F11 loc_1002F11:                            ; CODE XREF: sub_1002ED5+21j
    .text:01002F11                 lea     esi, [edx+2]
    .text:01002F14                 test    esi, esi
    .text:01002F16                 jz      short loc_1002F39
    
    .text:01002F18                 mov     eax, esi
    .text:01002F1A                 shl     eax, 5
    .text:01002F1D                 lea     edx, MineField?[eax]
    .text:01002F23                 lea     eax, (MineField?+1)[eax+ecx]
    .text:01002F23
    .text:01002F2A
    .text:01002F2A loc_1002F2A:                            ; CODE XREF: sub_1002ED5+62j
    .text:01002F2A                 sub     edx, 20h
    .text:01002F2D                 sub     eax, 20h
    .text:01002F30                 dec     esi
    .text:01002F31                 mov     byte ptr [edx], 10h
    .text:01002F34                 mov     byte ptr [eax], 10h
    .text:01002F37                 jnz     short loc_1002F2A
    .text:01002F37
    .text:01002F39
    .text:01002F39 loc_1002F39:                            ; CODE XREF: sub_1002ED5+41j
    .text:01002F39                 pop     esi
    .text:01002F3A                 retn
    
    0:000> db /c 20 01005340 L360
    01005340  10 10 10 10 10 10 10 10-10 10 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
    01005360  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
    01005380  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
    010053a0  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
    010053c0  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
    010053e0  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
    01005400  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
    01005420  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
    01005440  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
    01005460  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
    01005480  10 10 10 10 10 10 10 10-10 10 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
    010054a0  0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
    010054c0  0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
    010054e0  0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................