3

ゲームの機能をリバース エンジニアリングしようとしていますが、ちょっと混乱しています。私はリバースエンジニアリングにかなり慣れていないので(ところでollydbgを使用しています)、すべてのトリックと詳細についてまだよく知りません。

とにかくここに私の問題があります。この関数は、ゲーム内のアイテムを拾うときに呼び出されます。次に、アイテムの値を計算し、この値をスコアに追加します。関数が呼び出される前に、アイテムの 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 がインデックスである場合、配列内の項目は同じサイズにはなりません。このコードの意味は私を困惑させています。

このコードが何を表しているか、誰にもわかりませんか?

4

2 に答える 2

3

配列は、128 バイト長の構造体を保持する場合があります。7 だけシフトすると、ID が 128 倍され、その ID の構造体にアクセスするために必要なオフセットが得られます。42 は、構造へのオフセットになります。

これが機能するのは、乗算によって乗算されたインデックスが実際に線形に増加するためです。

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

このコード スニペットは、配列に格納されている構造体のメンバーにアクセスするだけです。

于 2011-04-19T22:43:48.000 に答える
2

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
}
于 2011-04-19T22:50:43.787 に答える