конвертировать ASM в C (не обратный инженер)
я погуглил, и я вижу удивительное количество легкомысленных ответов, в основном смеющихся над спрашивающим за такой вопрос.
Microchip предоставляет некоторый исходный код бесплатно (я не хочу публиковать его здесь, если это нет-нет. В принципе, google AN937, нажмите первую ссылку, и есть ссылка на "исходный код" и его сжатый файл). Это в ASM, и когда я смотрю на него, я начинаю косить. Я хотел бы преобразовать его во что-то похожее на язык типа c, чтобы я мог следуйте за мной. Потому что такие строки:
GLOBAL _24_bit_sub
movf BARGB2,w
subwf AARGB2,f
вероятно, очень просты, но они ничего не значат для меня.
должен быть какой-то автоматический переводчик ASM на C, но все, что я могу найти, это люди, говорящие, что это невозможно. Честно говоря, невозможно, чтобы это было невозможно. Оба языка имеют структуру, и эту структуру, безусловно, можно перевести.
спасибо.
13 ответов
вы можете абсолютно сделать программу c из ассемблера. Проблема в том, что это может выглядеть не так, как вы думаете, или, может быть, так и будет. Мой рис ржавый, но с помощью другого ассемблера, скажем, у вас был
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, но один двоичный файл к другому. Вы когда-нибудь задумывались, как работают эти джойстики за 15 долларов в wal-mart с pac-man и galaga? Rom из arcade был преобразован с использованием статического двоичного перевода, оптимизирован и очищен, а 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. Он был упомянут в одном из других сообщений.
пожалуйста, взгляните на примеры на нашем веб-сайте:
должен быть какой-то автоматический переводчик ASM на C, но все, что я могу найти, это люди, говорящие, что это невозможно. Честно говоря, невозможно, чтобы это было невозможно.
нет, это не так. Компиляция теряет информацию: в конечном объектном коде меньше информации, чем в исходном коде C. Декомпилятор не может волшебным образом создать эту информацию из ничего, и поэтому истинная декомпиляция невозможна.
Это не невозможно, просто очень сложно. Квалифицированная сборка и программист C, вероятно, могли бы это сделать, или вы могли бы посмотреть на использование декомпилятор. Некоторые из них выполняют довольно хорошую работу по преобразованию asm в C, хотя вам, вероятно, придется переименовать некоторые переменные и методы.
проверить этот сайт для списка декомпиляторов, доступных для архитектуры x86.
проверить это: декомпилятор
декомпилятор-это имя, данное компьютерная программа, выполняющая обратную операцию на компилятор. То есть, он переводит файл, содержащий информацию относительно низкий уровень абстракции (обычно предназначен для компьютера читаемый, а не читаемый человеком) в форму, имеющую более высокий уровень абстракция (обычно конструированная для того чтобы быть удобочитаемый.)
не легко возможно.
одним из больших преимуществ C над ASM помимо читаемости было то, что он предотвращал "умные" трюки программирования.
есть множество вещей, которые вы можете сделать в ассемблере, которые не имеют прямого эквивалента C, или включить извилистый синтаксис в C.
другая проблема-типы данных большинство ассемблеров по существу имеют только два взаимозаменяемых типа данных: байты и слова. Могут быть некоторые языковые конструкции для определения ints и поплавки так далее. но нет никакой попытки проверить, что память используется так, как определено. Поэтому очень сложно сопоставить хранилище ASM с типами данных C.
кроме того, все хранилище ассемблера по существу является "структурой"; хранилище расположено в порядке, который оно определено (в отличие от C, где хранилище упорядочено по прихоти среды выполнения). Многие программы ASM зависят от точного макета хранилища - для достижения того же эффекта в C вам нужно будет определить все хранилище как часть одной структуры.
также есть много отсутствующих инструкций (на старых worldy IBM manframes 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
специальные case-это директивы/метки ASM, я думаю, что их можно преобразовать только с помощью #defines.
веселье начинается, когда вы достигнете некоторых особенностей процессора. Это могут быть простые вызовы функций с операциями стека, некоторые конкретные операции ввода-вывода / памяти. Более увлекательными являются операции с регистром счетчика программы, используемые для расчетов, или использование/подсчет тиков/задержек.
но есть другой способ, если это хардкор происходит. Это тоже хардкор. :) Существует техника под названием динамический перекомпиляция. Он используется во многих эмулятор.
вам не нужно перекомпилировать ASM, но идея почти такая же. Вы можете использовать все свои #defines с первого шага, но добавить к ним поддержку необходимой функциональности (увеличение ПК/тиков). Также вам нужно добавить некоторую виртуальную среду для вашего кода, такую как менеджеры памяти/ввода-вывода и т. д.
удачи :)
Я думаю, что легче взять книгу по сборке PIC и научиться ее читать. Ассемблер, как правило, довольно прост в освоении, так как он настолько низкий уровень.
трудно преобразовать функцию из asm в C, но выполнимо вручную. Преобразование всей программы с декомпилятором даст вам код, который может быть невозможно понять, так как большая часть структуры была потеряна во время компиляции. Без значимых имен переменных и функций результирующий код C по-прежнему очень трудно понять.
проверить asm2c
Swift tool для преобразования кода сборки DOS/PMODEW 386 TASM в код C