2011-04-19 68 views
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将是一个索引,阵列中的项目将不相等的尺寸。 这段代码的含义令我困惑。

任何人有一个想法,这是什么代码可以代表什么呢?

回答

3

阵列可能保持128字节长的结构。移动7将ID乘以128,给出访问该ID结构所需的偏移量。 42将是对结构的抵消。

此操作,因为乘法实际上增加相乘的指数线性:

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

此代码段简单地访问存储在一个阵列中的结构中的一员。

+0

谢谢两位非常感谢!两者都非常有帮助!你似乎是对的。我试图预测使用您的信息调用函数之前的结果,并且预测是正确的! EDX指向数组的底部,条目长度为128个字节,项目的值在偏移量0x42处。我一直在混合使用十六进制和十进制数字,这使我困惑。现在我要试图弄清楚这些条目还有哪些内容^^谢谢! – Vaporice 2011-04-19 23:20:14

2

这可能是因为EDX点到一些结构,其阵列是的一部分的开始。数组之前的数据需要42个字节,数组中的每个元素需要128个字节。 (1 < < 7是128 - 移位经常被用来作为一个快速的方法由二的幂乘。)例如,像这样:

// 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 
} 
+0

谢谢!非常明确的例子,你是对的,因为我已经评论了其他的反应,我可以继续扭转这个游戏! – Vaporice 2011-04-19 23:21:26