Как отличить код ARM от кода Thumb при статическом анализе - PullRequest
0 голосов
/ 27 августа 2018

Я знаю, что код Thumb состоит из 16 бит, а код ARM состоит из 32 бит.Но есть ли способ увидеть конкретные смещения в файле и сказать, является ли инструкция кодом ARM или кодом Thumb?При реализации дизассемблера мне интересно, как я могу различить код ARM и код Thumb.

1 Ответ

0 голосов
/ 02 октября 2018

Большинство произвольных последовательностей слов будут представлять как действительные инструкции ARM, так и допустимые пары инструкций Thumb.В большинстве случаев, таким образом, не было бы 100% надежного способа различить два, если бы не можно было идентифицировать код, который, как известно, выполнялся, и который выполнял бы BX или BLX с известной целью перехода (в этом случае LSBtarget будет различать код ARM или Thumb).

Однако, с точки зрения эвристики, распределение битовых комбинаций, обнаруженных в типичном коде, будет очень разным в коде ARM и Thumb.Например, даже если кто-то ничего не знал о каких-либо конкретных инструкциях, он просто перечислял содержимое каждого 32-разрядного слова в виде 8-значного шестнадцатеричного числа, по одному на строку, и наблюдал распределение значений цифр в каждомВ столбце столбцы, все восемь столбцов, вероятно, дадут разные распределения с кодом ARM, но первые четыре столбца будут иметь распределение, подобное последним четырем, если дан код Thumb.Этот эффект обычно был бы особенно выражен, если бы посмотреть на столбец «код условия», так как большинство инструкций не указывают код условия.

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

...