Question

Je tente de modifier une bibliothèque dans l'éditeur hexadécimal, insérer le mode. Le point principal est de renommer quelques entrées en elle. Si je le fais en mode « Otherwrite », tout fonctionne bien, mais chaque fois que j'essaie d'ajouter quelques symboles à la fin de la chaîne en mode « Insérer », la bibliothèque ne se charge pas. Tout ce que je suis absent ici?

Était-ce utile?

La solution

Oui, vous manquez beaucoup. Une bibliothèque suit PE / COFF format, ce qui est assez lourd sur les pointeurs dans le fichier. (Par exemple, vers le début du fichier est un tableau qui pointe vers l'emplacement de chaque section dans le fichier).

Dans le cas où vous modifiez les ressources, il y a la possibilité de le faire sans casser des choses si vous assurez-vous de corriger les pointeurs et tailles pour quoi que ce soit après pointage à vos modifications, mais je doute que ce sera facile. Dans le cas où vous modifiez la section .text (c.-à-code), je doute que vous l'aurez fait, étant donné que les opérandes des appels de fonction et les sauts sont des endroits par rapport à leur position dans le code - vous devez mettre à jour tout le code pour tenir compte des modifications.

Une technique pour surmonter ce problème est une « caverne de code », où vous remplacez un morceau de code existant avec un enseignement explicite de JMP vers un emplacement vide (Vous pouvez le faire lors de l'exécution, où vous avez la possibilité de créer une nouvelle mémoire ) - où vous définissez un nouveau code qui peut être de longueur arbitraire -. à l'époque vous JMP explicitement à l'endroit où vous avez appelé de (+5 octets dire pour le JMP opcode + opérande)

Autres conseils

Les noms sont vous les changer à la même longueur que les noms anciens? Sinon, les décalages de tout est décalé. Et faire l'une des fonctions appellent les uns les autres? Cela pourrait être un autre point de problème. Il serait plus facile d'obtenir le code source (sur le site Web du projet si ce n'est pas en interne ou auprès du vendeur si elle est fermée) et les changer en ce que puis recompiler. Je suis curieux de savoir pourquoi vous changez les noms de toute façon.

DLL sont un format binaire complexe (code compilé par exemple). Les tours de processus de compilation nommés appels de fonction dans les références câblés à des positions spécifiques dans le fichier (les « compensations »). Par conséquent, si vous insérez des caractères dans le milieu du fichier, les compensations après ce point ne correspond plus ce qui est en fait à la position qu'ils référencent, ce qui signifie que les appels de fonction dans votre bibliothèque exécuter le mauvais code (si elles parviennent à exécuter quoi que ce soit du tout).

En fait, la ligne de fond est ce que vous faites va toujours casser des choses. Si vous êtes malchanceux, il pourrait même casser vraiment mal et causer des dommages graves.

Bien sûr - une connaissance détaillée du format, et ce qui doit changer. Si vous vous demandez pourquoi certaines de vos modifications cause de chargement à l'échec, il vous manque cette connaissance.

Les bibliothèques sont destinées à être écrit par l'éditeur de liens pour l'utilisation de l'éditeur de liens. Ils suivent un format bien défini qui est destiné à être facile pour l'éditeur de liens pour écrire et lire. Ils ne ont pas besoin de tolérance pour l'entrée humaine comme un compilateur fait.

Très simplement, les bibliothèques ne sont pas destinés à être modifiés par les éditeurs hexagonaux. Il est possible de modifier les entrées récrites avec des noms de la même longueur, ou qui peut bousiller un index quelque part. Si vous modifiez la longueur de quoi que ce soit, vous violez probablement des pointeurs et des métadonnées.

Vous ne donnent aucune raison de vouloir le faire. Si c'est pour le plaisir, eh bien, il est plus difficile que prévu. Si vous avez une autre raison, vous êtes mieux obtenir la source, ou d'obtenir quelqu'un qui a la source de renommer et de reconstruire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top