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



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



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



GLOBAL  _24_bit_sub
movf BARGB2,w
subwf AARGB2,f


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

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



Спасибо.

968   13  

13 ответов:

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

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 на C. У вас проблема с курицей и яйцом.

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

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

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

Вы не можете детерминистически преобразуйте ассемблерный код в 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, но все, что я могу найти, - это люди, говорящие, что это невозможно. Честно говоря, это невозможно для него быть невозможным.

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

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

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

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

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

Это не так просто.

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

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

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

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

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

Хотя технически возможно перевести на С, полученный код С будет менее читаемым, чем код 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.

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

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

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

Удачи:)

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

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

Проверьте asm2c

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

Comments

    Ничего не найдено.