逆向工程,左移位7

时间:2011-04-19 22:40:12

标签: bit shift ollydbg

我一直试图对游戏功能进行逆向工程,但我有点困惑。我很擅长逆向工程(我正在使用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将是一个索引,那么数组中的项目大小不会相同。 这段代码的含义令我感到困惑。

任何人都知道这段代码可能代表什么?

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:2)

可能是EDX指向数组所属的某些结构的开头。数组之前的数据需要42个字节,并且数组中的每个元素需要128个字节。 (1&lt;&lt;&lt; 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
}