2010-06-23 5 views
2

Je veux remplacer une ligne de code dans l'API Party 3D avec mon propre code. Je veux dire que c'est une pratique discutable mais j'ai besoin de réparer leur bug.Puis-je injecter quelques lignes de mon code dans quelqu'un elses .NET dll?

+1

déclenche le fournisseur, mais vous ne pouvez pas réécrire leur code sans source, ou à moins qu'ils aient écrit leur code pour être extensible. –

+0

le logiciel ne coûte rien. le service qu'ils vendent est unique malheureusement. ils ont la version C++ que je crois beaucoup mieux mais je ne peux pas utiliser C++. –

+0

Pourquoi ne pas utiliser C++? Si c'est une question de connaissance, je connais quelques livres qui facilitent l'apprentissage de C++/CLI. –

Répondre

6

Ne pas tolérer de désassembler le code d'un logiciel tiers ou commercial, mais il existe un moyen qui peut fonctionner. Si vous utilisez Reflector avec le plugin Reflexil, vous pouvez supprimer la signature de nom fort et injecter/modifier le code dans un assemblage.

+0

ouais c'est ce que je voulais. mais apparemment, leur type de soutien regarde maintenant le problème. donc je n'en aurai peut-être pas besoin après tout :) –

+0

J'ai reçu une correction du vendeur hier! pas de hacks nécessaires :) –

1

Si cela ne vous permet pas d'injecter votre propre code et que vous n'obtenez pas la source, vous n'avez pas la possibilité de le faire de façon légitime.

Les assemblages sont normalement signés et vous ne pouvez pas les modifier. De plus, la plupart des logiciels sont protégés par des droits d'auteur.

Si vous êtes un client important pour ce fournisseur, demandez le code. Et bien sûr pour le droit de corriger ce bug.

+0

Oui, mais il peut décompiler l'assemblage et le remplir à nouveau sans le signer. C'est une violation de l'accord de licence, mais modifier MSIL est également une violation. – STO

+0

C'est ce que je veux dire par «moyen légitime». –

+0

Je n'ai pas d'accord de licence .. –

5

Vous pouvez, mais vous travaillerez avec MSIL, pas avec C#.

également

http://ccimetadata.codeplex.com/ http://www.mono-project.com/Cecil

vous peut decomplie dll en utilisant Reflector.NET, correction de bug et complie en arrière.

+0

Ceci n'est généralement pas autorisé ... –

+0

@STO: * puis le recompiler *. – mcandre

+0

Je veux juste dire: vous devriez demander la permission de le faire. Si vous l'obtenez, vous devriez également obtenir le code source. Si vous ne le faites pas, vous ne devriez pas le faire. –

0

Si vous avez accès au code source, pourquoi ne pas effectuer la modification et recompiler?

+0

le code que je peux voir à travers le réflecteur –

0

Pourquoi ne pas simplement réécrire la méthode buggy (dans votre propre code) et l'utiliser à la place de la bibliothèque externe?

+0

parce que la méthode buggy est à l'intérieur des autres méthodes parti 3d. Je l'ai trouvé à travers Reflector. –

3

Avez-vous envisagé d'essayer d'intercepter et d'intercepter les appels avec un outil AOP, tel que Postsharp ou LinFu? Explication: Les frameworks AoP (Aspect Oriented Programming) permettent d'injecter le comportement avant les appels après et de rediriger les appels. Plus d'infos here

Certains avantages supplémentaires de ce contre le changement MSIL:

  • Le correctif survivraient mises à jour de la dll 3ème partie (API donné est stable)
  • Vous devriez être dans les conditions de licence
  • vous pouvez facilement supprimer le proxy si ils fixent la méthode en question
+0

Veuillez ajouter des liens aux outils dont vous parlez. –

+0

ouais je n'ai jamais entendu parler de ça .. Linux probablement ... je ne peux pas - c'est en temps réel. Je veux corriger le bug pour réduire la latence. Ne pas l'ajouter avec des outils externes –

+0

Bobb, j'ai ajouté quelques liens pour vous pointer dans cette direction. C'est une solution en temps réel, qui n'a rien à voir avec les proxys Linux ou réseau. Ces cadres vous permettent de créer des objets qui ressemblent à votre bibliothèque tierce, mais vous pouvez configurer et réacheminer certains appels de méthode. Il n'y a aucune altération de la 3ème partie dll. Ces bibliothèques font ce que vous demandez de faire, la question est de savoir s'il existe une solution plus simple. –

0

Si c'est une modification mineure, vous peut avoir un peu de chance autour du code par le biais d'ildasm puis ilasm.

3

Oui, vous pouvez. D'une part, l'assemblage de DLL est juste CIL (Common Intermediate Language). En principe, vous pouvez le modifier directement vous-même.

Par exemple, vous pouvez utiliser un outil comme Cecil:

http://www.mono-project.com/Cecil

Vous pouvez également décompiler avec un outil comme réflecteur dans la langue que vous êtes plus à l'aise. À ce stade, vous pouvez simplement modifier le code et recompiler dans votre propre assemblage personnalisé.

http://www.red-gate.com/products/reflector/

Cecil a aussi un décompilateur:

http://evain.net/blog/articles/2008/12/15/cecil-decompiler

MonoDevelop (IDE Mono), nous allons vous ouvrez un ensemble comme un projet. Il suffit d'ouvrir la DLL en tant que fichier de projet et (si elle contient suffisamment d'informations de débogage), elle ressemblera à un projet de code que vous pourrez ensuite modifier et construire.

http://monodevelop.com/

Tous ces outils sont utilisables dans Microsoft .NET ou Mono. MonoDevelop peut être installé sur Windows sans installer Mono du tout.

Bien sûr, je dis que vous pouvez. Je ne suis pas nécessairement d'accord que vous faites. Vous devrez vous occuper du côté légal et éthique des choses puisque vous en savez plus sur votre situation.

0

En pensant à cela un peu différemment, est-il possible de résoudre l'IP avec DNS au démarrage de votre application avant d'impliquer le composant faux, puis de mettre une entrée dans le fichier HOSTS dans system32 \ drivers \ etc vous n'aurez pas besoin d'aller à nouveau à DNS (bien vous le ferez, mais il devrait être presque instantané).

Vous pouvez également, au lieu d'essayer de le faire via votre assembly, regarder les méthodes d'injection de DLL Windows de l'accrochage de l'appel au DNS Resolver pour effectuer la mise en cache.

Questions connexes