Вы правы относительно своего определения декомпилятора: он берет скомпилированное приложение и создает соответствующий исходный код. Однако он не в большинстве случаев знает имя и структуру переменных / функций / классов - он просто догадывается. Он анализирует поток программы и пытается найти способ представить этот поток через определенный язык программирования, обычно C. Однако, потому что язык выбора (в нашем примере C) часто находится на более высоком уровне, чем состояние базовой программы (двоичный исполняемый файл) некоторые части программы могут быть невозможно точно представить; в этом случае декомпилятор потерпит неудачу, и вам потребуется использовать дизассемблер. Вот почему многим людям нравится запутывать свой код: декомпиляторам намного труднее его открыть.
Создание декомпилятора - непростая задача. По сути, вам нужно взять приложение, которое вы декомпилируете (будь то исполняемый файл или какая-либо другая форма скомпилированного приложения), и проанализировать его в виде дерева, с которым вы можете работать в памяти. Затем вы проанализируете поток программы и попытаетесь найти шаблоны, которые могут указывать на то, что оператор if
/ переменная / функция / и т. Д. Использовался в определенном месте кода. На самом деле это всего лишь игра в догадки: вам нужно знать шаблоны, которые компилятор создает в скомпилированном коде, а затем искать эти шаблоны и заменять их эквивалентным понятным для человека исходным кодом.
Все это намного проще для программ более высокого уровня, таких как Java или .NET, где вам не нужно иметь дело с инструкциями по сборке, а такие вещи, как переменные, в основном заботятся о вас. Там вам не нужно угадывать столько, сколько просто переводить. Возможно, у вас нет точных имен переменных / методов, но вы, по крайней мере, можете довольно легко определить структуру программы.
Отказ от ответственности: я никогда не писал декомпилятор и поэтому не знаю всех деталей того, о чем я говорю. Если вы действительно заинтересованы в написании декомпилятора, вы должны получить книгу на эту тему.