2009-10-05 15 views
9

Mam program, którego często używam, który jest wykonany z .NET. Ten program ma mały błąd, który jest bardzo denerwujący, a programisty aplikacji nie można nigdzie znaleźć.Napraw błędy w programie .NET bez dostępu do źródła

Znalazłem lokalizację problemu w odbłyśniku i chcę dodać tutaj pojedynczą instrukcję if, a następnie ponownie skompilować program.

Jaki jest najprostszy sposób to zrobić?

Próbowałem użyć funkcji eksportu w odbłyśniku, ale wydaje się, że nie działa idealnie. Na przykład brakuje wielu użytecznych dyrektyw, a wyliczenia, które są przesyłane do iz powrotem, również nie są eksportowane poprawnie. Wierzę, że mogę to naprawić z pewną pracą, ale zastanawiam się, czy jest jakiś łatwiejszy sposób na zrobienie tego.

Aktualizacja: rozwiązać go w ten sposób:

Program jest pojedynczy plik wykonywalny

  1. Znajdź błąd w reflektorze z C# -widok. Następnie przejdź do widoku IL, aby zobaczyć, czego powinieneś szukać w kroku 5.
  2. Otwórz program, który chcesz zmienić za pomocą ildasm
  3. Naciśnij przycisk dump i wybierz pusty folder, domyślne ustawienia zadziałały dla mnie.
  4. Znajdź plik .il w tym folderze i otwarty z dowolnej TextEditor
  5. Znajdź kod z kroku 1.
  6. zastąpić go nowym kodem, w moim przypadku po prostu musiałem wymienić całą zawartość z funkcji prosty powrót (IL_0000: ret). Nie sądzę, że wszystkie poprawki będą tak łatwe.
  7. Otwórz okno poleceń w folderze z kroku 3
  8. Wykonaj ilasm, musiałem również dołączyć pewne zasoby z oryginalnego pliku exe. Są one automatycznie wyprowadzane z ildasm. Użyłem tego ilasm jak ten "C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ ilasm.exe" test.il /resource=test.res /output=FixedProgram.exe

Gotowe ! W tej chwili korzystałem z programu tylko kilka minut, ale wygląda na to, że działa podobnie jak poprzednio, z wyjątkiem błędu :)

Wystąpiły również pewne problemy z ustawieniami aplikacji. W pliku % appdata% \ ProgramName był folder o nazwie coś w rodzaju: ProgramName.exe_Url_qa5i3p42aomuvoxpuxuficvbmngksgjs, gdzie przechowywane są wszystkie ustawienia. Mój nowy plik wykonywalny utworzył nowy folder z różnymi losowymi literami na końcu i domyślnymi ustawieniami. Aby skopiować ustawienia używane przed skopiowaniem całej zawartości starego folderu na nową.

Odpowiedz

1

Jeśli program jest prosty, teoretycznie możesz użyć reflektora, aby cofnąć cały program z powrotem do C#, dokonać zmiany i przekompilować go.

Alternatywnie można wypróbować narzędzie takie jak ILDasm, które powinno pozwolić ci wyodrębnić IL, dokonać zmiany (w MSIL) i ponownie złożyć (używając ILAsm). Oczywiście, aby to zrobić, musisz dowiedzieć się, jak napisać zmianę w IL, więc prawdopodobnie będziesz musiał przeprowadzić pewne eksperymenty, aby zobaczyć, jak kompilują się instrukcje.

Podejrzewam, że oba będą wymagały sporo komplikacji, aby rekompilacja działała.

Powodzenia.

Jeśli dostaniesz go do pracy, odeślij i daj mi znać, byłbym bardzo zainteresowany tym, jak to zrobiłeś.

+0

Dzięki za zaakceptowanie tego jako odpowiedzi Erik, brzmi to jak to, co zadziałało dla ciebie, ale dla innych osób czytających to zdecydowanie sprawdź Reflexil (http://sebastien.lebreton.free.fr/reflexil/) (jak wspomniano w Jb Evaina Odpowiedź), ponieważ to wszystko będzie bezpośrednio dokonać zmiany w zespole za pomocą kodu C# bez martwienia się o IL, i zapisać poprawioną wersję zespołu, wszystko z reflektora naprawdę łatwo. Gorąco polecam sprawdzenie, jest to świetne narzędzie. –

2

Nie sądzę, że jest łatwiejszy sposób na zrobienie tego niż to, o czym już wspomniałeś. Właściwie to dekompilowałem program z ILDASM na coś podobnego i wymagało to sporo manipulacji.

Jeśli istnieje łatwiejsza metoda, chciałbym ją również poznać.

+0

+1 - byłaś szybsza;) – Lucero

2

Możesz użyć ILDASM i ILASM, aby wykonać objazd. Chociaż jest to niepraktyczne w przypadku dużych zmian, myślę, że powinno to wystarczyć w twoim przypadku.

1

Wypróbuj ten .NET Reflector addin.

To zadziałało u mnie. Czasami tworzy on tagi "Generowane przez Compliance", których nie można spełnić. Ale możesz to łatwo naprawić ręcznie.

8

Proponuję użyć wtyczki Reflexil dla Reflector. Pozwala łatwo modyfikować złożenia, a nawet zastępować treść metody przez własny kod C#.

+0

Teraz, jeśli to działa tak, jak jest napisane, to działa na stronie, która jest fantastyczna. +1. Cecil wygląda niesamowicie. "Zmodyfikuj złożenia w locie". Łał! Co więcej mogę powiedzieć. Utrzymaj wspaniałą pracę Jb. –

+0

Dzięki Simon. Wszystkie podziękowania za Reflexil należą się mojemu przyjacielowi, Sébastienowi Lebretonowi, który wykonał naprawdę świetną robotę przy łączeniu Cecil i Reflector. –

+0

Zobacz przykładowy przykład. Naprawdę trudno było znaleźć opcje ponownego zapisania złożenia. http://www.cumps.be/reverse-engineering-with-reflector-and-reflexil/ – Ian

0

Telerik Wystarczy Dekompilacji (bezpłatny) Następnie korek REFLEXIL w

2 min pracy z powyższych (Próbowałem wszystkie inne metody !!)

+2

możesz dodać więcej szczegółów na temat korzystania z obu? – dove

+0

Proszę podać więcej szczegółów – Sid