2011-04-19 72 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