Reverse/balls/solve.md
2024-09-29 11:53:21 +08:00

4.2 KiB
Raw Blame History

寻找小球正确的摆放位置

  1. 分析程序大致可得到这样的程序结构

    [ebp-18]: index
    [ebp-1C]: 正确计数
    2734Index Loop
    检查圈[index]与框[index]的左边
    2826
    检查圈[index]与框[index]的上边
    2918
    检查圈[index]与框[index]的右边
    2b02
    检查圈[index]与框[index]的下边
    

    这已经足够找出各个小球和盒子的位置关系了,因为我比较懒,所以这里就不列出详细坐标了。想看正确答案的看底下↓

  2. 这是一个笨方法

    首先转到成功部分

    00402CF8 | 74 11            | je balls.402D0B                         |
    00402CFA | 66:8B4D E4       | mov cx,word ptr ss:[ebp-1C]             |
    00402CFE | 66:83C1 01       | add cx,1                                |
    00402D02 | 0F80 07010000    | jo balls.402E0F                         |
    00402D08 | 894D E4          | mov dword ptr ss:[ebp-1C],ecx           |
    00402D0B | B8 01000000      | mov eax,1                               |
    00402D10 | 66:0345 E8       | add ax,word ptr ss:[ebp-18]             |
    00402D14 | 0F80 F5000000    | jo balls.402E0F                         | error
    00402D1A | 8945 E8          | mov dword ptr ss:[ebp-18],eax           |
    00402D1D | 33DB             | xor ebx,ebx                             |
    00402D1F | E9 07FAFFFF      | jmp balls.40272B                        |
    00402D24 | B9 0A000000      | mov ecx,A                               | ecx:&"S领O", 0A:'\n'
    00402D29 | 66:394D E4       | cmp word ptr ss:[ebp-1C],cx             | 检查2
    00402D2D | 75 6C            | jne <balls.fail>                        |
    00402D2F | B8 04000280      | mov eax,80020004                        | success
    00402D34 | 894D 84          | mov dword ptr ss:[ebp-7C],ecx           |
    00402D37 | 894D 94          | mov dword ptr ss:[ebp-6C],ecx           |
    00402D3A | 894D A4          | mov dword ptr ss:[ebp-5C],ecx           | [ebp-5C]:_PeekMessageA@20
    00402D3D | 8D95 74FFFFFF    | lea edx,dword ptr ss:[ebp-8C]           |
    00402D43 | 8D4D B4          | lea ecx,dword ptr ss:[ebp-4C]           | [ebp-4C]:rtcGetCurrentCalendar+2F5
    00402D46 | 8945 8C          | mov dword ptr ss:[ebp-74],eax           |
    00402D49 | 8945 9C          | mov dword ptr ss:[ebp-64],eax           | [ebp-64]:rtcIsMissing+11A
    00402D4C | 8945 AC          | mov dword ptr ss:[ebp-54],eax           |
    00402D4F | C785 7CFFFFFF 4C | mov dword ptr ss:[ebp-84],balls.401B4C  | 401B4C:L"CONGRATULATIONS"
    00402D59 | C785 74FFFFFF 08 | mov dword ptr ss:[ebp-8C],8             |
    

    能看到成功之前是要检查[ebp-1C]是否等于10

    翻找了一下,只有这里涉及到[ebp-1C]

    00402CF0 | F7DB             | neg ebx                                 |
    00402CF2 | 83C4 24          | add esp,24                              |
    00402CF5 | 66:85DB          | test bx,bx                              |
    00402CF8 | 74 11            | je balls.402D0B                         |
    00402CFA | 66:8B4D E4       | mov cx,word ptr ss:[ebp-1C]             |
    00402CFE | 66:83C1 01       | add cx,1                                |
    00402D02 | 0F80 07010000    | jo <balls.ErrOverflow>                  |
    00402D08 | 894D E4          | mov dword ptr ss:[ebp-1C],ecx           |
    00402D0B | B8 01000000      | mov eax,1                               |
    00402D10 | 66:0345 E8       | add ax,word ptr ss:[ebp-18]             |
    00402D14 | 0F80 F5000000    | jo <balls.ErrOverflow>                  | error
    00402D1A | 8945 E8          | mov dword ptr ss:[ebp-18],eax           |
    00402D1D | 33DB             | xor ebx,ebx                             |
    00402D1F | E9 07FAFFFF      | jmp balls.40272B                        |
    

    所以

    00402CFE | 66:83C1 01       | add cx,1                                |
    

    在这里设置条件断点,cx==1

    然后去程序窗口中随便找个球拖拽,只要对了就会触发断点

    触发后把条件+1然后继续找

    最后你会得到正确答案

    2024-09-29_101703

    顺带一提观察球和盒的index可见一对一关系