2 votes

extraction de chaînes d'images du noyau linux

J'essaie d'extraire les chaînes de caractères d'une image binaire du noyau linux. (ce phénomène spécifique se produit dans tous les types d'images que j'ai essayés : bzImage, vmlinuz, vmlinux, .... et pas un spécifique)

En exécutant simplement 'strings', on obtient de nombreuses chaînes de caractères avec un préfixe, par exemple : " 4 netlink : %d octets restants après l'analyse des attributs du processus `%s'."

Cependant, en regardant les sources du noyau, la chaîne actuelle ne devrait pas inclure le préfixe "4". En ouvrant le fichier à l'aide d'un éditeur HEX, j'ai vu que la chaîne de caractères comprend également : ' \x00\x01 et seulement ensuite \x34 ' ("4") Je pense qu'il s'agit d'une sorte de pointeur vers une section spéciale, ou quelque chose de ce genre, parce que beaucoup d'autres chaînes de caractères incluent "3" et d'autres chiffres (et même des caractères).

J'apprécierais toute information à ce sujet Merci !

2voto

Ian Abbott Points 2838

Les préfixes que l'OP voit sont des préfixes KERN_<LEVEL>. Il s'agit de chaînes littérales spéciales à ajouter avant la chaîne principale printk en utilisant la concaténation de chaînes de caractères adjacentes du langage C. Par exemple :

    printk(KERN_ERR "Something has gone wrong!\n");

À partir de la version 3.6 du noyau, ces macros de préfixe KERN_<LEVEL> sont définies dans "include/linux/kern_levels.h" et commencent par le caractère ASCII SOH "\001" suivi du niveau de journalisation sous forme de chiffre ASCII pour les niveaux numériques, ou d'un autre caractère ASCII pour les significations spéciales. La chaîne de caractères pour KERN_DEFAULT est passé de "\001" "d" a "" (chaîne vide) dans la version 5.1 du noyau. La chaîne pour KERN_CONT est passé de "" (chaîne vide) à "\001" "c" dans la version 4.9 du noyau.

De la version 2.6.37 à 3.5.x du noyau, les macros de préfixe KERN_<LEVEL> étaient définies dans "include/linux/printk.h" et utilisaient un format différent avec le niveau spécifié entre crochets, par exemple KERN_WARNING a été défini comme suit "<4>" , KERN_DEFAULT a été défini comme suit "<d>" y KERN_CONT a été défini comme suit "<c>" .

Outre printk Il existe d'autres macros pour générer des journaux du noyau, dont certaines spécifient implicitement la partie KERN_<LEVEL>. L'exemple du PO provient de "lib/nlattr.c" :

        pr_warn_ratelimited("netlink: %d bytes leftover after parsing attributes in process `%s'.\n",
                    rem, current->comm);

Ici, le pr_warn_ratelimited est définie dans "include/linux/printk.h" comme :

#define pr_warn_ratelimited(fmt, ...)                   \
    printk_ratelimited(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)

Il y a beaucoup de choses qui se passent ici, mais pr_fmt(fmt) est une ou plusieurs chaînes littérales comprenant fmt de sorte que la chaîne transmise à printk_ratelimited est construit à partir de chaînes littérales concaténées, en commençant par celles de l'expansion de KERN_WARNING .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X