Обратный инжиниринг, сдвиг левого бита на семь

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

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

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

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

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

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

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


person Maarten van Beek    schedule 19.04.2011    source источник


Ответы (2)


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

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

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

и т.п.

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

person Ori Pessach    schedule 19.04.2011
comment
Большое спасибо вам обоим! Оба были очень полезны! И ты вроде бы прав. Я попытался предсказать результаты непосредственно перед вызовом функции, используя вашу информацию, и прогнозы верны! EDX указывает на основание массива, записи имеют длину 128 байт, а значения элементов находятся со смещением 0x42. Я путал шестнадцатеричные и десятичные числа, что меня смутило. Теперь я попытаюсь выяснить, что еще содержат эти записи ^^ Спасибо! - person Maarten van Beek; 20.04.2011

Возможно, 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
}
person mdma    schedule 19.04.2011
comment
Спасибо! Очень наглядный пример, вы правы, и, поскольку я прокомментировал другой ответ, я могу продолжить эту игру вспять! - person Maarten van Beek; 20.04.2011