Возможно ли декомпилировать DLL написанную на C? - PullRequest
1 голос
/ 22 декабря 2011

Я хочу декомпилировать DLL, которая, как я считаю, была написана на C. Как я могу это сделать?

Ответы [ 3 ]

12 голосов
/ 22 декабря 2011

Краткий ответ: Вы не можете.

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

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

3 голосов
/ 22 декабря 2011

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

Проблема в том, что оптимизация делает скомпилированный код едва узнаваемым / понятным для людей.

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

Самоизменяющийся код также усложняет ситуацию.

См. В этот вопрос Подробнее о теме и доступных инструментах.

0 голосов
/ 22 декабря 2011

Можно, но только до определенной степени:

  1. Оптимизация может изменить код
  2. Символы могли быть удалены (DLL позволяет ссылаться на функции, находящиеся внутри, через индекс вместо символа)
  3. Некоторые комбинации команд не могут быть преобразованы в C
  4. и некоторые другие вещи, которые я мог бы забыть ...
...