Kaysikarline Ответов: 2

Как правильно декомпилировать dll и exe файлы и конвертировать декомпилированный код в правильный исходный код


Привет Гуру,
Я начинающий программист с небольшим опытом и некоторыми знаниями в области C# и Asp.net-да.
В настоящее время мне поручено внести изменения для некоторых страниц оконного приложения C#, использующего Webservice (C# 4.0, .Net Framework 4.0). У меня нет исходного кода для проекта, но есть только exe-файлы и dll-файлы (несколько dll-файлов в папке bin и 3 exe-файла, несколько файлов .resx,. asmx-файлов и веб-конфигурации снаружи корзины).

После поиска в google я понимаю, что мне нужно использовать инструменты reflector для декомпиляции кода и плагин reflexil для изменения кода. Я декомпилировал все exe и dll файлы приложения и, наконец, получил исходный код с большим количеством ошибок. Однако я не вижу никакой страницы дизайна и не имею ни малейшего представления о том, правильна ли структура решения или нет, так как я вообще не видел исходный код раньше.Мне действительно нужна ваша помощь.Я хотел бы получить правильный исходный код и структуру решения.

Я был бы глубоко признателен, если бы кто-нибудь мог мне это сказать
1) каков правильный способ декомпиляции ? (Нужно ли мне декомпилировать как exe-файлы, так и dll-файлы или любой из них?)
2) Как лучше изменить код? (через рефлектор с reflexil или Visual Studio)
3) Могу ли я получить некоторые ссылки, которые хорошо объясняют, как преобразовать декомпилированный код (автоматически сгенерированный код) в правильный исходный код?
4) Как мне сделать, чтобы получить страницу дизайна (все, что я вижу, - это страница .cs)?
5) Как проверить правильность текущей структуры решения или нет?

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

Примечание:предыдущий программист покинул компанию и не имеет исходного кода.

Kaysikarline

Ссылаясь на Q3:
Как отредактировать декомпилированный код?
Например, у меня есть декомпилированный код следующим образом:
[
private bool MoveNext()
{
переключатель (это.<>1__состояние)
{
случай 0:
это.<>1__состояние = -1;
это.<count>5__1 = 0;
в то время как (это.<count>5__1 < 10)
{
это.<>2__current = это.<count>5__1;
это.<>1__state = 1;
вернуть true;
Label_004B:
это.<>1__состояние = -1;
это.<count>5__1++;
}
перерыв;

корпус 1:
перейти Label_004B;
}
возвращать false;
}
]
Нужно ли мне изменить это, как показано ниже?
[
статический IEnumerator GetCounter()
{
for (int count = 0; count < 10; count++)
{
доходность рентабельность подсчитать;
}
}
]

GKP1992

Вы не должны оставаться там, где работаете прямо сейчас. Уезжай как можно скорее.

2 Ответов

Рейтинг:
2

Ron Beyer

У меня всегда были проблемы с декомпиляцией и рефлектором, попробуйте DotPeek[^].

1. Вам действительно нужно только декомпилировать тот, который вам нужно изменить. Если вы измените API в DLL, это может потребовать от вас изменить EXE-файл.

2. существуют инструменты, которые позволяют вам работать непосредственно с MSIL и изменять его внутри инструмента, но я бы предпочел вернуться к коду и перекомпилировать все это. "Лучший" - это тот, который работает в вашей ситуации с наименьшим количеством усилий.

3. я не уверен, что вы имеете в виду "правильный" исходный код. Если вы имеете в виду код без ошибок, попробуйте инструмент, который я связал выше. Он будет преобразован в C#, и у людей были хорошие результаты с ним. Однако ни один инструмент не является эффективным на 100%, поскольку компилятор может включать оптимизации, которые невозможно реплицировать в исходном коде.

4. Многие декомпиляторы (рефлектор-один из них с этой проблемой) не создают отдельные файлы Designer.cs. Я не уверен, что DotPeek будет создавать дизайнерские файлы, но хорошего способа обойти это нет. Файлы конструктора существуют исключительно для того, чтобы облегчить отделение кода конструктора от кода пользователя, поскольку после его запуска через компилятор невозможно определить, был ли он сгенерирован дизайнером или пользователем.

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


Kaysikarline

Большое вам спасибо за ваш добрый ответ. Что касается вопроса № 3, то я обновил его, как указано выше.

Ron Beyer

Я бы попробовал открыть его в DotPeek (кстати, бесплатно) и посмотреть, получится ли у вас лучшая декомпиляция. То, что вы опубликовали, является довольно классическим примером оптимизации компилятора, которую трудно вернуть в код. Обычно с перечислителем вам нужно иметь доходность где-то там, хотя прототип метода не должен меняться (bool MoveNext to GetCounter), это действительно зависит от того, что вы пытаетесь сделать.

Kaysikarline

Огромное спасибо. Я попробую с dotPeek.

Kaysikarline

Я пробовал с dotPeek, и это лучше, чем рефлектор, хотя он не на 100% эффективен, как вы упомянули. Я очистил множество ошибок. Но я все еще борюсь за пользовательский интерфейс. Большое вам спасибо!!

Kaysikarline

Уважаемые Гуру,
Несколько дней назад я искал в Google, чтобы отредактировать пользовательский интерфейс, встроенный в DLL. К сожалению, я не нахожу точного ответа на этот вопрос. Можно ли редактировать пользовательский интерфейс, встроенный в DLL (библиотеку ссылочных классов), из текущего консольного приложения на языке C#? Например, раскрывающийся список обновления. Если да, то могу ли я получить несколько ссылок на учебники, чтобы обновить их?

Заранее большое вам спасибо.

Рейтинг:
1

johannesnestler

Я делал такие вещи в прошлом....
Исходный код был потерян - остались только двоичные файлы.

Я начал с создания нового проекта (приложение Windows, .NET 4 в вашем случае).
Потом попробовал завалить декомпилированным кодом-кусок за куском. Надеюсь, вы обнаружите, что, возможно, нет необходимости декомпилировать библиотеки DLL, потому что вам не нужно ничего там менять.

Так что, по крайней мере, вы закончите с чем-то управляемым на будущее...


Richard MacCutchan

Посмотрите на дату этого вопроса.