Advik Raj Ответов: 3

Как преобразовать ассемблерный код в код C/C++?


Само собой разумеется. Как это работает?

У меня есть фрагмент ассемблерного кода, который я получил из другого кода C, используя компилятор MinGW и CMD. (Пожалуйста, не спрашивайте, почему я его получил.)

Моя цель-преобразовать этот ассемблерный код в код C/C++ с использованием любого приложения, например декомпилятора?

Что я уже пробовал:

CMD код для этой программы:

gcc -s -o main.s main.c


В настоящее время у меня есть файл .s (файл сборки), который кажется совершенно бесполезным, если только он не конвертируется.


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

Richard MacCutchan

Зачем вы его декомпилировали?

3 Ответов

Рейтинг:
2

CPallini

Конечно лучшим решением был бы доступ к оригиналу C кодовая форма, из которой была "получена"сборка.
Вы также можете использовать свой ассемблерный код вместе с другими (C) исходный файл, gcc обрабатывает оба типа.
Последний вариант является самым сложным, вы должны понять, что делает ассемблерный код и воспроизвести такую функциональность с помощью C программа.


Рейтинг:
1

Stefan_Lang

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

Затем вы можете перейти к идентификации функций, дать им собственное имя в соответствии с тем, что вы узнали, или временное имя, если вы не уверены. Не должно быть трудно определить структуру и разрушение стека вызовов в начале и в конце функций - сделайте это далее.

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

Однако большой вопрос заключается в том, что вы хотите сделать с ним после преобразования, и стоит ли это всех усилий:

1. Если вы хотите просто понять, что делает код, вероятно, лучше придерживаться сборки, выяснить, что она делает, и добавить некоторую документацию.

2. Если вы хотите каким-то образом скорректировать поведение, то вам лучше изменить ассемблерный код: по крайней мере, вам не нужно будет понимать весь код, только те части, которые вы изменяете.

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


Рейтинг:
0

Richard MacCutchan

Сборка с[^]