Обратный инжиниринг, сдвиг влево на семь - PullRequest
3 голосов
/ 20 апреля 2011

Я пытался реконструировать функцию игры, но я немного запутался. Я довольно новичок в реверс-инжиниринге (я использую ollydbg, кстати), поэтому я пока не знаю обо всех хитростях и деталях.

В любом случае, вот моя проблема. Эта функция вызывается, когда вы берете любой предмет в игре. Затем он рассчитывает стоимость предмета и добавляет это значение к вашему счету. Перед вызовом функции передается значение, которое, я уверен, является идентификатором элемента. Это код, который смущает меня:

SHL ESI,7
MOV CX,WORD PTR DS:[EDX+ESI+42]

ESI = идентификатор предмета EDX = постоянное значение FE56A0

Я догадывался, что EDX (FE56A0) - это начало массива элементов, ESI - это индекс элемента, а 42 - индекс значения, которое содержит элемент. Это было бы странно, так как ваш бит смещает ESI влево на 7. По мере увеличения ESI его значение с битовым смещением не растет линейно.

Таким образом, если EDX представляет начало массива, а ESI будет индексом, элементы в массиве не будут иметь одинаковый размер. Смысл этого кода меня озадачивает.

Кто-нибудь понял, что может представлять этот код?

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

Массив может содержать 128-байтовые структуры.Сдвиг на 7 умножает идентификатор на 128, давая смещение, необходимое для доступа к структуре для этого идентификатора.42 будет смещением в структуре.

Это работает, потому что умножение фактически увеличивает умноженный индекс линейно:

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

и т. Д.

Этот фрагмент кода просто обращается к членуструктуры, хранящейся в массиве.

2 голосов
/ 20 апреля 2011

Возможно, что EDX указывает на начало некоторой структуры, частью которой является массив. Данные, которые идут перед массивом, требуют 42 байта, а каждый элемент в массиве требует 128 байтов. (1 << 7 равно 128 - сдвиг часто используется как быстрый способ умножения на степень два.) Например, что-то вроде этого: </p>

// 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
}
...