Applications QT – Remplacement des ressources incorporées

Est-il possible de remplacer les ressources incorporées [par exemple, styles, images, texte] dans un binary Linux [ELF]?

J’ai remarqué que je pouvais changer de texte mais si je tape plus de texte ou si je supprime du texte, les erreurs de segmentation commencent à apparaître. Je ne suis pas encore passé par les spécifications ELF mais je me demande si c’est possible.

J’ai réussi à extraire les images du binary en utilisant le projet mediaextract mais je dois faire exactement le contraire sans casser la structure binary.

Cette réponse est spécifique au système de ressources de Qt (.qrc, rcc).

De la documentation:

Actuellement, Qt stocke toujours les données directement dans l’exécutable, même sous Windows, macOS et iOS, où le système d’exploitation fournit un support natif des ressources. Cela pourrait changer dans une future version de Qt.

Donc oui, les ressources Qt sont contenues dans le binary.

La création d’un fichier .qrc produit un fichier .cpp contenant (principalement) des tableaux de caractères simples qui représentent des données de ressource, les noms de ressource et d’autres métadonnées.

La compilation d’un tel fichier .cpp crée des champs d’octets dans le binary.

Vous pouvez modifier ces ressources dans un fichier binary, mais de manière très limitée.

  • Pour les débutants, si le binary contient un type d’autocontrôle (comme le hachage de la section de données et sa comparaison avec un hachage pré-calculé), vous ne pourrez pas modifier les données de manière raisonnable.

  • Si vos données n’ont pas la même longueur en octets que les données d’origine, vous ne pouvez pas simplement les remplacer car cela modifierait la disposition interne du fichier binary et invaliderait les adresses relatives.

  • En cas de remplacement par des chaînes plus courtes, vous pouvez vous retrouver avec un remplissage nul à la fin.

Les ressources sont compressées par défaut (au format ZIP). Il est possible de désactiver la compression.

  • Si la compression était activée lors de la compilation (que vous ne contrôlez pas, comme il semble), vous devez créer de nouvelles données qui se compressent à la même longueur que l’original.