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