конвертировать ASM в C (не обратный инженер)

Я googled, и я вижу удивительное количество легкомысленных ответов, в основном смеющихся над тем, кто задал такой вопрос.

Microchip предоставляет бесплатный исходный код (я не хочу публиковать его здесь, если это не-нет. В основном, google AN937, нажмите на первую ссылку, и есть ссылка на «исходный код» и его зашифрованный файл). Его в ASM, и когда я смотрю на это, я начинаю скрещивать глаза. Я хотел бы преобразовать его в нечто похожее на язык типа ac, чтобы я мог следовать. Поскольку такие строки, как:

GLOBAL _24_bit_sub movf BARGB2,w subwf AARGB2,f 

вероятно, очень просты, но для меня это ничего не значит.

Там должен быть какой-то автоматизированный переводчик ASM на C, но все, что я могу найти, это люди, которые говорят, что это невозможно. Честно говоря, его невозможно сделать невозможным. Оба языка имеют структуру, и эта структура, безусловно, может быть переведена.

Спасибо.

Вы можете абсолютно сделать программу ac с ассемблера. Проблема в том, что это может выглядеть не так, как вы думаете, или, может быть, так и будет. Мой ПИК ржавый, но с использованием другого ассемблера, скажем,

 add r1,r2 

В C позволяет говорить, что это становится

 r1 = r1 + r2; 

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

 q = mem[0x12]; e = q; q = mem[0x13]; e = e + q; mem[0x12] = e; 

Длинные и вытянутые, но ясно, что mem [0x12] = mem [0x12] + mem [0x13];

Эти ячейки памяти, вероятно, являются переменными, которые не будут прыгать, как скомпилированный код C для процессора с кучей регистров. Рис. Может облегчить вычисление переменных, а затем выполнить поиск и заменить, чтобы назвать их по всему файлу.

То, что вы ищете, называется статическим двоичным переводом, не обязательно переводом из одного двоичного кода в другой (один процессор в другой), но в этом случае перевод из pic-двоичного кода в C. В идеале вы хотели бы взять ассемблер, указанный в заметьте приложение и соберите его в двоичном формате с использованием инструментов микрочипа, а затем выполните перевод. Вы также можете выполнять динамический двоичный перевод, но вы даже менее склонны находить один из них, и он обычно не приводит к C, а к одному двоичному. Вы когда-нибудь задумывались, как работают эти джойстики в $ 15 на wal-mart с pac-man и galaga? Ром из аркады был преобразован с использованием статического бинарного перевода, оптимизирован и очищен, а C или любой другой промежуточный язык скомпилирован для нового целевого процессора в карманном ящике. Я думаю, что не все из них были сделаны таким образом, но я уверен, что некоторые из них были.

Вопрос в миллион долларов, вы можете найти статический бинарный переводчик для pic? Кто знает, вам, вероятно, придется написать один. И угадайте, что это значит, вы пишете дизассемблер и вместо того, чтобы разбирать инструкцию в синтаксисе родного ассемблера, например add r0, r1, вы распечатываете свой дизассемблер r0 = r0 + r1; К тому времени, когда вы закончите этот дизассемблер, хотя вы хорошо знаете язык ассемблера pic, вам не понадобится переводчик asm to C. У вас проблема с курицей и яйцом.

Получение точного исходного кода из скомпилированной программы в принципе невозможно. Но декомпиляторы были областью исследований в области информатики (например, декомпилятор dcc , который был проектом PhD).

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

Возможно, вы захотите проверить Бумеранг на недавнюю попытку с открытым исходным кодом на обобщенном декомпиляторе.

Вы не можете детерминистически преобразовать код сборки в C. Прерывания, самомодифицирующийся код и другие вещи низкого уровня не имеют представления, отличного от встроенной сборки на C. Существует только определенная степень, в которой может работать процесс сборки с C. Не говоря уже о том, что полученный C-код, вероятно, будет сложнее понять, чем на самом деле читать код сборки … если вы не используете это как основу для начала повторной реализации кода сборки в C, то это несколько полезно. Проверьте плагин Hex-Rays для IDA.

Я когда-то работал над проектом, где значительная часть интеллектуальной собственности составляла некоторые серьезные алгоритмы, закодированные в ассемблере x86. Чтобы портировать код во встроенную систему, разработчик этого кода (а не я) использовал инструмент из экипировки под названием MicroAPL (если я правильно помню):

Я был очень, очень удивлен, насколько хорошо этот инструмент.

С другой стороны, я думаю, что это один из тех, «если вы должны спросить, вы не можете себе этого позволить» (их ценовые диапазоны для однократной конверсии проекта работают до 4 строк обработанной сборки за доллар).

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

