3

我一直在尝试对游戏的功能进行逆向工程,但我有点困惑。我对逆向工程很陌生(我正在使用 ollydbg btw),所以我还不知道所有的技巧和细节。

无论如何,这是我的问题。当您在游戏中拾取任何物品时会调用此函数。然后它会计算项目的价值并将该值添加到您的分数中。在调用该函数之前,会推送一个值,我非常确信它是项目的 ID。这是让我感到困惑的代码:

SHL ESI,7
MOV CX,WORD PTR DS:[EDX+ESI+42]

ESI = 项目 ID EDX = 常数值 FE56A0

我猜 EDX (FE56A0) 是一个项目数组的开始,ESI 是项目的索引,42 是项目持有的值的索引。这会有点奇怪,因为你的 ESI 向左移动了 7。随着 ESI 的增加,它的位移值不会线性增长。

因此,如果 EDX 表示数组的开头,而 ESI 将是索引,则数组中的项目将不具有相同的大小。这段代码的含义让我感到困惑。

有人知道这段代码可以代表什么吗?

4

2 回答 2

3

该数组可能包含 128 字节长的结构。移位 7 将 ID 乘以 128,给出访问该 ID 的结构所需的偏移量。42 将是结构的偏移量。

这是有效的,因为乘法实际上线性地增加了乘法索引:

0 << 7 == 0
1 << 7 == 128
2 << 7 == 256
3 << 7 == 384

等等

此代码片段仅访问存储在数组中的结构的成员。

于 2011-04-19T22:43:48.000 回答
2

可能 EDX 指向数组所属的某个结构的开始。数组前面的数据需要 42 个字节,数组中的每个元素需要 128 个字节。(1<<7 是 128 - 移位通常用作乘以 2 的幂的快速方法。)例如,如下所示:

// EDX points here
struct GameItems
{
   int numItems;
   int stuff;
   int moreStuff;
   char[30] data;
   GameItem[MAX_ITEMS] items;  // offset 42 bytes from start
};

struct GameItem
{
   // 128-bit structure
}
于 2011-04-19T22:50:43.787 回答