2009-05-29 7 views
3

comment puis-je capturer toutes les chaînes à partir d'un fichier .exe windows natif et les remplacer plus tard par d'autres en utilisant C#? Contexte: Je souhaite créer un outil C# pour extraire et remplacer des chaînes à partir d'un simple fichier .exe.Remplacer les chaînes en .exe natif en utilisant C#

Est-ce possible en quelque sorte?

Répondre

3

Ce que vous devez démarrer est un analyseur PE/COFF. Si vos chaînes sont stockées dans une section de ressource dans le PE, alors c'est assez facile. Par exemple, vous pouvez charger un exe dans Visual Studio en tant que fichier de ressources et utiliser son éditeur de ressources pour changer les icônes et les chaînes et autres dans l'exe. Si d'autre part les chaînes sont stockées dans une section de données ou sont immédiatement dans le code machine, vous avez un problème beaucoup plus complexe. En écrasant les cordes en l'état, leur laisser la même longueur fonctionnera probablement, mais en les allongeant, on commence à bouger les choses, à déplacer les relocalisations et les décalages. Réécrire l'exe n'est vraiment pas la façon de réaliser ce que vous voulez. Déplacé de mon commentaire: PE/COFF est le format exe des programmes Windows. Si vous voulez juste éditer les ressources, vous ne devriez pas avoir besoin d'un analyseur. Vous pouvez commencer par utiliser LoadLibraryEx() avec les indicateurs LOAD_LIBRARY_AS_IMAGE_RESOURCE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE pour charger l'exe afin d'utiliser la ressource et de la rendre accessible en écriture. Puis commencez à regarder LoadString(). Ce sont tous des appels d'API natifs. Je ne sais pas vraiment comment tu le fais en C#.

+0

comme je l'ai commenté à msalters, juste des ressources sont nécessaires. Le problème est, je ne suis pas fan de faire cela "à la main" mais dans ma propre application C# pour automatiser certaines choses. Alors, quel est le début à l'analyseur PE? – Uwe

+0

PE/COFF est le format exe des programmes Windows. Si vous voulez juste modifier les ressources, je ne pense pas que vous aurez besoin d'un analyseur. Vous pouvez commencer par utiliser LoadLibraryEx() avec les indicateurs LOAD_LIBRARY_AS_IMAGE_RESOURCE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE pour charger l'exe afin d'utiliser la ressource et de la rendre accessible en écriture. Puis commencez à regarder LoadString(). Ce sont tous des appels d'API natifs. Je ne sais pas vraiment comment tu le fais en C#. –

1

Si vous voulez juste le faire pour le plaisir alors je vous suggère d'utiliser Resource Hacker, ce programme est très robuste.

Si cela est nécessaire du projet alors je vais regarder aussi cet espace pour les réponses :)

+0

merci. ce n'est pas seulement pour mais, mais pour un projet. Donc, je vais attendre d'autres réponses. – Uwe

0

Gardez à l'esprit que ce qui est généralement pas possible. Il existe plusieurs façons de stocker des chaînes dans un programme C++ natif. Les chaînes de ressources sont le cas facile, comme le mentionne correctement aman.tur.

Les chaînes du segment de données, d'autre part, sont généralement indexées directement. Dans ce cas, si vous modifiez leur décalage de début (car la longueur d'une chaîne précédente change), vous devrez trouver toutes les façons d'exprimer ce décalage, ce qui est pratiquement impossible. En outre, lorsque les chaînes dans le DataTase deviennent plus longues, vous pouvez exécuter sur des tampons fixes. Et si la collection totale de chaînes augmente, les données qui suivent peuvent également se déplacer.

Il est également tout à fait possible que de petites chaînes (par exemple jusqu'à 4 caractères, y compris \ 0) soient tronquées dans le segment de code. Changer cela pourrait être un défi encore plus grand, car vous êtes encore moins susceptible de modifier la longueur de la chaîne.

Veuillez noter que, par conception, cela invalidera toutes les signatures numériques.

+0

ok. Cela m'a manqué dans ma question. Les chaînes sont toutes stroed/basées sur les résoruces. Donc, cela devrait faciliter les choses. – Uwe

Questions connexes