Да, очень возможно перепроектировать код ассемблера с хорошим качеством C.

Я работаю в MicroAPL, компании, которая выпускает инструмент Relogix для преобразования кода ассемблера в C. Он упоминался в одном из других сообщений.

Пожалуйста, ознакомьтесь с примерами на нашем веб-сайте:

http://www.microapl.co.uk/asm2c/index.html

Там должен быть какой-то автоматизированный переводчик ASM на C, но все, что я могу найти, это люди, которые говорят, что это невозможно. Честно говоря, его невозможно сделать невозможным.

Нет, это не так. Компиляция теряет информацию: в конечном объектном коде меньше информации, чем в исходном коде C. Декомпилятор не может магически не создавать эту информацию из ничего, поэтому истинная декомпиляция невозможна.

Это не невозможно, просто очень сложно. Возможно, опытная assembly и программист С могли бы это сделать, или вы могли бы использовать Decompiler . Некоторые из них делают хорошую работу по преобразованию asm в C, хотя вам, вероятно, придется переименовать некоторые переменные и методы.

Проверьте этот сайт на список декомпиляторов, доступных для архитектуры x86.

Проверьте это: декомпилятор

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

Нелегко.

Одним из больших преимуществ C над ASM помимо удобства чтения было то, что он предотвратил «умные» программные трюки.

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

Другая проблема – типы данных, в большинстве сборщиков которых есть только два взаимозаменяемых типа данных: байты и слова. Могут быть некоторые языковые конструкции для определения int и float и т. Д., Но нет попытки проверить, что память используется как определено. Поэтому очень сложно отобразить хранилище ASM для типов данных C.

Кроме того, все хранилища ассемблера по существу являются «структурой»; хранилище выкладывается в том порядке, в котором он определен (в отличие от C, где хранение упорядочивается по прихоти среды исполнения). Многие программы ASM зависят от точного расположения хранилища – чтобы добиться такого же эффекта в C, вам нужно будет определить все хранилище как часть одной структуры.

Также есть много абсурдных инструкций (по старым мировым маскарам IBM, LA, адрес загрузки, инструкция была регулярной, используемой для выполнения простой арифметики, поскольку она была быстрее и не нуждалась в регистре переполнения)

Хотя технически возможно перевести на C, полученный C-код был бы менее читаемым, чем код ASM, который был трансалирован.

Я могу сказать с гарантией 99%, нет готового конвертера для этого языка ассемблера, поэтому вам нужно написать его. Вы можете просто реализовать его, заменив команду ASM на функцию C:

 movf BARGB2,w -> c_movf(BARGB2,w); subwf AARGB2,f -> c_subwf(AARGB2,f); 

Эта часть проста 🙂 Затем вам нужно реализовать каждую функцию. Вы можете объявлять регистры как глобальные, чтобы упростить задачу. Также вы можете использовать не функции, а #defines, вызывающие функции, если это необходимо. Это поможет в обработке аргументов / результатов.

 #define c_subwf(x,y) // I don't know this ASM, but this is some Substraction must be here 

Особым случаем являются директивы / метки ASM, я думаю, что он может быть преобразован только с #defines.

Веселье начинается, когда вы достигнете некоторых особенностей, характерных для процессора. Это могут быть простые вызовы функций со стековыми операциями, некоторые операции с IO / памятью. Более интересными являются операции с регистром счетчика программ, используемые для расчетов, или использование / подсчет тиков / задержек.

Но есть и другой способ, если этот хардкор случится. Это тоже хардкор 🙂 Существует так называемая динамическая перекомпиляция . Он используется во многих эмуляторах .

Вам не нужно перекомпилировать ваш ASM, но идея почти такая же. Вы можете использовать все свои #defines с первого шага, но добавьте им необходимую функциональность (увеличивая количество ПК / Ticks). Также вам нужно добавить некоторую виртуальную среду для вашего кода, например, менеджеров памяти / IO и т. Д.

Удачи 🙂

Я думаю, что легче собрать книгу по сборке ПОС и научиться ее читать. Ассемблер, как правило, довольно просто узнать, так как он настолько низкий.

Трудно преобразовать функцию из asm в C, но выполнимо вручную. Преобразование всей программы с помощью декомпилятора даст вам код, который невозможно понять, поскольку большая часть структуры была потеряна во время компиляции. Без значимых имен переменных и функций результирующий код C все еще очень трудно понять.

Проверьте asm2c

Инструмент Swift для преобразования DOS / PMODEW 386 TASM Код сборки в код C

Давайте будем гением компьютера.