我一直在尝试对游戏的一个功能进行逆向工程,但我有点困惑。我对逆向工程非常陌生(我使用的是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将是一个索引,则数组中的项的大小将不相等。这段代码的含义让我困惑不解。
有人知道这段代码代表了什么吗?
发布于 2011-04-20 06:43:48
该数组可能包含128字节长的结构。移位7将ID乘以128,给出访问该ID的结构所需的偏移量。42将是进入结构的偏移量。
这是因为乘法实际上线性地增加了相乘后的索引:
0 << 7 == 0
1 << 7 == 128
2 << 7 == 256
3 << 7 == 384等。
这段代码只是访问存储在数组中的结构的一个成员。
发布于 2011-04-20 06:50:44
可能是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
}https://stackoverflow.com/questions/5723586
复制相似问题