Обратный инжиниринг неоднозначный синтаксис
То, что я часто вижу в Интернете, когда тема меняется, это синтаксис
*(_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, которая выполняет такие манипуляции, а затем декомпилируйте ее.