Brevet FR3096490A1 — publié le 20201127

Description Titre de l'invention : Procédé itératif et dispositif de détection d'une zone approximative occupée par le code informatique d'un noyau d'un système d'exploitation dans une mémoire [0001] Arrière-plan de l'invention [0002] L'invention se rapporte au domaine général de la supervision de code informatique. [0003] Elle vise plus particulièrement un procédé et un dispositif pour détecter une zone occupée par du code informatique. [0004] L'invention s'applique de façon privilégiée mais non limitative pour détecter l'emplacement d'un code noyau s'exécutant dans la mémoire d'une machine virtuelle. [0005] Dans ce contexte, l'invention peut être mise en oeuvre par un hyperviseur ou par un dispositif tiers utilisant des fonctions de gestion mémoire d'un hyperviseur. [0006] En effet, l'emplacement du code noyau dans la mémoire d'une machine virtuelle est inconnu de l'hyperviseur. De plus, cet emplacement varie selon le type et la version du système d'exploitation de la machine virtuelle et est susceptible de changer de façon aléatoire après chaque redémarrage de la machine virtuelle. [0007] On connait principalement deux techniques pour identifier automatiquement l'emplacement du code noyau d'une machine virtuelle depuis un hyperviseur. [0008] La première technique tente d'identifier l'emplacement du code noyau par l'identification des fonctions de ce dernier à travers leurs marqueurs dans un code binaire. Mais cette première technique ne fonctionne pas sur un code noyau optimisé dans lequel les marqueurs de fonctions sont quasiment inexistants. [0009] La deuxième technique tente d'identifier l'emplacement du code noyau par l'identification d'une première instruction arbitraire dans le noyau de la machine virtuelle, le reste du code noyau qui se situe avant et après cette instruction étant obtenus via un mécanisme de désassemblage jusqu'à la détection d'une donnée, marquant la frontière du code noyau avec les données noyau. Cette deuxième technique suppose que le code noyau est contigu et qu'il n'existe pas de données au milieu du code. Cette technique n'est donc pas efficace dans le cas où des données sont présentes au milieu du code noyau comme il est le cas du noyau Windows (marque déposée). [0010] Ces techniques ne sont donc pas satisfaisantes. [0011] Objet et résumé de l'invention [0012] L'invention vise par conséquent une autre solution pour identifier automatiquement la zone occupée par du code informatique dans une mémoire. [0013] Plus précisément, l'invention concerne un procédé de détection d'une zone ap- 2 proximative occupée par le code informatique d'un noyau d'un système d'exploitation dans une mémoire, cette zone comportant une ou plusieurs plages dans cette mémoire. Ce procédé comporte : [0014] - un procédé itératif comportant : [0015] - une première itération comportant : [0016] - une étape de détection d'au moins une adresse cible dans la mémoire ; [0017] - une étape de détermination d'une zone délimitée par une première adresse cible et par une deuxième adresse cible ; et [0018] - au moins une deuxième itération comportant : [0019] - une étape de désassemblage d'au moins une partie de la zone déterminée au cours de l'itération précédente ; [0020] - une étape de détection d'au moins une adresse cible pointée par une instruction de code informatique comprise dans ladite au moins une partie de zone désassemblée ; et [0021] - une étape de détermination d'une zone délimitée par une première de ces adresses cibles et par une deuxième de ces adresses cibles détectées au cours de cette deuxième itération ; [0022] - une condition d'arrêt étant vérifiée lorsqu'aucune nouvelle adresse cible n'est détectée au cours de la dernière itération ; et [0023] - une étape de recherche d'une plage de mémoire complémentaire démarrant juste après la deuxième adresse cible obtenue à la dernière itération et ne comportant que du code informatique ; [0024] - ladite zone approximative occupée par le code informatique dans le noyau du système d'exploitation étant délimitée par la première adresse cible obtenue à la dernière itération et par l'adresse la plus grande de ladite plage de mémoire complémentaire. [0025] Corrélativement, l'invention vise un dispositif de détection d'une zone approximative occupée par le code informatique d'un noyau d'un système d'exploitation dans une mémoire, cette zone comportant une ou plusieurs plages dans ladite mémoire, ce dispositif comportant un module apte à mettre en oeuvre un procédé de détection tel que mentionné ci-dessus. [0026] La zone occupée par le code informatique ne pouvant être déterminée avec certitude, elle est qualifiée de zone approximative. Dans la plupart des cas, cette zone est déterminée à plus de 99%. [0027] Ainsi, et d'une façon générale, l'invention propose de détecter par itérations suc- cessives des adresses cibles dans la mémoire, de délimiter des zones pointées par ces adresses cibles jusqu'à une condition d'arrêt et de compléter la zone ainsi identifiée par une zone de code démarrant juste après la dernière adresse cible identifiée. [0028] On rappelle qu'une adresse cible est l'adresse d'une instruction pointée par une autre 3 instruction, par exemple d'appel (instruction de type CALL adresse cible), ou de saut (instruction de type JIMP adresse cible). [0029] Le procédé est particulièrement avantageux en cc : [0030] - qu'il permet de détecter une zone de code comportant des plages non contiguës ; [0031] - qu'il est efficace car il progresse rapidement dans sa phase itérative en traitant ex- clusivement les adresses cibles ; [0032] - qu'il est précis par la mise en oeuvre de l'étape de recherche complémentaire qui permet de détecter précisément la fin de la zone de code. [0033] Les adresses cibles utilisées dans la première itération peuvent être détectées par tout moyen par exemple en désassemblant aléatoirement des portions de code binaire pour y rechercher une instruction de type CALL ou JMP. [0034] Dans un mode particulier de réalisation du procédé de détection selon l'invention, les adresses cibles détectées au cours de la première itération sont obtenues dans une table de vecteurs d'interruptions ou dans une table d'un gestionnaire d'appels systèmes d'une zone de données de la mémoire. [0035] Cette caractéristique est très avantageuse car elle permet de trouver très rapidement un grand nombre d'adresses cibles. [0036] Dans un mode particulier, le procédé de détection selon l'invention comporte, pour au moins une itération : [0037] - une étape de regroupement des adresses cibles détectées au cours de cette itération et des itérations précédentes en un ou plusieurs groupes, un groupe d'adresses cibles comportant une seule adresse cible ou plusieurs adresses cibles séparées deux à deux par une distance inférieure à une distance déterminée, ces groupes étant ordonnés ; et [0038] - une étape d'identification des groupes comportant au moins un nombre déterminé d'adresses cibles ; [0039] - ladite zone déterminée au cours de cette itération étant une plage délimitée par la plus petite adresse cible et par la plus grande adresse cible de ces groupes. [0040] Cette étape de regroupement est connue en anglais sous le nom de « clustering ». Elle vise à identifier des plages de code binaire avec une forte densité d'adresses cibles, qui, statistiquement comportent une forte proportion de code informatique et très peu de données. Seules ces plages sont désassemblées ce qui accélère fortement le processus. [0041] Dans un mode particulier, le procédé de détection selon l'invention comporte : [0042] - une étape d'identification, dans la zone approximative ; d'au moins une plage de code binaire qui correspond à des données ; et [0043] - une étape d'exclusion de cette ou de ces plages de code binaire de la zone ap- proximative. [0044] Cette étape vise à éliminer des zones de données qui auraient été identifiées à tort comme des zones de code. Il est important de noter que cette étape est mise en oeuvre après le procédé itératif de sorte qu'elle peut n'être exécutée qu'une seule fois. [0045] Dans un mode particulier de réalisation de l'invention, une plage de code binaire cor- respondant à des données est identifiée lorsqu'elle comporte, avec au moins une densité déterminée, des portions de code binaire représentant : [0046] - une instruction de type NOP ; ou [0047] - une instruction de type INT3 ; ou [0048] - une instruction invalide ; ou [0049] - une instruction de saut conditionnel non précédée d'une instruction de test ou d'une instruction arithmétique, ou [0050] - une instruction comprenant des opérandes de taille incompatible. [0051] Dans un mode particulier, le procédé de détection selon l'invention comporte : [0052] - une étape consistant à vérifier si du code binaire exclu de ladite zone approximative correspond à une adresse cible pointée par une instruction ; et le cas échéant ; [0053] - une étape de réintégration de cette adresse cible dans la zone approximative. [0054] Cette étape vise à réintégrer dans la zone approximative des instructions qui auraient été éliminées à tort car comprises dans des plages à forte densité de données. [0055] Dans un mode particulier, le procédé de détection selon l'invention comporte : [0056] - une étape de recherche dans la zone approximative de constantes de la taille d'un pointeur et lorsque desdites constantes sont identifiées, une étape de recherche : d'une dite première constante correspondant à la plus petite adresse du premier groupe d'adresses ou à l'adresse précédant le premier groupe d'adresses ; et d'une dite deuxième constante correspondant à ou suivant l'adresse la plus grande de la zone approximative ; [0057] - une étape de délimitation de la zone approximative par la première constante et la deuxième constante sauf s'il existe du code binaire représentatif de données entre cette première constante et la plus petite adresse du premier groupe d'adresses ou entre l'adresse la plus grande de la zone approximative et la deuxième constante. [0058] Cette caractéristique permet de délimiter très précisément la zone approximative dans sa partie basse et dans sa partie haute. [0059] Dans un mode de réalisation du procédé selon l'invention, le noyau s'exécute dans la mémoire vive d'une machine virtuelle. [0060] Corrélativement, dans un mode de réalisation, le dispositif de détection selon l'invention comporte une machine virtuelle et un hyperviseur, le module de ce dispositif étant mis en oeuvre par l'hyperviseur pour détecter la zone approximative occupée par le code informatique du noyau d'un système d'exploitation lorsqu'il s'exécute dans la mémoire vive de la machine virtuelle. [0061] Dans un mode particulier de réalisation, les différentes étapes du procédé de détection sont déterminées par des instructions de programmes d'ordinateurs. [0062] En conséquence, l'invention vise aussi un programme d'ordinateur sur un support d'informations, ce programme étant susceptible d'être mis en oeuvre dans un ordinateur, ce programme comportant des instructions adaptées à la mise en oeuvre des étapes d'un procédé tel que décrit ci-dessus. [0063] Ce programme peut utiliser n'importe quel langage de programmation, et être sous la forme de code source, code objet, ou de code intermédiaire entre code source et code objet, tel que dans une forme partiellement compilée, ou dans n'importe quelle autre forme souhaitable. [0064] L'invention vise aussi un support d'informations ou d'enregistrement lisible par un ordinateur, et comportant des instructions d'un programme d'ordinateur tel que mentionné ci-dessus. [0065] Le support d'informations ou d'enregistrement peut être n'importe quelle entité ou dispositif capable de stocker le programme. Par exemple, le support peut comporter un moyen de stockage, tel qu'une ROM, par exemple un CD ROM ou une ROM de circuit microélectronique, ou encore un moyen d'enregistrement magnétique, par exemple un disque dur. [0066] D'autre part, le support d'informations ou d'enregistrement peut être un support trans- missible tel qu'un signal électrique ou optique, qui peut être acheminé via un câble électrique ou optique, par radio ou par d'autres moyens. Le programme selon l'invention peut être en particulier téléchargé sur un réseau de type Internet. [0067] Alternativement, le support d'informations ou d'enregistrement peut être un circuit intégré dans lequel le programme est incorporé, le circuit étant adapté pour exécuter ou pour être utilisé dans l'exécution du procédé en question. Brève description des dessins [0068] D'autres caractéristiques et avantages de la présente invention ressortiront de la des- cription faite ci-dessous, en référence aux dessins annexés qui en illustrent un exemple de réalisation dépourvu de tout caractère limitatif. Sur les figures : [0069] [fig. 1A] la figure I A représente l'architecture matérielle d'un dispositif conforme à un mode particulier de réalisation de l'invention ; [0070] [fig.1B] la figure 1B représente une table de vecteurs d'interruption ; [0071] [fig.1C] la figure 1C représente une table d'appels système ; [0072] [fig.2] la figure 2 illustre, sous forme d'organigramme, les principales étapes d'un procédé de détection d'une zone approximative occupée par le code informatique d'un noyau d'un système d'exploitation du dispositif de la figure 1A, ce procédé étant conforme à un mode particulier de réalisation de l'invention ; [0073] [fig.3A] la figure 3A représente l'état de variables utilisées par le procédé de 6 détection de la figure 2, après l'étape de détection d'adresses cibles de la première itération de ce procédé ; [0074] [fig.313] la figure 3B représente l'état de variables utilisées par le procédé de détection de la figure 2, après une étape de regroupement de ces adresses cibles ; [0075] [fig.3C] la figure 3C représente l'état de variables utilisées par le procédé de détection de la figure 2, après une étape de regroupement d'adresses cibles identifiées lors d'une deuxième itération de ce procédé ; [0076] [fig.3D] la figure 3D représente l'état de variables utilisées par le procédé de détection de la figure 2, après délimitation d'une zone approximative occupée par du code informatique du noyau ; [0077] [fig.3E] la figure 3E représente l'état de variables utilisées par le procédé de détection de la figure 2 après identification et exclusion de plages de données dans cette zone approximative ; [0078] [fig.3F] la figure 3F représente l'état de variables utilisées par le procédé de détection de la figure 2 après exclusion de plages de données dans la zone approximative et réintégration d'instructions exclues à tort ; et [0079] [fig.3G] la figure 3G représente l'état de variables utilisées par le procédé de détection de la figure 2 après délimitation de la zone approximative. Description détaillée de l'invention [0080] La figure 1A représente l'architecture matérielle d'un dispositif 10 conforme à un mode particulier de réalisation de l'invention. [0081] Ce dispositif 10 comporte une couche matérielle 1-IW, un hyperviseur HYP et une machine virtuelle MV. [00821 L'hyperviseur HYP gère les ressources matérielles du dispositif 10, notamment un processeur 13, une mémoire vive 14, un disque dur 15 et des moyens de communication 17. [0083] Le disque dur 15 constitue en outre un support d'enregistrement conforme à l'invention, lisible par le processeur 13 et sur lequel est enregistré ici un programme d'ordinateur PROG conforme à l'invention. [00841 Le programme d'ordinateur PROG définit un module fonctionnel (et logiciel ici), configuré pour mettre en oeuvre les étapes du procédé de détection selon l'invention qui seront décrites ultérieurement. [0085] La mémoire vive (constituée physiquement par le composant 14) de cette machine virtuelle MV comporte de façon classique un espace utilisateur et un espace noyau. L'espace noyau comporte un noyau d'un système d'exploitation à proprement parler, des modules et des pilotes (en anglais « drivers »). [0086] Sur la figure 1A, seul le noyau 12 (parfois appelé noyau principal) est représenté. Il 7 comporte des zones de code informatique ZC et des zones de données ZD. [0087] L'invention vise une méthode pour déterminer la zone ZIC occupée par le code in- formatique, à savoir l'union des zones de code ZC. [0088] Dans l'exemple de réalisation décrit ici, cette méthode est mise en oeuvre à l'aide de fonctions ENS dc l'hyperviseur HYP, par exemple, par une fonction de lecture de la mémoire virtuelle de la VM, et par une fonction de lecture des registres du processeur 13. [0089] De façon connue, une des zones de données du noyau dans la mémoire vive comporte une table TV dc vecteurs d'interruptions. Une telle table TV représentée à la figure 1B comporte un ensemble de lignes, chaque ligne comportant en particulier l'adresse @RI, d'une routine de gestion d'une interruption INTi. Une routine de gestion d'interruption est déclenchée en réaction à une interruption, telle qu'une exception comme une division par 0, etc. [0090] Par ailleurs, une zone de code comporte un gestionnaire d'appels système. Cc ges- tionnaire d'appels système utilise une zone de données ZD qui contient une table TUAS représentée à la figure 1C, chaque ligne de cette table comportant l'adresse @FSj d'une fonction système FSj fournie par le système d'exploitation de la machine virtuelle. [0091] On rappelle qu'une fonction système ou « appel système » permet de communiquer directement avec le noyau du système d'exploitation de la machine virtuelle MV. Par exemple, pour écrire sur le disque dur 15, un programme de l'espace utilisateur doit passer par des appels à des fonctions système qui contrôlent les écritures sur le disque commandées depuis le programme. Les fonctions système garantissent la sécurité des données et leur intégrité sur le disque en contrôlant les applications de l'espace utilisateur. [0092] La figure 2 représente sous forme d'organigramme les principales étapes d'un procédé conforme à l'invention, mises en oeuvre par l'hyperviseur HYP, pour détecter une zone approximative ZIC occupée par le code informatique du noyau du système d'exploitation dans la mémoire vive de la machine virtuelle. [0093] Au cours d'une étape El°, l'hyperviseur lit la table TV de vecteurs d'interruption et identifie la table des appels systèmes TUAS pour identifier les adresses @RIk dans la mémoire vive des routines d'interruption et les adresses @ES; dans la mémoire vive des fonctions systèmes. Ces adresses constituent des adresses cibles @Ci au sens de l'invention. Ces adresses sont représentées à la figure 3A. Elles marquent le début soit d'une routine d'interruption RI, soit d'une fonction système FS, chacune dans une zone de code ZC. [0094] Au cours d'une étape E20, l'hyperviseur regroupe les adresses cibles @Ci obtenues au cours de l'étape E10. 8 [0095] Un groupe d'adresses cibles G' comporte soit une adresse cible soit plusieurs adresses cibles séparées deux à deux par une distance inférieure à une distance déterminée (par exemple 1 Mb). Au cours de cette même étape E20, l'hyperviscur HYP identifie les groupes G' comportant au moins un nombre déterminé d'adresses cibles (par exemple 10) ; les autres groupes ne sont pas retenus. [0096] Dans l'exemple de la figure 3B, deux groupes G1, G, sont ainsi identifiés. [0097] Au cours d'une étape E30, r hyperviscur détermine une plage Z1 délimitée, dans cet exemple, par la plus petite adresse @C''' et par la plus grande adresse @C de l'ensemble des groupes G'. En l'espèce @CH', est l'adresse de début de la fonction système FS, et @Cmax est l'adresse de début de la fonction système FS'. [0098] Dans l'exemple de la figure 3B, la plage Z1 comporte une adresse cible @FS5 qui n'appartient ni au groupe G, ni au groupe G,. [0099] Puis l'hyperviscur HYP exécute au moins une deuxième itération. [0100] Cette deuxième itération comporte une étape E40 de désassemblage des groupes Gk identifiés au cours de l'itération précédente. Pour mémoire, un désassemblage d'adresses ou de groupes d'adresses est mis en oeuvre au moyen d'un désassembleur. Un désassembleur est un programme qui traduit du langage machine, donc un fichier exécutable, en langage assembleur, ou langage « bas-niveau », qui représente le langage machine sous une forme compréhensible pour un humain. A cette fin des librairies de désassemblage sont utilisées, par exemple la librairie appelée Udis86 qui s'exécute clans l'espace noyau. Lors d'un désassemblage, il est possible de Savoir combien d'octets sont à prendre en compte pour désassembler correctement une instruction. Cette information est en effet indiquée dans le premier octet de l'instruction. Ainsi, si l'on commence le désassemblage à partir d'un premier octet d'une instruction, on sait combien d'octets sont à prendre en compte pour désassembler l'instruction. [0101] Au cours d'une étape E50, l'hyperviseur HYP identifie et enregistre les adresses cibles @C; pointées par des instructions de code informatique comprises dans les groupes Gk désassemblés. [0102] Au cours d'une étape E60, l'hyperviseur HYP regroupe les adresses cibles @Ci obtenues au cours de l'étape E50, et des itérations précédentes (étape El° de la première itération, et étape E50 des occurrences précédentes de la deuxième itération si elles existent). [0103] Comme pour l'étape El0 de la première itération, un groupe d'adresses cibles comporte soit une seule adresse cible soit plusieurs adresses cibles séparées deux à deux par une distance inférieure à une distance déterminée. Au cours de cette même étape E60, l'hyperviseur identifie les groupes G1 comportant au moins un nombre déterminé d'adresses cibles. [0104] La distance déterminée d'une part et le nombre déterminé d'autre part peuvent être 9 identiques ou différents de ceux utilisés au cours de l'étape E20 de la première itération. [0105] Dans l'exemple de la figure 3C, un nouveau groupe G, est identifié en plus d'un premier groupe G, et d'un deuxième groupe 03 identifiés à la première itération et appelés respectivement 01 et 02 lors de la précédente itération, illustrée par la figure 3B. A noter que les groupes sont ordonnés en ce que toutes les adresses du groupe G, sont inférieures aux adresses du groupe Gii'. Dans un autre exemple, il se peut que de nouvelles adresses cibles @Ci viennent grossir les groupes identifiés au cours d'une itération précédente. [0106] Au cours d'une étape E70, rhyperviscur détermine une zone Z2 constituée, dans cet exemple, par une plage mémoire délimitée par la plus petite adresse cible @C''' et par la plus grande adresse cible @C','' de ces groupes G, à 03. [0107] Au cours d'une étape E80 rhyperviscur vérifie si aucune nouvelle adresse cible n'est identifiée. Si c'est le cas, le procédé itératif s'arrête. Sinon l'étape E80 est suivie par une deuxième occurrence de l'étape E40 de désassemblage appliquée aux groupes identifiés à l'étape E60 et une nouvelle itération s'exécute (étapes E40 à E80). [0108] Lorsque la condition d'arrêt du procédé itératif est vérifiée, l'étape E80 est suivie par une étape E90 de recherche d'une plage de mémoire complémentaire MC commençant juste après l'adresse cible la plus grande @C', obtenue à l'étape E70 de la dernière itération et ne comportant que du code informatique. [0109] En effet, à l'adresse cible @C',, se trouve normalement, par construction, une ins- truction de code informatique. [0110] L'étape E90 consiste donc à identifier la fin de la fonction informatique qui comporte cette instruction. Elle peut être effectuée en recherchant la première instruction de fin de fonction (instruction RET ou JUMP conditionnel) qui n'est pas suivie par une adresse cible d'une instruction de redirection de cette même fonction. [0111] Cette mémoire complémentaire MC est donc la plage de mémoire [@MC,';,' @MC ',''1 dans laquelle : [0112] - suit l'adresse @C'' obtenue à l'étape E70 de la dernière itération et ; [0113] - emc,,', est l'adresse de cette instruction RET ou JUMP conditionnel. [0114] Au cours d'une étape E100, l'hyperviseur détermine que la zone approximative ZIC occupée par le code informatique du noyau de la machine virtuelle est la plage délimitée par les adresses @C,111, et @MC,''' (figure 3D). [0115] Dans le mode de réalisation décrit ici, le procédé de détection selon l'invention comporte une étape E110 pour identifier dans la zone ZIC déterminée à l'étape E100, d'éventuelles plages de code binaire ZD con-espondant à des données et une étape E120 pour exclure, si elles existent, ces plages de code binaire de la zone approximative ZIC. [0116] En effet la zone approximative ZIC déterminée à l'étape El 00 peut comporter des zones de données ZDx. Dans le cas de la figure 3D, elle comporte trois zones de données ZDI, ZD2 et ZD3. [0117] Dans le mode de réalisation décrit ici, une plage de code binaire est identifiée comme une zone de données ZD lorsqu'elle comporte, avec au moins une densité déterminée, du code binaire représentant : [0118] - une instruction de type NOP ; ou [0119] - une instruction de type INT3 ; ou [0120] - une instruction invalide ; ou [0121] - une instruction de saut conditionnel non précédée d'une instruction de test ou d'une instruction arithmétique, ou [0122] - une instruction comprenant des opérandes de tailles incompatibles. [0123] Ces instructions sont représentatives d'une zone de données. [0124] Par exemple, on enregistre les adresses de ces instructions, on regroupe ces adresses comme fait lors de l'étape E60 en utilisant une distance et un nombre prédéterminés, et chaque groupe identifié est considéré comme une plage de données. [0125] A titre d'exemple, l'annexe A illustre une plage [0x82834fcd, 0x8283500f] de code binaire comportant des instructions NOP, INVALID, INT3, add [cax], al dont les opérandes [cax] et al sont incompatibles car de tailles différentes, respectivement 32 bits et 8 bits. [0126] Si l'adresse la plus grande emcma, fait partie des zones de code binaire exclues alors l'adresse cible la plus grande @C,'', est affectée à l'adresse la plus grande @MC,':'. [0127] La figure 3E représente la zone approximative ZIC, en trois plages, une fois dé- barrassée de deux plages de données, et plus précisément : [0128] - d'une première plage comportant la plage ZDI, la plage ZD2 et le code binaire compris entre ces deux plages ; et [0129] - de la plage binaire ZD3. [0130] Dans cet exemple le code binaire entre les plages ZDI et ZD2 est une zone de code ZC exclue à tort car il contient une instruction correspondant à une adresse cible pointée par une instruction de type CALL (voir figure 3C, adresse cible @Ci pointée depuis une instruction du groupe 02). [0131] Par conséquent, dans ce mode de réalisation, le procédé de détection selon l'invention comporte : [0132] - une étape E130 consistant à vérifier si du code binaire exclu (à l'étape E120) de la zone ZIC correspond à une adresse cible pointée par une instruction de type CALL correspondant à un début de fonction ; et le cas échéant ; [0133] - une étape E140 de réintégration de la fonction pointée par cette adresse cible dans la zone ZIC. 11 [0134] La figure 3F représente la zone de code ZIC, en quatre plages, une fois la zone de code exclue à tort à l'étape E120 réintégrée à l'étape E130. [0135] Dans l'exemple de réalisation décrit ici, le procédé de détection selon l'invention comporte une étape pour tenter de délimiter précisément la zone de code ZIC. [0136] Pour cela le procédé de détection propose de rechercher dans la zone approximative ZIC des constantes qui pourraient constituer ces adresses limites. [0137] Plus précisément, dans ce mode de réalisation, le procédé de détection selon l'invention comporte une étape El 50 de recherche dans ladite zone occupée par du code informatique ZIC de constantes de la taille d'un pointeur (qui correspond à la taille d'une adresse). [0138] Lorsque ces constantes sont identifiées, le procédé recherche les constantes @LIIVI',' et @LIM,',' correspondant respectivement à la plus petite adresse du premier groupe d'adresses G, ou à l'adresse précédant le premier groupe d'adresses G, ; et à : l'adresse la plus grande @MC,''' ou à l'adresse suivant @MC,'a'. [0139] Ces deux constantes @LTM1 et @LIIVI,,,ax correspondent éventuellement à l'adresse de début et l'adresse de fin du noyau. [0140] S'il n'existe pas de code binaire représentatif de données entre @LIM,';,, et la plus petite adresse du premier groupe Q, ni entre la dernière adresse de la zone approximative et @LIM,'a', le procédé délimite (étape E160) la zone ZIC par l'adresse @LIM,'in et l'adresse @LIM,':'. Sinon le procédé délimite la zone ZIC par la plus petite adresse du premier groupe G, et l'adresse la plus grande @MC,',,' de la zone complémentaire obtenue à l'étape E70. [0141] La figure 3G représente la zone de code ZIC délimitée par ces deux constantes identifiées dans la zone de code ZIC représentée à la figure 3F. [0142] Le procédé est décrit ici pour un noyau d'un système d'exploitation dans une mémoire vive. Il peut s'appliquer également pour identifier du code d'un noyau d'un système d'exploitation dans une capture mémoire (« dump mémoire » en anglais). [0143] Le procédé a été décrit dans le cadre d'un noyau Linux pour lequel on peut fa- cilement identifier la table d'interruptions et la table d'appels système. Pour d'autres systèmes d'exploitation, on utilise la table d'interruptions et éventuellement l'adresse du gestionnaire d'appels système et toute adresse atteignable depuis ce dernier. [0144] ANNEXE A [0145] 0x82834fcd add [eax], al 0x82834fcf add [eax], al 0x82834fd1 add [eax], al 0x82834fd2 nop 0x82834fd3 nop 0x82834fd5 add [cax], al 0x82834fd7 add [cax], al 0x82834fd9 add [cax], al 0x82834fda int3 0x82834fdh int3 0x82834fdc int3 0x82834fdd int3 0x82834fdc int3 0x82834fdf int3 0x82834fc1 jnz Oxcf 0x82834fc3 add [cax], al 0x82834fc5 add [cax], al 0x82834fc7 add [cax], al 0x82834fc9 add [cax], al 0x82834fch add [cax], al 0x82834fcd add [cax], al Ox82834fcf add [cax], al 0x82834111 add [cax], al 0x82834113 invalid 0x82834115 invalid 0x82834117 add [eax], al 0x82834ff9 add [eax], al 0x82834ffa nop 0x82834ftb nop 0x82834ffd invalid 0x82834fff invalid 0x82835001 adc [eax], al 0x82835003 add [ecx+eax], cl 0x82835007 add [esp+esi], al 0x8283500a or [esp-Fecx], dh 0x8283500d xor al, 0x10 0x8283500f xor al, 0x14 12 13 [Revendication 1] [Revendication 2] REVENDICATIONSProcédé de détection d'une zone approximative (ZIC) occupée par le code informatique d'un noyau (12) d'un système d'exploitation dans une mémoire, ladite zone (ZIC) comportant une ou plusieurs plages (ZC) dans ladite mémoire, ce procédé comportant : - un procédé itératif comportant : - une première itération comportant : - une étape (El 0) de détection d'au moins une adresse cible («P Rlk, @FS,) dans ladite mémoire ; - une étape (E30) de détermination d'une zone (Z1) délimitée par une première dite adresse cible (@C',;,,) et par une deuxième dite adresse cible (@C',.') ; et - au moins une deuxième itération comportant : - une étape (E40) de désassemblage d'au moins une partie de la zone (Z1, Z2) déterminée (E30, E70) au cours de l'itération précédente ; - une étape (E50) de détection d'au moins adresse cible (e? C1) pointée par une instruction de code informatique comprise dans ladite au moins une partie de zone désassemblée (Z1, Z2) ; et - une étape (E70) de détermination d'une zone (Z2) délimitée par une première dite adresse cible (@C,,) et par une deuxième dite adresse cible (@C',.') détectées au cours de cette deuxième itération ; - une condition d'arrêt étant vérifiée (E80) lorsqu'aucune nouvelle adresse cible n'est détectée (E50) au cours de la dernière itération ; et - une étape (E90) de recherche d'une plage de mémoire complémentaire (MC) démarrant juste après la deuxième adresse cible (@Cmax) obtenue à la dernière itération et ne comportant que du code informatique ; - ladite zone approximative (ZIC) occupée par le code informatique dans le noyau du système d'exploitation étant délimitée (E100) par la première adresse cible (@Cmin) obtenue à la dernière itération et par l'adresse la plus grande (@MCm,') de ladite plage de mémoire complémentaire (MC). Procédé de détection d'une zone approximative selon la revendication 1 caractérisé en ce que ladite au moins une adresse cible (@RIk, @FS;) détectée (E10) au cours de ladite première itération est obtenue (E10) dans une table (TV) de vecteurs d'interruptions ou dans une table (TGAS) d'un gestionnaire d'appels systèmes d'une zone de données de 14 [Revendication 3] [Revendication 4] [Revendication 5] [Revendication 6] ladite mémoire. Procédé de détection d'une zone approximative selon la revendication 1 ou 2 caractérisé en ce qu'il comporte, pour au moins une dite itération : - une étape (E20, E60) de regroupement des dites adresses cibles (@Ci) détectées (El 0, E50) au cours de ladite itération et des itérations précédentes en au moins un groupe (G'), un dit groupe d'adresses cibles comportant une seule adresse cible ou plusieurs adresses cibles séparées deux à deux par une distance inférieure à une distance déterminée, les dits groupes étant ordonnés ; et - une étape (E20, E60) d'identification desdits groupes (G') comportant au moins un nombre déterminé d'adresses cibles ; - ladite zone (Z1, Z2) déterminée (E30, E70) au cours de ladite itération étant une plage délimitée par la plus petite adresse cible (@CI'a) et par la plus grande adresse cible (@CL') desdits groupes. Procédé de détection d'une zone approximative selon l'une quelconque des revendications 1 à 3 caractérisé en ce qu'il comporte : - une étape (E110) d'identification, dans ladite zone approximative (ZIC) d'au moins une plage de code binaire (ZD') qui correspond à des données ; et - une étape (E120) d'exclusion de ladite au moins une plage de code binaire (ZD') de ladite zone approximative (ZIC). Procédé de détection d'une zone approximative selon la revendication 4 caractérisé en ce que ladite au moins une plage de code binaire (ZDx) correspondant à des données est identifiée (E110) lorsqu'elle comporte, avec au moins une densité déterminée, des portions de code binaire représentant : - une instruction de type NOP ; ou - une instruction de type INT3 ; ou - une instruction invalide ; ou - une instruction de saut conditionnel non précédée d'une instruction de test ou d'une instruction arithmétique, ou - une instruction comprenant des opérandes de taille incompatible. Procédé de détection d'une zone occupée par du code informatique selon l'une quelconque des revendications 4 à 5, caractérisé en ce qu'il comporte : - une étape (E130) consistant à vérifier si du code binaire exclu (E120) de ladite zone approximative (ZIC) correspond à une adresse cible pointée par une instruction de type CALL ; et le cas échéant ; 15 [Revendication 7] [Revendication 8] [Revendication 9] [Revendication 10] [Revendication 11] - une étape (El 40) de réintégration de la fonction pointée par ladite adresse cible dans ladite zone. Procédé de détection d'une zone occupée par du code informatique selon l'une quelconque des revendications 3 à 6, caractérisé en ce qu'il comporte : - une étape (E150) de recherche dans ladite zone approximative (Z1C) de constantes de la taille d'un pointeur et lorsque desdites constantes sont identifiées, une étape de recherche : - d'une dite première constante (@LEIVImi') correspondant à la plus petite adresse du premier groupe d'adresses (G1) ou à l'adresse précédant le premier groupe d'adresses (G1) ; et - d'une dite deuxième constante (@LIM',a,) correspondant à ou suivant l'adresse la plus grande (@MC',,,) de la zone approximative (ZIC) ; - une étape (E160) de délimitation de ladite zone approximative (ZIC) par ladite première constante (@LIM,'in) et ladite deuxième constante (@LIM,,',) sauf s'il existe du code binaire représentatif de données entre cette première constante (@LIMin) et la plus petite adresse dudit premier groupe d'adresses (Ci) ou entre l'adresse la plus grande ( @MC ,'',) de la zone approximative (ZIC) et la dite deuxième constante (@LIM',). Procédé selon l'une quelconque des revendications 1 à 7 dans lequel ledit noyau s'exécute dans la mémoire vive d'une machine virtuelle (MV). Dispositif (10) de détection d'une zone approximative (ZIC) occupée par le code informatique d'un noyau d'un système d'exploitation dans une mémoire ladite zone (ZIC) comportant une ou plusieurs plages (ZC) dans ladite mémoire, ce dispositif comportant un module (MOD) apte à mettre en oeuvre un procédé de détection selon l'une quelconque des revendications 1 à 8. Dispositif selon la revendication 9 comportant une machine virtuelle (MV) et un hyperviseur (HYP) caractérisé en ce que ledit module (MOD) est mis en oeuvre par ledit hyperviseur (HYP) pour mettre en oeuvre un procédé de détection selon la revendication 8, pour détecter la zone approximative (ZIC) occupée par le code informatique du noyau d'un système d'exploitation lorsqu'il s'exécute dans la mémoire vive de ladite machine virtuelle. Programme d'ordinateur (PROU) comportant des instructions pour l'exécution des étapes du procédé de détection selon l'une quelconque 16 [Revendication 12] des revendications 1 à 8 lorsque ledit programme est exécuté par un ordinateur. Support d'enregistrement (15) lisible par un ordinateur sur lequel est enregistré un programme d'ordinateur comprenant des instructions pour l'exécution des étapes du procédé de détection selon l'une quelconque des revendications 1 à 8.