Использование значения dword в качестве операнда для ASM jmp - PullRequest
0 голосов
/ 18 сентября 2011

Я играю с некоторыми исправлениями функций времени выполнения, но у меня проблема с порядком байтов при записи значений адресов памяти.Итак, что у меня есть:

 char buf[] = \xE9\xDE\xAD\xBE\xEF

Во время выполнения я должен исправить 0xDEADBEEF, чтобы он указывал на фактический адрес - вот моя функция, чтобы сделать это:

void FixJMPAddress(BYTE *jump, BYTE *newRoutine) {

  DWORD address;
  DWORD *dwPtr;

  address = (DWORD)newRoutine;
  dwPtr = (DWORD *)&(jump[1]);
  *dwPtr = address;

}

Он вызывается какчто:

  FixJMPAddress(buf, &Something);

К сожалению, при разборке конечного результата я получаю:

   E9 60 DA 47 93 

вместо

   E9 93 47 DA 60

Так что это связано с тем, что x86little-endian, но есть ли способ, с помощью которого я могу справиться автоматически, без необходимости писать функцию, которая, по сути, обращает всплывающее окно ввода?

1 Ответ

0 голосов
/ 18 сентября 2011

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

Реальная проблема в том, что jmp использует относительное смещение , а не абсолютное.Чтобы вычислить назначение jmp:

dest = address_of_jmp + operand + sizeof(jmp_instruction)

Предполагая, что BYTE* jump указывает на фактическую инструкцию, которая будет выполнена, она должна быть:

LONG delta = address - (DWORD)jump - 5;
*(LONG*)(jump+1) = delta;
...