11
votes

Corriger les bugs dans le programme .NET sans accès à la source

J'ai un programme que j'utilise fréquemment qui est fabriqué avec .NET. Ce programme a un petit bug qui est très gênant et que le développeur de l'application est introuvable.

J'ai trouvé l'emplacement du problème dans le réflecteur et je veux simplement ajouter une seule instruction IF ici, puis recompiler le programme.

Quel est le moyen le plus simple de le faire?

J'ai essayé d'utiliser la fonction d'exportation dans le réflecteur, mais cela ne semble pas fonctionner parfaitement. Par exemple, beaucoup d'utilisation de directives sont manquantes et que les énumjets qui sont renversés vers l'intérieur ne sont également pas exportés correctement. Je crois que je peux résoudre ce problème avec un travail, mais je me demande s'il y a un moyen plus facile de le faire.

Mise à jour: résolvée en faisant ceci:

Le programme est un seul fichier exécutable de fichier

  1. Recherchez le bogue dans le réflecteur avec C # -View. Puis passez à la vue IL-View pour voir ce que vous devriez rechercher à l'étape 5.
  2. Ouvrez le programme que vous souhaitez modifier avec ildasme
  3. Appuyez sur VENDU et sélectionnez un dossier vide, les paramètres par défaut ont fonctionné pour moi.
  4. Trouvez le fichier .il dans ce dossier et ouvert avec n'importe quel texte
  5. Trouvez le code à partir de l'étape 1.
  6. Remplacez-le avec un nouveau code, dans mon cas, je devais simplement remplacer tout le contenu d'une fonction avec un retour simple (IL_0000: RET). Je ne pense pas que toutes les corrections soient aussi faciles.
  7. Ouvrez un CommandWindow dans le dossier à partir de l'étape 3
  8. Run ILASM, j'ai également dû inclure des ressources de l'EXE d'origine. Celles-ci sont automatiquement émises avec l'ildasme. J'ai utilisé cet iLas comme celui-ci "c: \ windows \ microsoft.net \ framework.exe" test.il /resource=test.res /output=fixedprogram.exe --/em><< li>

    fait! Je n'ai utilisé que le programme fixe quelques minutes maintenant, mais cela semble fonctionner comme avant, à l'exception du bogue :)

    J'ai également rencontré certains problèmes avec les paramètres de l'application. Dans % Appdata% \ PROGRAMNAMNAME PROGRAMME Il y avait un dossier appelé quelque chose comme Programname.exe_url_qa5i3p42AomuvoxPuxuficvbmngksgjs où tous les paramètres sont stockés. Ma nouvelle exécutable a créé un nouveau dossier comme celui-ci avec différentes lettres aléatoires à la fin et avec les paramètres par défaut. Pour copier les paramètres utilisés avant de copier tout le contenu de l'ancien dossier sur le nouveau.


0 commentaires

6 Réponses :


2
votes

Je ne pense pas qu'il y ait un moyen plus facile de le faire que ce que vous avez déjà mentionné. En fait, j'ai décompilé un programme avec Ilasm pour quelque chose de similaire et il a fallu beaucoup de bricolage.

S'il y a une méthode plus facile, je voudrais le savoir aussi.


0 commentaires

2
votes

Vous pouvez utiliser l'ilas et ilasas pour faire une ronde. Bien que cela soit impraticable pour de gros changements, je pense que cela devrait faire l'affaire dans votre cas.


0 commentaires

1
votes

Si le programme est simple, en théorie, vous pouvez utiliser le réflecteur pour renverser tout le programme sur C #, apporter le changement et le recompiler.

Vous pouvez également essayer un outil tel que Ildasme < / a>, qui devrait vous permettre d'extraire l'IL, faites votre changement (dans MSIL) et que vous assemblez (en utilisant Ilasm ). Évidemment, pour faire cela, vous devrez déterminer comment écrire votre changement d'IL, vous devrez donc probablement faire des expériences pour voir comment si les déclarations compilent.

Je soupçonne que les deux prendront un peu de malchance pour obtenir le recompilement au travail.

bonne chance.

Si vous voulez travailler, postez-moi et faites le moi savoir, je serais très intéressé par la façon dont vous avez fait cela.


1 commentaires

Merci d'avoir accepté cela comme la réponse Erik, cela ressemble à ce que c'est ce qui a fonctionné pour vous, mais pour d'autres personnes qui lisent ceci découvrent certainement le réflexil ( Sebastien.lebrette.free.fr/reflexil ) (comme mentionné dans la réponse de JB Evain), car cela vous permettra de passer directement à l'assemblage avec le code C # sans avoir à vous soucier de la Il, et enregistrer une version patchée de l'assemblée, tout de réflecteur facilement facilement. Je vous recommande vivement de le vérifier, c'est un excellent outil.



1
votes

Essayez ceci .NET réflecteur Addin .

Cela a fonctionné pour moi. Il crée parfois des balises "complétés générées" qui ne peuvent pas être respectées. Mais vous pouvez facilement résoudre ce problème manuellement.


0 commentaires

8
votes

Je vous suggère d'utiliser le Reflexil Plugin pour réflecteur . Il vous permet de modifier facilement des assemblages et même de remplacer le corps d'une méthode par votre propre code C #.


3 commentaires

Maintenant, si cela fonctionne comme si cela dit qu'il fait sur le site Web fantastique. +1. Cecil a l'air génial. "Modifier les assemblages à la volée". Wow! Que puis-je dire de plus. Continuez le grand travail JB.


Merci Simon. Tous les crédits pour le réflexiliennes vont à mon ami Sébastien LeBreton qui a fait un travail vraiment excellent à la bride Cecil et à un réflecteur.


Voir ce qui suit pour un exemple. J'ai effectivement trouvé qu'il est assez difficile de localiser les options de sauvegarder l'assemblage. Cummps.be/Reverse-Engineering-with-Reflector-and-Reflexil



0
votes

Telerik juste décompile (gratuit) Ensuite, le réflexe plug in

travail de 2 min avec ce qui précède (j'ai essayé toutes les autres méthodes !!)


1 commentaires

Pouvez-vous ajouter plus de détails sur la façon d'utiliser les deux?