Исправление ошибок в программе .NET без доступа к источнику - PullRequest
9 голосов
/ 05 октября 2009

У меня есть программа, которую я часто использую, которая сделана с .NET. В этой программе есть небольшая ошибка, которая очень раздражает, и разработчика приложения нигде нет.

Я нашел местоположение проблемы в рефлекторе и просто хочу добавить здесь один оператор if, а затем перекомпилировать программу.

Какой самый простой способ сделать это?

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

Обновление: решено следующим образом:

Программа представляет собой отдельный исполняемый файл

  1. Найти ошибку в рефлекторе с помощью C # -view. Затем переключитесь в IL-view, чтобы увидеть, что вы должны искать в шаге 5.
  2. Откройте программу, которую вы хотите изменить с помощью ildasm
  3. Нажмите dump и выберите пустую папку, настройки по умолчанию у меня сработали.
  4. Найдите файл .il в этой папке и откройте его любым текстовым редактором
  5. Найдите код из шага 1.
  6. Замените его новым кодом, в моем случае мне просто нужно было заменить все содержимое функции простым возвратом (IL_0000: ret). Я не думаю, что все исправления будут такими легкими.
  7. Откройте командное окно в папке с шага 3
  8. Запустите ilasm, мне также пришлось включить некоторые ресурсы из оригинального exe. Они автоматически выводятся с ildasm. Я использовал этот илазм вот так "C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ ilasm.exe" test.il /resource=test.res /output=FixedProgram.exe

Готово! Я использовал фиксированную программу только несколько минут, но, похоже, она работает так же, как и раньше, за исключением ошибки:)

Я также столкнулся с некоторыми проблемами с настройками приложения. В % appdata% \ ProgramName была папка с именем что-то вроде ProgramName.exe_Url_qa5i3p42aomuvoxpuxuficvbmngksgjs , где хранятся все настройки. Мой новый исполняемый файл создал новую папку, подобную этой, с разными случайными буквами в конце и настройками по умолчанию. Чтобы скопировать ранее использованные настройки, просто скопируйте все содержимое старой папки в новую.

Ответы [ 6 ]

8 голосов
/ 05 октября 2009

Я предлагаю вам использовать плагин Reflexil для Reflector . Он позволяет легко изменять сборки и даже заменять тело метода собственным кодом C #.

2 голосов
/ 05 октября 2009

Вы можете использовать ILDASM и ILASM, чтобы совершить поездку туда и обратно. Хотя это нецелесообразно для больших изменений, я думаю, что это должно помочь в вашем случае.

2 голосов
/ 05 октября 2009

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

Если есть более простой метод, я бы тоже хотел его знать.

1 голос
/ 05 октября 2009

Попробуйте .NET Reflector addin .

Это сработало для меня. Иногда он создает теги "Complier Generated", которые не могут быть соблюдены. Но вы можете легко исправить это вручную.

1 голос
/ 05 октября 2009

Если программа простая, теоретически вы можете использовать рефлектор, чтобы вернуть всю программу обратно в C #, внести изменения и перекомпилировать их.

В качестве альтернативы вы можете попробовать такой инструмент, как ILDasm , который позволит вам извлечь IL, внести изменения (в MSIL) и собрать заново (используя ILAsm ). Очевидно, что для этого вам нужно будет выяснить, как записать свое изменение в IL, поэтому вам, вероятно, придется поэкспериментировать, чтобы увидеть, как скомпилируются операторы.

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

Удачи.

Если вы заставите его работать, отправьте сообщение и дайте мне знать, мне было бы весьма интересно, как вы это сделали.

0 голосов
/ 27 ноября 2012

telerik Just Decompile (бесплатно) Затем рефлексил подключите

2 мин работы с вышеупомянутым (я пробовал все другие методы !!)

...