Question

Je cherche à patcher un morceau de logiciel abandonware avec du code.

Le logiciel est à base de carbone, je ne peux donc pas utiliser InputManager (du moins, je ne pense pas pouvoir le faire). Mon idée était d'ajouter une référence Dylib à l'en-tête mach-o et de lancer un nouveau thread lorsque la routine d'initialisation est appelée.

J'ai bricolé l'en-tête mach-o en utilisant un éditeur de texte pour ajouter la commande de chargement appropriée (LC_ LOAD_DYLIB).

otool signale ce que je m'attends à voir. Je suis donc assez sûr que le fichier est correctement formaté.

Load command 63
          cmd LC_LOAD_DYLIB
      cmdsize 60
         name @executable_path/libAltInput.dylib (offset 24)
   time stamp 1183743291 Fri Jul  6 19:34:51 2007
      current version 0.0.0
compatibility version 0.0.0

Cependant, le lancement du binaire me donne l'erreur suivante

dyld: bad external relocation length

Tout ce que je peux deviner, c'est que je dois modifier les sections LC_ SYMTAB ou LC_ DYNSYMTAB ...

Quelqu'un a des idées?

Était-ce utile?

La solution

Je ne suis pas tout à fait sûr de ce que vous essayez d'accomplir, mais le moyen le plus simple de le faire est probablement d'injecter un thread dans la tâche mach après son démarrage. Vous trouverez une excellente source d'informations sur cette opération (ainsi que le code d'exécution correspondant): http: // rentzsch .com / mach_inject / .

Certaines mises en garde à prendre en compte:

  1. l'appel mach task_for_pid () nécessaire pour obtenir le port mach vers la tâche est maintenant privilégié et nécessite une autorisation pour appeler. La raison en est assez évidente, mais si vous envisagez de publier quelque chose avec du code injecté, vous devriez en être conscient.
  2. Votre code sera exécuté dans le même espace de processus que l'application d'origine, mais sur un thread séparé. Par conséquent, vous aurez un accès complet à l’application. Toutefois, si elle n’a pas la capacité de prendre en charge les threads, faites très attention à l’utilisation et à la manipulation de données provenant de l’extérieur de votre code injecté. Évidemment, tous les problèmes multithread seront amplifiés ici car le code d'origine n'a jamais été au courant de vos ajouts.

Autres conseils

La solution la plus simple qui ne nécessite pas de corriger le binaire consiste simplement à utiliser la variable d'environnement DYLD_INSERT_LIBRARIES, puis à exécuter votre application.

set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib

Je suppose que la raison pour laquelle l'éditeur de liens dynamique a signalé une erreur est due au fait que de nombreux champs du format de fichier Mach-O contiennent des adresses spécifiées en décalage par rapport au début du fichier; l'ajout d'une autre commande de chargement invaliderait donc chaque adresse. Par exemple, voir les entrées symoff et stroff dans Référence du format de fichier ABI Mach-O pour Mac OS X .

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