Обратный инжиниринг неоднозначный синтаксис

То, что я часто вижу в Интернете, когда тема меняется, это синтаксис

  *(_WORD *)(a1 + 6) = *(_WORD *)(a2 + 2);

Я думаю, что этот код взят из плагина IDA (верно?), Но я не могу этого понять... может кто-нибудь объяснить мне немного, или указать что-то, где изучить эту природу кода?

Спасибо заранее =)

1 ответ

Решение

Этот код копирует 2 байта с адреса, на который указывает a2 + 2 на адрес, указанный a1 + 6,

Более подробно код делает следующее:

  • увеличить 2 байта от a2,
  • рассматривать результат как WORD указатель, т.е. указатель на значение, состоящее из двух байтов. Это (_WORD *) часть справа.
  • прочитайте 2 байта, на которые ссылается указатель выше. Это * в самом левом углу выражения справа.

Теперь у нас есть 16-битное значение. Теперь мы:

  • передвигаться на 6 байт от a1,
  • рассматривать результат как WORD указатель. Опять же, это (_WORD *) часть.
  • запишите 2 байта, которые мы прочитали в первой части, в адрес, на который указывает имеющийся у нас указатель.

Если вы никогда не видели такой код раньше, вы можете подумать, что излишне использовать (_WORD*) по обе стороны выражения - но это не так. Например, мы можем прочитать 16-битное значение и записать его в указатель на 32-битное значение (например, с помощью расширения его знака).

Я предлагаю вам также взглянуть на ассемблерный код, где вы увидите шаги, составляющие это назначение. Если у вас его нет, просто напишите программу на C, которая выполняет такие манипуляции, а затем декомпилируйте ее.

Другие вопросы по тегам