调试程序集以查找用于引用游戏中的值的静态指针

时间:2009-07-15 05:11:30

标签: debugging assembly

我之前在这里问了一个问题,但我没有注册,无法编辑我的条目(不确定是否可以)或添加有关该问题的任何信息。这次我会尝试更加彻底,所以我希望得到一个答案......

我正在尝试找到静态指针和偏移列表,以便每次重新启动时都能轻松找到游戏中的信息。我对每一条信息都很成功但只有一条...

目前,我正在使用CheatEngine来帮助我调试并找到所需的指针路径。

我想要的值的地址(随着每个游戏的开始而变化)目前是:849576A作为参考,这是我的第一个角色的第一个库存槽。我知道每个插槽偏移20h,每个字符偏移550h。所以角色二的第一个库存槽是849576A + 550h。同样,这些地址会改变每次重启,但偏移不会。

使用CE,我可以看到访问此地址的内容...它返回以下操作码:

在游戏中做任何事情之前返回这两个:

004b7ef9 - 0f bf 08 - movsx ecx,word ptr [eax]

004b542b - 0f bf 04 0a - movsx eax,word ptr [edx+ecx]

然后在我的库存中移动项目时,我得到了这些:

74be5008 - 72 2a - jb memcpy+84

004bfc3a - 0f bf 4c 02 60 - movsx ecx,word ptr [edx+eax+60]

004bf43f - 8d 7d 9c - lea edi,[ebp-64]

我不确定要使用哪个,所以我只选择一个并在其中一个上设置断点,我选择了004b542b,这是完整的代码部分:

004B53F0 | 55               | PUSH    EBP                       |
004B53F1 | 8BEC             | MOV     EBP, ESP                  |
004B53F3 | 83EC 0C          | SUB     ESP, C                    |
004B53F6 | 894D F4          | MOV     DWORD PTR [EBP-C], ECX    |
004B53F9 | C745 FC 00000000 | MOV     DWORD PTR [EBP-4], 0      |
004B5400 | 837D 08 00       | CMP     DWORD PTR [EBP+8], 0      |
004B5404 | 7F 04            | JG      004B540A                  |
004B5406 | 33C0             | XOR     EAX, EAX                  |
004B5408 | EB 43            | JMP     004B544D                  |
004B540A | C745 F8 0F000000 | MOV     DWORD PTR [EBP-8], F      |
004B5411 | EB 09            | JMP     004B541C                  |
004B5413 | 8B45 F8          | MOV     EAX, DWORD PTR [EBP-8]    |
004B5416 | 83C0 01          | ADD     EAX, 1                    |
004B5419 | 8945 F8          | MOV     DWORD PTR [EBP-8], EAX    |
004B541C | 837D F8 19       | CMP     DWORD PTR [EBP-8], 19     |
004B5420 | 7D 28            | JGE     004B544A                  |
004B5422 | 8B4D F8          | MOV     ECX, DWORD PTR [EBP-8]    |
004B5425 | C1E1 05          | SHL     ECX, 5                    |
004B5428 | 8B55 F4          | MOV     EDX, DWORD PTR [EBP-C]    |
004B542B | 0FBF040A         | MOVSX   EAX, WORD PTR [EDX+ECX]   |
004B542F | 3B45 08          | CMP     EAX, DWORD PTR [EBP+8]    |
004B5432 | 75 14            | JNZ     004B5448                  |
004B5434 | 8B4D F8          | MOV     ECX, DWORD PTR [EBP-8]    |
004B5437 | C1E1 05          | SHL     ECX, 5                    |
004B543A | 8B55 F4          | MOV     EDX, DWORD PTR [EBP-C]    |
004B543D | 0FBF440A 02      | MOVSX   EAX, WORD PTR [EDX+ECX+2] |
004B5442 | 0345 FC          | ADD     EAX, DWORD PTR [EBP-4]    |
004B5445 | 8945 FC          | MOV     DWORD PTR [EBP-4], EAX    |
004B5448 | EB C9            | JMP     004B5413                  |
004B544A | 8B45 FC          | MOV     EAX, DWORD PTR [EBP-4]    |
004B544D | 8BE5             | MOV     ESP, EBP                  |
004B544F | 5D               | POP     EBP                       |
004B5450 | C2 0400          | RETN    4                         |

我决定设置一个断点,这样我就能看到可以访问我的值的行之前和之后的寄存器值(004B542B | 0FBF040A | MOVSX EAX,WORD PTR [EDX + ECX])。

在:

EAX: 00000000
EBX: 00000000
ECX: 000001E0
EDX: 0849558C
ESI: 000000D0
EDI: 013A38A8
EBP: 00189CE0
ESP: 00189CD4
EIP: 004B542B

在:

EAX: 00000DAD
EBX: 00000000
ECX: 000001E0
EDX: 0849558C
ESI: 000000D0
EDI: 013A38A8
EBP: 00189CE0
ESP: 00189CD4
EIP: 004B542F

对我来说,这意味着EDX 0849558C应该是我想要查找的值,然后应用1E0的偏移量。然而。当搜索内存中与EDX匹配的十六进制值时,我得不到任何结果,这意味着没有任何指向该地址的指针。

我使用了我在这里尝试使用的相同方法,成功收集每个静态地址然后应用偏移量。例如,这里是静态地址+偏移量来查找我的健康状况:01263FC8 +284 + C +30 +90

1 个答案:

答案 0 :(得分:2)

我终于明白了。不幸的是,调试让我无处可去,所以我开始查看我之前为我的角色找到的指针。特别是健康和法术力,因为这些最接近我的库存地址。我根据我试图找到的地址和最接近我健康状况的指针进行了一些数学运算,并找到了偏移量。使用该偏移量和我为健康找到的相同静态指针,我每次都能找到我的库存。