Хорошие новости: Возможно, окончательно.
Плохие новости: Но это большая работа, в зависимости от размера вашего приложения. Я делал это более одного раза с кодом AVR, написанным на C, BASCOM или C ++ (Arduino). Это займет несколько часов, например около 20 часов для 100-линейной линии в BASCOM.
Подход таков:
- Разобрать файл HEX. Используйте этот вывод в качестве ссылки. Возможно, вам понадобятся некоторые параметры, чтобы иметь все постоянные данные в выводе.
- Начните с наилучшего приближения источника, который все еще хранится в вашей памяти.
- Скомпилируйте, скомпонуйте и преобразуйте его в HEX-файл
- Разберите этот HEX-файл и сравните вывод со ссылкой.
- Повторяйте редактирование исходного кода, пока обе разборки не будут равны.
Примечания:
- Вам необходимо глубокое понимание перевода из C в машинный код.
- Имена функций и переменных не могут быть точно восстановлены. Эти имена исчезают после компиляции и компоновки.
- Имейте в виду, что порядок функций в результирующем коде может не зависеть от их появления в исходном коде. Однако большинство компиляторов делают это.
- Имейте в виду, что порядок переменных в памяти может зависеть не от их появления в источнике, а от их имени. Кроме того, они обычно не сортируются лексически, например, я обнаружил, что G CC использует какой-то алгоритм хеширования. Однако члены структур сохраняют свой порядок, потому что стандарт требует, чтобы.
- На первом этапе игнорировали различия в размещении переменных.
- Попробуйте определить функции библиотеки C, и игнорируй их. Особенно семейство
printf()
dr aws с множеством других функций. Когда ваш собственный код будет готов, библиотечные функции также будут там, скорее всего.
Последнее замечание: если у вас есть файл ELF, используйте его для разборки и поиска имен. Вы будете намного быстрее.