Votre question

Problèmes Batch. - Page 3

Tags :
  • Echo
  • Programmation
Dernière réponse : dans Programmation
11 Octobre 2008 10:45:21

Hello,

Oki, donc les normes s'équivalent à peu près, à quelques différences ..

Un peu compliqué tout ça :D 

Bon je vais essayer :

U+008A:
1000 1010b

UTF-8 : 11000010 10001010

U+055E :
0101 0101 1110b (codé sur plusieurs octets, pourtant le bit de poids fort est nul.. ou bien il parle du dernier octet ?

UTF-8: 11010101 10011110

U+8000 :
1000 0000 0000 0000b

UTF-8 : 11110000 10001000 1000000 10000000

U+C3F5 :

1100 0011 1111 0101b

UTF-8:
11110000 10001100 10001111 10110101

Correct ?


a b L Programmation
11 Octobre 2008 16:14:06

Citation :
(codé sur plusieurs octets, pourtant le bit de poids fort est nul.. ou bien il parle du dernier octet ?

C'est quand tu codes dans l'autre sens qu'il faut voir les bits. Dans ce sens il suffit de voir les intervalles.

Citation :
U+8000 :
1000 0000 0000 0000b

UTF-8 : 11110000 10001000 1000000 10000000

Non, U+8000 ne se code que sur 3 octets ;) 

Citation :
U+C3F5 :

1100 0011 1111 0101b

UTF-8:
11110000 10001100 10001111 10110101

Pareil c'est sur 3 octets.

11 Octobre 2008 17:35:27

Ah ok :

U + 8000 :

Utf : 11101000 10000000 10000000

U + C3F5 :
Utf : 11101100 10001111 10110101

Peux-tu me redonner les fourchettes ? Je ne vois pas trop la correspondance avec le bit de poids fort :p 
L'UTF-16 fonctionne sur des principes similaires ?

J'aurais une question :

Windows est en ANSI (Windows 12-52, proche du latin-1 (iso-8859-1).
Comment se fait-il, que si Windows est en Ansi, que je puisse créer un dossier avec un caractère Unicode, et qu'il soit affichable en plus ?

J'ai fait un petit cours perso (es-tu d'accord pour que je te l'envoie par MP et me dire ce que tu en penses (n'importe quoi doit comprendre, il n'est pas fini ^^) ?) Merci beaucoup :)  !

Une autre chose, on parlait d'ASCII étendu (pour le DOS) et d'ANSI pour Windows. Ainsi, comme un sorte de distinction.

Mais j'ai lu ça :

"Les deux jeux de caractères ASCII étendus les plus couramment utilisés sont :

* Le code ASCII étendu OEM, c'est-à-dire celui qui équipait les premières machines de type IBM PC

Le code ASCII étendu ANSI, utilisé par les systèmes d'exploitation récents "

Ainsi, l'appellation correcte est laquelle ? IBM PC = DOS ? :p 
Dans le même ordre d'idée, si on fait un dir en console, les fichiers de windows avec des accents par exemple seront correctement accentués, penses-tu qu'il y a une sorte d'auto traduction, comme pour la BDR ?

Merci beaucoup, j'aimerais bien pouvoir faire quelque chose pour te remercier :=
Contenus similaires
a b L Programmation
11 Octobre 2008 18:41:59

Citation :
Comment se fait-il, que si Windows est en Ansi, que je puisse créer un dossier avec un caractère Unicode, et qu'il soit affichable en plus ?

Windows gère aussi l'unicode ;) 

Citation :
J'ai fait un petit cours perso (es-tu d'accord pour que je te l'envoie par MP et me dire ce que tu en penses (n'importe quoi doit comprendre, il n'est pas fini ^^) ?) Merci beaucoup :)  !

Soit tu le montre à tout le monde, soit tu ne me le montres pas :p 

Citation :
"Les deux jeux de caractères ASCII étendus les plus couramment utilisés sont :


* Le code ASCII étendu OEM, c'est-à-dire celui qui équipait les premières machines de type IBM PC


Le code ASCII étendu ANSI, utilisé par les systèmes d'exploitation récents "

J'ai pas voulu t'embrouiller avec ça, mais en fait il y avait plusieurs tables de caractères ASCII étendus. Les premiers PC équipés du DOS étaient des IBM (avant que les marques ne se multiplient).

Citation :
Dans le même ordre d'idée, si on fait un dir en console, les fichiers de windows avec des accents par exemple seront correctement accentués, penses-tu qu'il y a une sorte d'auto traduction, comme pour la BDR ?

DIR est un programme utilisé sous console DOS, donc il fait en sorte d'afficher en ASCII étendu. S'il faut convertir, il convertit.

11 Octobre 2008 22:47:56

Hello,

Donc, comment dire ce qu'il y a dans Windows.
Le plus juste est de dire que Windows est en ANSI et qu'il a le support Unicode, ou de dire tout court qu'il est en Unicode ?

Citation :
Soit tu le montre à tout le monde, soit tu ne me le montres pas :p 

En fait, dans la catégorie Sécurité/virus, nous avons un projet commun de formation, avec des cours rédigés.
J'aurais préféré concentrer les cours dans le projet, mais si tu ne veux vraiment pas, alors je le posterai là ;) 

Citation :
J'ai pas voulu t'embrouiller avec ça, mais en fait il y avait plusieurs tables de caractères ASCII étendus. Les premiers PC équipés du DOS étaient des IBM (avant que les marques ne se multiplient).

Ok, donc il y a l'ASCII étendu OEM (DOS) et l'ascii étendu ANSI (Windows).

Citation :
DIR est un programme utilisé sous console DOS, donc il fait en sorte d'afficher en ASCII étendu. S'il faut convertir, il convertit.

Oki.

Citation :
0xxxxxxx 1 octet codant 1 à 7 bits
110xxxxx 10xxxxxx 2 octets codant 8 à 11 bits
1110xxxx 10xxxxxx 10xxxxxx 3 octets codant 12 à 16 bits
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4 octets codant 17 à 21 bits

Je crois que je commence à mieux comprendre les histoires de bits !
On compte donc à partir du premier bit positif (1) sur la gauche combien il y a de bits ? C'est ça, d'après ce que j'avais compté tout à l'heure, ça marche :)  Cool, ça simplifie vachement si c'est ça bien-sûr :p 

Sinon, où trouve-t-on de l'UTF ?

Merci beaucoup ! :) 
a b L Programmation
11 Octobre 2008 23:14:06

Citation :

En fait, dans la catégorie Sécurité/virus, nous avons un projet commun de formation, avec des cours rédigés.
J'aurais préféré concentrer les cours dans le projet, mais si tu ne veux vraiment pas, alors je le posterai là ;) 

S'il est visible, donne le lien.

Citation :
Je crois que je commence à mieux comprendre les histoires de bits !
On compte donc à partir du premier bit positif (1) sur la gauche combien il y a de bits ? C'est ça, d'après ce que j'avais compté tout à l'heure, ça marche :)  Cool, ça simplifie vachement si c'est ça bien-sûr :p 

Voilà, ça c'est uniquement pour passer de l'UTF-8 au point de code unicode.

Citation :
Sinon, où trouve-t-on de l'UTF ?

Dans les pages web ;) 
12 Octobre 2008 00:23:57

Hello,

Je peux t'obtenir un accès pour demain, tu es d'accord ? De toute façon, j'ai vraiment rien à t'apprendre :lol:  !
Je suis en train de rédiger, il sera bientôt fini :) 

Citation :
Voilà, ça c'est uniquement pour passer de l'UTF-8 au point de code unicode.

Euh, bah à vrai dire, je disais ça pour le contraire justement :p 

Par exemple pour 0101 0101 1110b, ça me fait 15 bits, donc je code sur deux octets en UTF.
C'est bien ça ?

Citation :
Dans les pages web ;) 

Oki :) 
a b L Programmation
12 Octobre 2008 11:46:09

Ah oui, je n'avais pas bien compris ce que tu disais, j'ai lu trop rapidement, c'est bien ça.
12 Octobre 2008 11:56:53

Okay, thank you :) 

Grâce à toi, j'ai appris beaucoup de choses, je t'en suis vraiment très reconnaissant ! :) 
Comme tu vois, j'ai du mal à comprendre seulement à partir d'une Doc, mais j'aime bien comprendre les choses ;) 

Je te donne le lien du Forum : http://security-x.forumactif.net/forum.htm , dans Infos & Cours, le premier sujet en haut.
Tu auras l'accès dans la journée (le temps qu'ils aient reçu mon message, car je ne suis pas Admin et je ne valide pas les entrées).

Tu pourras me faire des commentaires directement sur le sujet ou par n'importe quel moyen ;) 
J'ai essayé de faire un truc que tout le monde puisse comprendre et qui soit juste bien-sûr, donc n'hésite pas à corriger toutes les fautes que tu vois !

Sinon, plus grand chose comme question ;) 

Pour l'UTF-8, apparemment la limite est 21 bits sur le point de code de base (donc à partir du premier bit positif en partant de la gauche), donc au dessus (et ça existe il me semble ?), cela ne pourra pas être encodé en UTF-8, c'est ça ?

Pour Windows, on a vu que l'unicode se basait sur l'ANSI et qu'il avait le monopole après, peut-on considérer que Windows est en unicode ? Ou doit-on dire qu'il est en ANSI ? Ou bien parle-t-on de support unicode ?
Je me doute que ce n'est pas une question simple .. Je ne sais si pour toi la question est facile ou si elle n'a pas vraiment de réponse.

Sinon, si tu es d'accord, peut-on vite fait regarder à quoi ressemble l'UTF-16 ?

J'ai lu ça :

Citation :
L'UTF-16 n'est pas l'UCS-2 qui est le codage, plus simple, de chaque caractère sur deux octets. Ces deux normes sont pourtant appelées toutes les deux Unicode, car le codage est le même tant que l'on utilise pas les plages U+D800 à U+DFFF (en principe réservées) et les plages après U+FFFF (peu utilisées en occident).


Donc apparemment ça se base beaucoup sur l'UCS-2 jusqu'à un certain point de code. C'est encore une histoire de nombre de bits comme dans l'UTF-8 ? J'ai regardé un peu les tableaux en dessous, le principe a l'air similaire qu'avec l'UTF-8.

Merci encore ;) 
a b L Programmation
12 Octobre 2008 12:36:40

Citation :
Pour l'UTF-8, apparemment la limite est 21 bits sur le point de code de base (donc à partir du premier bit positif en partant de la gauche), donc au dessus (et ça existe il me semble ?), cela ne pourra pas être encodé en UTF-8, c'est ça ?

Oui on ne peut pas dépasser les 21 bits. En plus la norme limite encore plus de U+0000 à U+10FFFF. Donc, on se force à se limiter à 20 bits. Ils ont fait ça pour rester compatible avec l'UTF-16 qui, lui, a forcément une limite de 20 bits.

Citation :
Pour Windows, on a vu que l'unicode se basait sur l'ANSI et qu'il avait le monopole après, peut-on considérer que Windows est en unicode ? Ou doit-on dire qu'il est en ANSI ? Ou bien parle-t-on de support unicode ?

Déjà, moi je n'aime pas parler d'ANSI, parce qu'on y mets tout et n'importe quoi :) 
Après, comme windows n'est pas libre, on ne peut pas vraiment dire. Sous linux, on peut configurer le noyaux pour que tout l'OS prenne en charge l'encodage, alors que sous windows, j'ai l'impression que ce n'est que par petit bouts (impression que je retrouve dans tout le reste du fonctionnement des windows: une grosse usine à gaz :)  ).

Citation :


Donc apparemment ça se base beaucoup sur l'UCS-2 jusqu'à un certain point de code. C'est encore une histoire de nombre de bits comme dans l'UTF-8 ? J'ai regardé un peu les tableaux en dessous, le principe a l'air similaire qu'avec l'UTF-8.

C'est comme l'UTF-8, qui de base est l'ASCII, et qui étend le nombre d'octet pour faire le reste de l'unicode (à la limite des 20 bits).
L'UTF-16, c'est pareil, faut que ça se joue sur les 2 octets de l'UCS-2.
Donc, à la base, c'est identique à l'UCS-2 (en excluant la fourchette U+D800 à U+DFFF, car ces octets indiquent que le codage se fait sur 4 octets), et pour le reste de l'unicode (à la limite des 20 bits), ça utilise 4 octets.
Effectivement le fonctionnement de l'UTF-16 est très similiare à l'UTF-8.
12 Octobre 2008 13:01:25

Hello,

Merci pour tes réponses ;) 

J'essaierai de regarder plus en détails par moi-même pour l'UTF-16, si je n'y arrive pas, je sais à qui demander, mais promis, j'essaie d'y arriver par moi-même avant.

Quand tu parles de limite de 20 bits pour l'UTF-16, tu parles pour commencer à encoder sur 4 octets ?
Ou pareil que l'UTF-8, la limite est 20 bits ? (sauf que l'encodage n'est pas exactement le même )

Pour Windows, en effet, ça a l'air très difficile à fixer. On parle souvent d'ANSI, mais on ne peut pas vraiment le vérifier.
Par exemple, le Bloc Notes n'est pas une preuve pour le vérifier puisqu'on peut enregistrer sous en ANSI, unicode (big endian ou little endiant) -> le codage n'est pas précisé, je vais vérifier avec Notepad++ si c'est vérifiable ! et UTF-8.

Difficile de dire si c'est le programme en lui même qui supporte ces différentes gammes ou l'OS lui-même. Je ne vois pas trop comment vérifier par l'OS lui-même. Car si on édite, c'est forcément (enfin avec ce que je connais) avec un éditeur de Texte qui a ses propres normes.

Sinon, t'es-tu inscrit sur le lien que je t'ai envoyé ? ;)  Tu seras validé :) 
a b L Programmation
12 Octobre 2008 20:34:45

Quand tu encodes en UTF-16 sur 4 octets, tu as au maximum 20 bits disponibles.
Quand tu encodes en UTF-8 sur 4 octets, tu as au maximum 21 bits disponibles.
Pour unifier l'encodage et éviter qu'un encodage n'encode plus qu'un autre, la norme a limité l'utilisation de l'UTF-8 à 20 bits, même si 21 bits sont dispos.

Dans notepad++, dons le menu format, tu as effectivement la possibilité d'encoder en UTF-8 avec ou sans BOM.

Pour ton site s'il faut s'inscrire c'est pas la peine.
12 Octobre 2008 21:31:02

Citation :
Quand tu encodes en UTF-16 sur 4 octets, tu as au maximum 20 bits disponibles.
Quand tu encodes en UTF-8 sur 4 octets, tu as au maximum 21 bits disponibles.

Okay, c'est juste une façon un peu différence de faire les correspondances selon le point de code (l'un en se basant sur l'UCS-2, l'autre sur l'ASCII).

Finalement, celui qui encode le plus de caractères, c'est l'UTF-32 si j'ai bien compris.

Citation :
Dans notepad++, dons le menu format, tu as effectivement la possibilité d'encoder en UTF-8 avec ou sans BOM.

Ouais, mais le BOM, j'ai pas trop compris ce que c'était. J'ai compris que ça avait quelque chose à voir avec l'endianness, mais après :p 

Citation :
Pour ton site s'il faut s'inscrire c'est pas la peine.

Ok, je te l'upload :) 

--> http://www.sendspace.com/file/lkfvid



a b L Programmation
13 Octobre 2008 20:27:30

Le BOM c'est juste quelques octets en début de fichier qui indiquent l'encodage et l'endianness utilisé dans tout le fichier.
D'ailleurs, sous notepad++ avec le plugin HEX Editor, tu peux voir la différence lorsque tu asffiche le fichier en hexa.
13 Octobre 2008 21:28:28

Hey,

Ok, merci ;) 

Je vais tester, pour voir comment varie le début :) 

Pour le fichier que je t'ai uploadé, es-tu d'accord pour le lire et me dire si tu valides ? Ou préfères-tu que je le poste direct ici ? (en 2 posts)

a b L Programmation
13 Octobre 2008 21:41:03

poste ici :) 
13 Octobre 2008 22:12:37

Oki :)  [Le BBcode n'étant pas le même sur l'autre forum, les balises ne seront pas toujours superbes :p ))]

Ce sujet va aborder l'hexadécimal, le binaire et les normes hexadécimales.

Ce sujet est facultatif, mais est utile à la compréhension de beaucoup de choses (caractères, registre ..).

[font=Comic Sans Ms]Introduction :[/font]


Vous savez tous que derrière l'interface que nous avons de la machine, il y a énormément de choses. Ainsi derrière ce que nous voyons d'un programme (n'importe lequel), il y a du code, du code machine, beaucoup. Dans ce topic, nous allons l'étudier brièvement.

La chose principale à comprendre est la base. La base est la fondation de tout système numérique. Nous, les humains fonctionnons sur une base 10.
Nous avons besoin de 10 chiffres pour exprimer n'importe quel nombre. Les chiffres sont les suivants : 0, 1, 2, 3, 4, 5, 6, 7, 8 et 9. Au total, dix chiffres.
Nous connaissons donc tous la base 10, ou base décimale.

Pour la machine, c'est différent. Elle fonctionne sur une base 2 : les deux chiffres disponibles sont le 0 et le 1.
On pourrait considérer le 0 comme Faux ou Non, et le 1 comme Vrai ou Oui. Ainsi, tout ce que vous voyez dans une machine est en réalité qu'une suite de 1 et de 0. Chaque 0 ou 1 est appelé un Bit (à ne surtout pas confondre avec le Byte (qui se prononce baite)).
Un Byte ou plus justement Octet représente 8 bits. On utilise un b à la fin pour signaler qu'on parle de binaire, c'est une sorte de convention.

Exemple : Ceci est un octet : 10110001b
Ceci n'est pas un octet : 0110100111010b

Pour les calculs en binaire, ça se passe de la manière suivante. Partons de 0000. Lorsqu'on rajoute 1, on obtient 0001, ensuite 0010, puis 0011, et ainsi de suite.
C'est une sorte d'incrémentation. Vous le verrez mieux tout à l'heure.

Un moyen plus utilisé et plus pratique est l'Hexadécimal. Ce langage permet d'une part de simplifier le binaire (c'est une correspondance assez directe, vous le verrez) et cela permet également de regrouper les bits par paquets de 4, vous comprendrez bientôt pourquoi.
Elle facilite donc les conversions en base 2 en regroupant des chiffres binaires, 16 étant une puissance de 2.
Ce langage, fonctionne donc en base 16. Donc, de 0 à 15. Le problème c'est qu'au dessus de 9, on obtient deux chiffres, or cela ne va pas !
Les premières lettres de l'alphabet remplacent donc les nombres de 10 à 15, respectivement, A, B, C, D, E et F.
Donc A=10, .. et F=15. Ansi, par exemple : 9 + 5 = E , E=14, donc 9 + 5 = E ;) 
En revanche, vous ne pourrez utiliser aucune autre lettre (au dessus de F) pour l'hexadécimal.
On parle en général de Bytes (ou d'octets) quand on parle d'Hexadécimal. Beaucoup d'informations sont traitées par Byte.
Si vous regardez la taille d'un fichier (par Propriétés), elle sera donnée en Octets. Si vous voulez savoir la taille en Bits, il vous suffit donc simplement de multiplie par 8, puisqu'un octet = 8 bits !

Nous allons maintenant voir, pourquoi je vous parlais de regroupement par bits en paquet de 4.
La raison en est simple, c'est parce qu'un caractère hexadécimal (de 0 à F) ou "Nibble" est égal à 4 bits !
Traduisons chaque caractère hexadécimale en bits :

0 -> 0000b
1 -> 0001b
2 -> 0010b
3 -> 0011b
4 -> 0100b
5 -> 0101b
6 -> 0110b
7 -> 0111b
8 -> 1000b
9 -> 1001b
A -> 1010b
B -> 1011b
C -> 1100b
D -> 1101b
E -> 1110b
F -> 1111b

Et voilà, nous avons vu le codage binaire qui correspondait à chaque caractère hexadécimal, cela illustre bien le procédé d'incrémentation, et nous voyons que le dernier caractère (F), remplit complètement le groupe de 4 bits. On ne peut pas faire plus que 1111b avec 4 bits.
On peut donc en conclure, qu'un octet (8 bits) est égal à deux caractères hexadécimaux.
Donc en général, on regroupe en octets, donc par deux caractères hexadécimaux.
Donc pour dire "7" en hexadécimal, on notera : 0000 0111b. On sépare distinctement par un espace les deux caractères hexadécimaux.
Ainsi, cela fait 07, ce qui est pareil que le décimal pour le moment.

[font=Comic Sans Ms]Comment fonctionne le calcul ?[/font]


Nous allons maintenant voir comment passer d'une base à l'autre. Tous ces calculs se basent sur les puissances, et la position.
Avant de voir ça, j'aimerais vous communiquer quelques conventions. (Notez bien que c'est simplement pour se comprendre entre humains !)
Nous avons vu que pour signaler du binaire, on met un b à la fin.
Pour l'hexadécimal, il y a deux possibilités, on peut faire de cette manière, par exemple pour A9, on le notera ou bien 0xA9 ou bien A9h (comme hexadécimal :D ).
Lorsqu'on part d'un nombre décimal, par exemple 34, il est plus simple et plus rapide de d'abord convertir en Hexadécimal, au lieu de convertir directement en binaire. La conversion en hexadécimale repose sur une ou plusieurs divisions.

Pourquoi plusieurs ?

La raison est simple. Pour faire des opération pour un octet, il n'y a besoin de faire qu'une division, mais pour un chiffre plus grand, il faudra plus d'octets !

Prenons le nombre 164, pour trouver le byte hexadécimal correspondant, je divise par 16, le nombre entier naturel obtenu entrera dans le premier "nibble" et le reste, dans le deuxième.

-> 164/16 = 10, reste 4.
--> 164 = 0xA4 (ou A4h)

Comprendo ? Vous aurez vite compris que comme pour tout, il y a une limite. Pour un octet, on ne peut pas avoir un nombre décimal plus grand que 255.
Cela représente donc 256 nombres, puisque le 0 compte.

Exemple : 345, si je fais 345 divisé par 16 = 21, plus un reste. Or, impossible de faire entrer un nombre plus grand que 15 dans un caractère hexadécimal !

Pour trouver dans l'autre sens (Hex -> Dec), il suffit de faire l'inverse, et on va retrouver le principe des puissances qui sera également valable en binaire.

Prenons 0xB6 :
  1. Position 1 Position 0
  2. B 6

Dans un octet, on lit donc de droite à gauche ! On part de la position 0.
Pour trouver le nombre décimal, je multiplie le signe hexadécimal (pour les lettres, vous traduisez en décimal, par exemple, C=12) par la base puissance la position, et j'additionne les deux.

Exemple : 0xB6. Pour trouver le nombre décimal, je procède de la manière suivante :
-> 11 * (16^1) + 6 * (16^0) = 182 ! [Puisque 16^1 = 16 et 16^0=1]
Ainsi, le calcul est très facile quand on se trouve dans un octet, on multiplie le premier nibble (de gauche) par 16 et le deuxième par 1, donc il suffit de l'ajouter.

Maintenant nous allons voir l'astuce pour passer rapidement du binaire à l'hexadécimal.
Le binaire fonctionne sur base 2, donc c'est très simple. Il faut traduire caractère hexa par caractère hexa, donc paquet de 4 bits par paquet de 4 bits !
Ainsi, on peut décomposer un nibble en somme : 8 + 4 + 2 + 1 = 15 (= F !)
Pourquoi ? On a vu que 1000b valait 8, 0100b, 4 0010b, 2 et 0001b, 1 ;) 

Exemple :
  1. 8 4 2 1
  2. 0 1 1 0 b


On appelle Bit de poids fort, le bit le plus à gauche (celui qui vaut le plus tout simplement).
Ici le bit de poids fort est à 0 (donc le nombre hexa ne contient pas 8), donc le nombre hexadécimal sera inférieur à son poids (8=2^3). 4 est à 1 et 2 à 1, donc le nombre hexadécimal est égal à :
4 + 2 = 6 !

Donc pour passer de l'hexadécimal au binaire, rien de plus simple (traduire nibble par nibble) :

J'ai 0xB5 : b = 11 = 8 + 2 +1. --> 5 = 4 + 1.
(8421 8421)
Donc 0xB5 : 1011 0101b
Facile, non ?

Pour traduire du binaire au décimal, on se servira à nouveau des puissances et de la position.

Exemple : Je veux traduire 1100 0011b en Décimal. Je peux d'abord traduire en hexadécimal (très simple) puis traduire en décimal.
Mais nous allons passer directement du binaire au décimal.
  1. Position 7 Position 6 Position 5 Position 4 Position 3 Position 2 Position 1 Position 0
  2. 1 1 0 0 0 0 1 1

Si vous avez bien compris, vous pouvez traduire tout seul.

-> 1 * (2^7) + 1 * (2^6) + 0 * (2^5) + 0 * (2^4) + 0 * (2^3) + 0 * (2^2) + 1 * (2^1) + 1 * (2^0) = 128 + 64 + 0 + 0 + 0 + 0 + 2 + 1 = 195 !

Je pense que vous seriez capable de traduire directement du décimal au binaire (plus long), il suffit de vérifier (1=oui, 0=non), si dans le nombre, il y a :
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 (ceci fonctionne pour un octet)

Maintenant en Hexadécimal ;) 

-> 8 + 4 = C --> 2 + 1 = 3 : 0xC3.
-> 12 * (16^1) + 3 * (16^0) = 192 + 3 = 195 !

On retrouve bien le même résultat ! Maintenant, vous savez convertir pour les 3 bases !

13 Octobre 2008 22:13:22

[font=Comic Sans Ms]Les Normes :[/font]


Nous avons vu jusqu'ici comment se passent en gros les calculs binaires. Mais en vérité, vous n'aurez pratiquement jamais à l'utiliser (c'est le processeur qui se charge de tous ces calculs, mais cela marche comme ça pour les valeurs DWord dans la BDR). Les humains, on écrit des lettres, des signes, et des chiffres, on ne fonctionne pas qu'avec des nombres !
Comment cela va-t-il donc se passer ? Et si je vous dis que 0x29 = ) ? :D 
En fait, le but de tous ces calculs, entre le Décimal et les autres (la conversion Hexadécimale-Binaire restera utile tout le temps, le truc avec la somme de 8 + 4 + 2 +1 :)  ) ne servait pas vraiment à dire que 128 se codait de telle manière en hexadécimale. Cela servait simplement à vous faire comprendre combien de caractères peuvent se cacher derrière un octet, et on verra que plus on augmente le nombre d'octets, plus on peut mettre de caractères ! On a vu qu'on pouvait coder de 0 à 255, soit 256 chiffres caractères !
En fait, sur un octet, on peut coder 256 caractères ( a b c d e .. ( ^ : ! 5 6 - + & .....). On appelle l'octet (ou l'ensemble de bits car on verra que un octet n'est pas une limite) correspondant à un caractère un Point de Code.
C'est là qu'interviennent les Normes.

Il y a très longtemps, au tout début de l'informatique, l'"Amérique" a inventé une norme, l'ASCII (American Standard Code for Information Interchange) qui permettait de représenter 128 caractères différents via un octet hexadécimal (ou binaire, ça revient au même ..). On avait donc un encodage de 0x00 à 0x7F (oui 7F = 127, mais n'oubliez pas le 0 !).
On a pu donc représenter le a et le B par exemple (oui une lettre minuscule et majuscule n'ont pas le même encodage) et également les chiffres de 1 à 9, ainsi pour encoder 73, on encode 7 et 3. Et non pas 73 (comme on le faisait avant).
Jusqu'à temps que cela ne suffise plus (les américains n'utilisent pas les accents par exemple), alors on a inventé l'ASCII étendu qui peut coder jusqu'à 256 caractères ! (Donc un octet rempli cette fois).

Il y a deux types d'ASCII étendu :

- Le code ASCII étendu OEM (utilisé dans la console DOS)
- Le code ASCII étendu ANSI (utilisé par Windows)

Note : Un ensemble de point de code correspond à un ensemble de caractères est appelé une table.
Ainsi, lorsqu'on parle de table ASCII par exemple, on parle de l'ensemble des points de code correspondant aux 128 premiers caractères ;) 

L'ASCII est universel, c'est la base de toute norme actuelle. Vous retrouvez dans toutes les normes (du moins les principales) une base (de 0x00 à 0x7F) sur l'ASCII. Maintenant, comment faire pour les langages étrangers ? (cyrillique, arabe ....)

Et bien une nouvelle Norme a été créée, l'UNICODE. Cette norme permet de coder tous les caractères existants. Il y a plusieurs codages en Unicode : On entend souvent dire que l'Unicode code un caractère sur deux octets.
C'est en réalité plus compliqué que ça :p 
Il y a plusieurs "codages Unicode", il y a des codages qui allouent une taille variable (en octets) selon le point de code, et il y en a d'autres qui fixent un nombre d'octets pour coder un caractère.

Fixes : UCS-2 (comme dans la Base de Registre), et UTF-32 (ou UCS-4)
Variables : UTF-8 et UTF-16.

On s'intéressera ici seulement à l'UCS-2, car c'est celle qu'on retrouve dans la Base de Registre.
Avec cette norme, tout est codé sur deux octets. Cela restreint donc légèrement le nombre de caractères possibles, mais les principaux seront là.
On peut en tout encoder 65 536 caractères : Si vous vous rappelez bien des puissances ! (16^4=65 536 comme 16^2=256).

-> 0xFFFF -> 15 * (16^3) + 15 * (16^2) + 15 * (16^1) + 15 * (16^0) = 65535 ! Plus le 0, 65 536 ;) 

Donc, par exemple, pour le caractère : qui correspond au point de code 0x3A, en UCS-2, cela donnera 003Ah.
Si je regarde maintenant les Tables Unicode, pour ce caractère par exemple : ӂ, le point de code est 0x04C2. Il n'y a donc aucun changement.
On pourrait dire 0x4C2 (et donc on rajoute un 0 pour respecter la norme qui est fixée à deux octets), mais ce n'est pas conseillé, et pour l'UCS-2, il faudra mettre le 0 devant ! Vous voulez voir de l'encodage Unicode ?

Allez dans la Base de Registre, reportez-vous sur une valeur (REG_SZ ou REG_EXPAND_SZ ou autre..) et faites clique droit -> Modifier données binaires ..
Hop et là vous voyez votre texte à droite (en ANSI, si vous avez une donnée en Unicode, la donnée indiquée ici ne sera pas vraie, puisque que ce sera de l'ANSI, donc traduit octet par octet) et le codage hexadécimal à gauche. Vous remarquez, les 00 qui séparent chaque octet ?
Vous avez deviné ce que c'est ? Et bien oui, c'est votre deuxième octet !
Remarquez que c'est la virgule qui sépare chaque octet dans la BDR.

Comprends pas ! Pourquoi le 00 est à droite, il devrait pas plutôt être à gauche ?? Si j'ai 0x6D, il faut que je mette 00,6D pas 6D,00 , non ??

En effet ! Si vous avez bien compris la leçon, 6D en ANSI, devient 006D en UCS-2 !
Alors pourquoi ce changement ? Ceci est dû à l'Endianness (big ou little), qui définit l'ordre des octets. En little endian, on inverse les octets dans un paquet, et en big, on le laisse dans le bon ordre. Il faut donc savoir à l'avance dans quel format c'est utilisé sinon ça ne marche pas :) . Il faut rentrer au plus proche de la machine pour comprendre. Pour les PC (architecture x86), c'est du little endian qui est utilisé, c'est à dire qu'on inverse toujours les octets.

Pensez au sens du courant, c'est un peu pareil, il y a le vrai sens et le sens conventionnel.

Donc la Base de Registre utilise le Little Endian. Voilà pourquoi (même pour du REG_SZ, ou du DWord), vous verrez les paquets inversés.
Quand on fait un Reg, on choisit donc si on code en Little Endian ou en Big Endian.
Pour les DWord, on utilise le Big Endian. Par exemple, on met "valeur"=dword:00000001, et bien en vrai (vous le verrez dans modifier données binaires), ce sera 01 00 00 00 :)  Un DWord, c'est 4 octets, donc chaque octet est inversé. Le premier devient le dernier, et le dernier, le premier etc ..
Par contre, quand on entre une donnée en REG_EXPAND_SZ, ou en REG_MULTI_SZ, on entre directement la donnée en Little Endian (c'est pour ça qu'on retrouve le même ordre dans modifier données binaires).

J'espère que vous comprenez maintenant mieux la Base de Registre.

Une autre précision que vous devriez maintenant comprendre. Certaines infections (Purity notamment) utilisent des entrées dans le registre en Unicode ainsi que des noms de fichiers/dossiers en Unicode.

Ainsi, à la place d'avoir par exemple des données comme ceci : hex(2):AD,00,23,00,D4,00 ..
Vous aurez ceci : hex(2):AD,5C,23,55 ...
Car les caractères rajoutés par la norme Unicode prennent deux octets, autrement dit, le deuxième octet n'est pas nul (ou plus, mais pas possible dans la BDR) ! Le 00 est donc remplacé par la "valeur" du deuxième octet tout simplement (ou premier ça dépend si vous parlez Little Endian ou non :red:) . Une petite précision, la norme Unicode se base sur l'ANSI, cela veut dire qu'un caractère en ANSI a le même point de code en Unicode (juste qu'on rajoute un octet nul [00] pour respecter la norme [en UCS-2]).

Est-ce que vous comprenez quel problème peut se poser avec cette histoire de normes, d'Unicode ?
Je vous ai dit que la console DOS avait une norme respective (limitée à un octet) qui est l'ASCII étendu OEM.
Or, il y a beaucoup d'outils de désinfection qui sont des batchs (dont qui ont la même norme que la console DOS). Quel problème cela peut-il poser ?
Et bien, si l'infection rajoute par exemple des valeurs en Unicode ?

Il y a beaucoup d'outils qui font des comptes-rendu registre. La valeur Unicode ne sera donc pas bien interprétée ! (mais le problème peut être contourné..)

Exemple : J'ai créé une valeur dans ma BDR, comme ceci :



On voit que le valeur est en UNICODE, et qu'une partie de la donnée est de l'Unicode.

Voici un export de cette clef en UNICODE ( via Reg export, ou bien regedit /E) :

  1. Windows Registry Editor Version 5.00
  2.  
  3. [HKEY_LOCAL_MACHINE\software\key]
  4. "ҠҖҶӝ"=hex(2):6d,5b,6f,42,68,00,61,00,68,00,61,00,68,00,61,00,00,00
  5. @="hohohohohoh"


Ceci illustre bien ce que je vous ai dit avant. Dans la donnée, vous aurez remarqué que les deux premiers caractères sont des caractères UNICODE.
Et regardez, les 4 premiers octets ne sont pas nuls, c'est normal. Les caractères suivants sont simplement de l'ANSI (donc sur un octet, donc le deuxième octet est nul). Pour la valeur, elle est correctement interprétée.

Maintenant un export en ANSI :

  1. REGEDIT4
  2.  
  3. [HKEY_LOCAL_MACHINE\Software\key]
  4. "????"=hex(2):6d,6f,68,61,68,61,68,61,00
  5. @="hohohohohoh"


Qu'est-ce que l'on remarque ? La valeur n'est pas interprétée, normal puisque le caractère Unicode ne fait pas partie de la table ANSI !
Donc quand "Windows" (ou DOS) ne sait pas à quoi correspond le caractère, il remplace par un ?. Donc si j'ai seulement cet export, il m'est impossible de supprimer la valeur seule ! Car si je fais "????"=-, cela cherchera une clef qui contient 4 ? et non les 4 caractères UNICODE.
Remarquez aussi que le 5b et le 42 dans la donnée ont disparu ! Donc cette donnée est fausse pour les deux premiers caractères !
Mais ça reste normal, puisque l'ANSI code sur un octet, et donc quand il fait la traduction, vire le deuxième octet (habituellement 00).

Par exemple, l'outil ComboFix très renommé utilise le format REGEDIT4 (ANSI), donc pour les exports de clefs de registre .. Pas évident si y a de l'Unicode.
De même il faudra faire des regs adaptés (pour l'EXPAND et le MULTI).

J'espère que ce topic vous aura été utile et que vous voyez dorénavant un peu mieux les choses !

Note : Si vous voulez vous familiariser avec tout ça, je vous conseille l'installation de Notepad++ avec le Plugin Hex-Editor.
Vous pourrez encoder et convertir en ANSI, UTF-8 (moins évident..) et UCS-2 (big endian ou little endian :)  ).
Ainsi, vous pouvez taper un texte normalement et regarder ensuite ce que ça donne dans les différents codages ;)  Et inversement.

Grâce à ce logiciel, si vous faites des batchs, vous pourrez également faire apparaître les bons caractères (après les 128 premiers caractères, puisque après les deux encodage sont différents (ANSI et OEM). Par exemple, si vous tapez é dans le bloc notes, le résultat dans le batch sera un , et non un é. Vous vous dites, il suffit peut-être d'inverser en mettant un , ? Et bien non, cela fera aussi une virgule, car la virgule est dans les 128 premiers caractères (ASCII), donc il y a deux encodages différents pour une virgule en DOS par exemple.. Il vous faudra chercher le bon point de code pour votre caractère dans la table ASCII étendu OEM pour que le caractère soit correctement interprété dans votre Batch.
Faites des tests, et vous comprendrez mieux ..
13 Octobre 2008 22:14:24

Bouarf, les balises Code ont merdé pour les positions (mais je ne me suis pas trompé) ;) 

Merci de me faire des commentaires les plus critiques :) 
Le tutoriel doit être exact et compréhensible par n'importe qui.
N'hésite pas à corriger mes fautes, faire des critiques au niveau de ma méthode pour expliquer ,etc ..

Merci !
a b L Programmation
14 Octobre 2008 21:15:52

Bon, je vais être pointilleux, alors pas la peine de prendre en compte mes remarques :) .

Citation :
Ce sujet va aborder l'hexadécimal, le binaire et les normes hexadécimales.

Parler de "norme hexadécimale" n'a pas vraiment de sens puisqu'une norme décrit un contexte d'utilisation (encodage de caractères, langage machine, communication avec contexte particulier, etc).

Citation :
Nous, les humains fonctionnons sur une base 10.

C'est dans notre société que nous calculons en base 10:
http://fr.wikipedia.org/wiki/Num%C3%A9ration#Caract.C3.A8re_d.27une_num.C3.A9ration
:p 

Citation :
(qui se prononce baite)

[ bait ] ;) 

Citation :
Un moyen plus utilisé et plus pratique est l'Hexadécimal.

Peut-être que tu peux ajouter "pour représenter le binaire".

Citation :
Et voilà, nous avons vu le codage binaire qui correspondait à chaque caractère hexadécimal, cela illustre bien le procédé d'incrémentation,

Tu peux montrer comment on fait des additions en binaires avec la retenue de 1.

Citation :
Pour les PC (architecture x86), c'est du little endian qui est utilisé, c'est à dire qu'on inverse toujours les octets.

Attention, le fait d'utiliser l'architecture x86 n'implique pas l'utilisation du little endian dans les chaines de caractères. C'est un point qui peut paraitre confus, peut-être ne faut-il pas parler du tout de l'architecture x86 (d'autant que "x86" ne parle pas forcément :)  ).

Bon, ça me parait clair, mais il faut voir avec les débutants. ;) 
14 Octobre 2008 23:16:07

Hello,

Merci pour ta lecture !

Citation :
Bon, je vais être pointilleux, alors pas la peine de prendre en compte mes remarques :) .

Si, justement, c'est ce que je veux ;) 

Citation :
Parler de "norme hexadécimale" n'a pas vraiment de sens puisqu'une norme décrit un contexte d'utilisation (encodage de caractères, langage machine, communication avec contexte particulier, etc).

Tu as raison, je parlerai donc simplement de normes.

Citation :
C'est dans notre société que nous calculons en base 10:
http://fr.wikipedia.org/wiki/Num%C [...] 3.A9ration
:p 

Ah ouais :D  J'avais regardé en plus cette partie de wiki, et j'avais pas tilté.
Je rajoute donc un truc du genre "en général" ?

Oki pour [bait] ;) 

Citation :
Peut-être que tu peux ajouter "pour représenter le binaire".

Ouaip, je vais éditer :) 

Citation :

Tu peux montrer comment on fait des additions en binaires avec la retenue de 1.

Ah ouais, je peux rajouter ça au début, quand je commence à faire une énumération là dessus. Je mets une addition comme si on était en primaire ? Sauf avec seulement des 1 et des 0 ? [Logiquement ça marche?]

Citation :
Attention, le fait d'utiliser l'architecture x86 n'implique pas l'utilisation du little endian dans les chaines de caractères. C'est un point qui peut paraitre confus, peut-être ne faut-il pas parler du tout de l'architecture x86 (d'autant que "x86" ne parle pas forcément :)  ).

Okay, je mets juste pc (selon l'architecture), ou juste PC ?

Sinon, bah grand merci pour avoir pris le temps de le lire (et tout le reste).
Pour les "débutants", j'édite dès que tu m'auras à nouveau répondu, je mets en ligne et je leur demande si ils comprennent bien (pour ceux qui ne connaissent pas trop ça)
a b L Programmation
14 Octobre 2008 23:51:23

Citation :
Ah ouais, je peux rajouter ça au début, quand je commence à faire une énumération là dessus. Je mets une addition comme si on était en primaire ? Sauf avec seulement des 1 et des 0 ? [Logiquement ça marche?]

Oui, c'est même plus simple. Pour calculer chaque bit, en électronique, il faut faire un additionneur 3 bits. 3 bits car il y a la retenue:
- le bit Ai du premier nombre
- le bit Bi du deuxième nombre
- l'ancien bit Ri-1 de la retenue précédente.
Soit Si le résultat et Ri le reste pour le prochain calcul

En gros, (A4 A3 A2 A1 A0)b + (B4 B3 B2 B1 B0)b = (R4 S4 S3 S2 S1 S0)b

En électronique ce sont des portes logiques, mais pour faire le calcul, disons que tu fais le calcul sur 2 bits, et que le bit de poids fort c'est la retenue.
aucun bit à 1 (0 = 00b) => Ri = 0 et Si = 0
un bit à 1 (1 = 01b) => Ri = 0 et Si = 1
deux bit à 1 (2 = 10b) => Ri = 1 et Si = 0
trois bit à 1 => Ri = 1 et Si = 1

Citation :
Okay, je mets juste pc (selon l'architecture), ou juste PC ?

Ce que je veux dire c'est qu'il ne faut pas lier l'endianness de la base de registre (ou tout autre logiciel) avec l'endianness de l'architecture. Si un programme veut faire dans le sens qu'il veut, rien ne lui interdit.
Microsoft pourrait aussi bien décider de changer l'endianness dans la base de registre (peu probable que ça arrive un jour, mais c'est possible).
15 Octobre 2008 00:04:46

Hep,

Ouaip, j'ai compris le principe que tu m'as montré avec les portes logiques.

Je vais essayer de faire la même chose avec une simple addition (de primaire) et je te le posterai (au cas où je mets n'importe quoi :D  )

Donc finalement, c'est pas lié à l'architecture ?
Je reformulerai cette petite partie alors :) 
Alors je mets pour les PC's (Base de Registre Windows) , .. ?

edit: Le truc pour l'addition :

L'incrémentation en binaire fonctionne de la même manière qu'une simple addition de primaire, sauf que l'on travaille seulement avec 1 et 0. Lorsqu'on a 1 et qu'on lui ajoute 1, ce dernier redevient 0, s'il y a un nombre à sa gauche, il sera incrémenté de 1, si il n'y en a pas, alors un 1 y sera ajouté.

Si j'ai un 1, ça fait 1 = 01 = 001 = ....
J'ajoute 1, ça fait une retenue (et oui, pas 2, nous ne travaillons qu'avec 1 et 0 ! ) et ça annule le premier 1, donc 10.
Je rajoute encore 1, et bien le 0 est remplacé par le 1, donc 11.
J'ajoute à nouveau 1, retenue sur l'ensemble, et le nombre devient 100.
Et ainsi de suite .. :) 

--> Correct ?

a b L Programmation
15 Octobre 2008 19:36:26

Citation :
Donc finalement, c'est pas lié à l'architecture ?

pour les chaines de caractères non, c'est uniquement pour les nombres, et encore, la base de registre pourrait prendre un autre endianness mais ça compliquerait car il aurait besoin de traduire.

Citation :
Je reformulerai cette petite partie alors :) 
Alors je mets pour les PC's (Base de Registre Windows) , .. ?

oui c'est mieux. ;) 

Citation :
--> Correct ?

oui
15 Octobre 2008 19:41:27

Citation :
pour les chaines de caractères non, c'est uniquement pour les nombres, et encore, la base de registre pourrait prendre un autre endianness mais ça compliquerait car il aurait besoin de traduire.

Oki :) 

Enfin, je vais pas essayer de comprendre comment ça se passe après la norme. C'est à dire ce que représente le caractère pour Windows, je suppose juste un nombre, mais je n'en sais rien.

Grand merci, c'est grâce à toi que j'ai pu le faire ! ;) 

Si j'ai d'autres questions, je t'en ferai part, mais je pense que pour le coup, c'est bon.
Je ne pense pas qu'apprendre à encoder en UTF-16 me servira, de toute façon, je pense avoir perçu la logique :) 

edit: D'ailleurs pour mon tuto, est-ce que t'aurais une idée pour un truc ?

Pour mon premier lien que je mets comme ça dans un mot :

[ur l= le lien ] Base [/url]

Le lien s'affiche, je ne vois pas ce qui ne va pas. Je peux te faire un screen si tu veux :) 
a b L Programmation
17 Octobre 2008 23:30:16

J'ai corrigé ma signature pour que le clavier marche sur des versions de windows d'au moins XP.
Du coup, je l'ai aussi optimisé en taille, et comme ça me faisait de la place dans la signature, je l'ai améliorée. :) 

Dans ma nouvelle signature, le programme de 56 octets permet de dessiner (en fait faire plus du gribouillage :D  ) à l'écran en tapant sur les touches du clavier (avec Echap pour quitter).
Donc, si tu veux tester, il suffit de remplir dans un fichier les 56 octets en binaire (je ne t'indique pas comment faire ;)  ), de nommer le fichier avec l'extension .COM (et vérifie bien que les octets soient bons et que ton fichier fait bien exactement 56 octets, parce qu'une seule erreur et le programme a de fortes chances de crasher :)  ).

Je te donne la description du programme en assembleur avec des commentaires (tu remarqueras l'endianness une fois codé en langage machine ;)  ).

  1. // On met dans le registre ES (extra-segment), l'adresse de la mémoire vidéo A000:0000
  2. 6800A0 PUSH A000h
  3. 07 POP ES
  4.  
  5. // on initialise le mode graphique en 320x200x256 couleurs (8-bits): interruption vidéo 10h, fonction 00h, sous-fonction 13h
  6. B81300 MOX AX, 0013h
  7. CD10 INT 10h
  8.  
  9. // on initialise AL (octet de poids faible du mot AX) à 01, ce sera la couleur du pixel courant
  10. B001 MOV AL, 01h
  11.  
  12. // on initialise le registre CX qui va servir de compteur pour faire déplacer le pixel à l'acran
  13. 31C9 XOR CX, CX
  14.  
  15. // on affiche le pixel à la position donnée par CX avec la couleur donnée par AL
  16. 89CF MOV DI, CX
  17. 26 ES:
  18. 8805 MOV[DI],AL
  19.  
  20. // on incrémente CX pour passer au pixel suivant
  21. 41 INC CX
  22.  
  23. // FA00h=64000=320x200, On regarde si le pixel arrive au bout de l'écran.
  24. // Si c'est le cas, on résinitialise le compteur CX à 0, sinon on saute l'initialisation (2 octets plus loin)
  25. 81F900FA CMP CX, FA00h
  26. 7502 JNZ +02h
  27. 30ED XOR CH, CH
  28.  
  29. // Synchronisation avec le retour de balayage: pour afficher à l'écran que lorsque le balayage arrive au coin de l'écran
  30. BADA03 MOV DX, 03DAh
  31. EC IN AL, DX
  32. A808 TEST AL, 08h
  33. 75FB JNZ -05h
  34. EC IN AL, DX
  35. A808 TEST AL, 08h
  36. 74FB JZ -05h
  37.  
  38. // Comme windows bloque les fonctionnalités clavier, on va lire directement à la sortie du micro-controlleur la touche clavier utilisée
  39. // Si ce n'est pas Echap on boucle sur l'affichage du pixel (au MOV DI, CX soit 21h=33 octets en remontant), et on lit le scan code clavier dans AL qui servira de couleur.
  40. E460 IN AL, 60h
  41. 3C01 CMP AL, 01h
  42. 75DF JNZ -21h
  43.  
  44. // Ici la touche echap a été enfoncée, on repasse en mode texte 80x25 caractères (interruption 10h, fonction 00h, sous-fonction 03h)
  45. B80300 MOV AX, 0003h
  46. CD10 INT 10h
  47.  
  48. // On indique la fin du programme DOS (interruption DOS 21h, fonction 4Ch)
  49. B8004C MOV AX, 4C00h
  50. CD21 INT 21h
18 Octobre 2008 00:37:23

Hey,

Merci CRicky ! Vachement intéressant, je vais lire et tester ça demain avec plaisir ! (sympa de faire partager ! ;)  )

-------------------

Sinon as-tu une idée pour ça ?



Merci !
a c 232 L Programmation
18 Octobre 2008 07:42:38

ça dépend des forums le code BBCode pour insérer des url... faut voir sur le tiens
18 Octobre 2008 12:16:03

Hep Omar,

Le truc c'est que j'ai déjà fait plusieurs sujets dessus en faisant exactement pareil (même dans le même sujet) et ça marche. y a qu'avec celui-là qu'il beug.

edit: c'est réglé :) 

@CRicky,

Pour les 56 octets, je crée deux fichiers ?
Celui en assembleur et un autre ? Les 56 octets, où je dois les mettre (je mets des octets au hasard ?), et comment dire à l'ordi que c'est du binaire ? Ou je tape 56 caractères ANSI, désolé, je crois que je suis à côté de la plaque :lol: 
a b L Programmation
18 Octobre 2008 13:31:38

Pour l'URL, ce n'est pas plutôt [ url url=http://lien ] affichage [ /url ] ?

Pour le programme, non, tu n'utilises pas l'assembleur (c'est juste pour expliquer le code). Tu lance un éditeur hexa (comme notepad++ avec son plugin), et tu tapes le code hexa. Il ne faut pas faire de copier-coller car par exemple '10' est considéré comme la chaine ce caractère donc si tu le colles, il va mettre 31h 30h (il va coller dans la partie dump), alors qu'il te faut mettre 10h.
En hexa, tu dois taper ça:
  1. 68 00 A0 07 B8 13 00 CD 10 B0 01 31 C9 89 CF 26
  2. 88 05 41 81 F9 00 FA 75 02 30 ED BA DA 03 EC A8
  3. 08 75 FB EC A8 08 74 FB E4 60 3C 01 75 DF B8 03
  4. 00 CD 10 B8 00 4C CD 21

18 Octobre 2008 15:35:28

Hello,

Je me suis peut-être trompé quelque part.
J'ai tapé tout ceci en hex dans Notepad++, et enregistrer sur le bureau sous test.COM.

>>

Pour l'URL, c'est pareil que sur IDN. C'est réglé, je sais pas comment, peut-être les parenthèses qui posaient problème..
a b L Programmation
18 Octobre 2008 15:54:14

OK, après avoir bloqué le clavier, Vista bloque le plein écran ? (il faut que je trouve une machine sous vista :)  ).
18 Octobre 2008 16:46:12

Hello,

Au message d'erreur, rien n'est bloqué, je peux fermer.
Si je fais ignorer (2 fois de suite), le clavier est bloqué, je ne peux rien taper, et l'application apparaît en console vide (même grandeur que lancée normalement).
20 Octobre 2008 19:30:10

Fixed the Beug ?

Pourrais-je te poser des questions sur les types de logiciels suivants ?

- Désassembleur : J'ai cru que ça montrait le code de "n'importe" quel logiciel en langage assembleur.
- Assembleur : Pour faire de l'assembleur ?
- Editeur Hexadécimal : Montre le code de "n'importe" quel logiciel en assembleur.
- Debugger : Pas trop compris ..
- Editeur Ressources;: Pas trop compris ..

Merci.

Selon toi, ceci est bien ? : Pas trop compris ..

Merci, j'avais un lien intéressant sur un logiciel, mais je ne trouve plus.

Que me conseilles-tu comme "bon" logiciel ? J'aimerais bien regarder des trucs ..
a b L Programmation
20 Octobre 2008 20:29:51

Non pour le bug, je n'ai pas encore regardé. Il me faudrait voir si je peux écrire directement dans une adresse mémoire, mais je n'ai jamais essayé pour l'affichage vidéo. :) 
J'ai une question: du coup, tu ne peux pas mettre de console en plein écran en faisant ALT+Entrée alors ?

Citation :
- Désassembleur : J'ai cru que ça montrait le code de "n'importe" quel logiciel en langage assembleur.

Oui, un peu comme un encodage de caractère, un processeur (pour le PC le CPU) possède un dictionnaire d'instructions (du genre copie d'octets en mémoire, opérations de base et communication avec les périphériques en déclenchant des interruptions matérielles ou logicielles).

Dans le petit programme que j'ai montré, il y a par exemple B8 13 00. Lorsque le processeur lit le premier octet B8, il va copier une valeur de 2 octet dans le registre d'accumulation AX (les registres sont des petites zones mémoires incorporés dans le processeur). Donc il copie les 2 octets suivant du code (13 et 00), et le circuit électrique fait les connexions qui vont bien pour copier les bits au cycle d'horloge suivant. Ce n'est pas facile à expliquer. En fait il faudrait comprendre comment faire des portes logiques avec des transistors, puis faire un additionneur binaire par cycles pour finir par un processeur de base.

Citation :
- Assembleur : Pour faire de l'assembleur ?

L'assembleur est le langage qui décrit de façon plus humain directement les instructions machines B8 13 00 c'est MOV AX,0013h pour indiquer que l'on met la valeur 0013h dans le registre AX.
D'ailleurs sous une console DOS, il y a le programme DEBUG qui permet de manipuler de la mémoire, coder en assembleur et faire ce qu'on veut avec la machine. C'est pour ça qu'en batch on peut théoriquement tout faire puisqu'on a accès à DEBUG, il suffit de lui donner les instructions. ;) 
Donc, quand on fait de l'assembleur c'est comme faire du langage machine, sauf que c'est représenté plus joliment. En fait, faire un compilateur assembleur n'est pas très compliqué : on vire tous les commentaires et espaces, et on remplace chaque instruction assembleur par le code machine qui correspond.

Citation :
- Editeur Hexadécimal : Montre le code de "n'importe" quel logiciel en assembleur.

Pas qu'un logiciel. Il permet de voir comment un fichier est écrit binairement sur le disque dur ou tout autre support. Pour le cas d'un fichier texte, il suffit de suivre l'encodage. Pour un programme, il faut retrouver à quoi correspondent chaque instruction.
La décompilation, c'est justement lire toutes les instructions machines et retrouver les instructions assembleurs qui correspondent.

D'ailleurs si tu as fait à partir de ma signature le fichier toto.com, sous une console DOS, tu tapes:
  1. DEBUG TOTO.BAT
Puis dans la console de DEBUG,
  1. u
, et ça te décompile le programme (tu dois retrouver les instructions assembleurs que j'ai indiquées). (pour quitter la console de debug c'est q :)  )

Citation :
- Debugger : Pas trop compris ..

un debugger simule l'exécution d'un programme compilé, en analysant chaque instructions. En plus quand on compile (en mode debug) un programme C par exemple, on peut indiquer dans l'exécutable à quelle ligne de code C un ensemble d'instructions correspond. C'est pour ça qu'il ne faut pas optimiser le code car les paquets d'instructions se mélangent un peu, et lorsqu'on lance le debugger, on a des sauts pas-à-pas qui ne correspondent pas à des sauts ligne par ligne dans le code source. :) 

Citation :
- Editeur Ressources;: Pas trop compris ..

Un programme compilé, c'est juste un ensemble d'octets (comme dans ma signature) qui est chargé quelque part en mémoire RAM. Le processeur possède un registre (IP pour Instruction Pointer) qui indique l'adresse mémoire de la prochaine instruction à exécuter au prochain cycle d'horloge.
Donc, pour faire ça, le lancement d'un programme (toto.exe) est chargé en mémoire, donc tout le contenu du fichier est chargé en mémoire. Or, la mémoire sert aussi à stocker des informations, comme par exemple une valeur constante écrite directement dans le programme. Maintenant, à la place d'une simple valeur constante, on peut aussi y mettre tout le contenu d'une image directement dans le programme. Il suffit juste que le registre IP n'aille jamais pointer dans la zone où il y a l'image (en faisant des saut d'instructions par exemple), car sinon, le processeur, tout bête, va exécuter les instructions qu'il voit (ce qui va certainement générer un crash).
Du coup, dans un fichier .exe on peut directement y mettre des images et toute autres données que l'on appelle des ressources.
Un éditeur de ressource permet de modifier les données embarquées dans l'exe. L'exemple classique est l'icône du programme qui est embarqué dans le programme, car si on devait mettre un fichier .ICO à côté de l'exe, ça ne serait pas très ergonomique. ;) 

Citation :
Selon toi, ceci est bien ? : Pas trop compris ..

Non, parce que:
- soit tu as les sources du programme (logiciel libre), et tu peux directement modifier les sources et les ressources (qui sont de simples fichiers)
- soit tu n'as pas les sources, et donc c'est que l'éditeur ne veut pas qu'on touche au programme, et il ajoute une mention concernant le rétro-engineering interdisant la décompilation et la modification des fichiers (ressources externes et embarquées comprises).

20 Octobre 2008 20:53:07

Hello,

Citation :
J'ai une question: du coup, tu ne peux pas mettre de console en plein écran en faisant ALT+Entrée alors ?

Effectivement :) 

J'ai regardé un peu ce lien (je le regarderai plus en profondeur) : http://www.commentcamarche.net/contents/asm/assembleur....
Bien que compliqué, tout ça m'intéresse beaucoup.

Citation :
D'ailleurs sous une console DOS, il y a le programme DEBUG qui permet de manipuler de la mémoire, coder en assembleur et faire ce qu'on veut avec la machine. C'est pour ça qu'en batch on peut théoriquement tout faire puisqu'on a accès à DEBUG, il suffit de lui donner les instructions. ;) 

Tout faire, qu'entends-tu par toute faire ? Le batch est certes "puissant" (par les boucles for par exemple), mais aussi limité, non ?

Citation :
, et ça te décompile le programme (tu dois retrouver les instructions assembleurs que j'ai indiquées). (pour quitter la console de debug c'est q :)  )

Tu voulais dire ...com ? Le debug est long ? Parce que rien ne s'affiche :p 

Citation :

un debugger simule l'exécution d'un programme compilé, en analysant chaque instructions. En plus quand on compile (en mode debug) un programme C par exemple, on peut indiquer dans l'exécutable à quelle ligne de code C un ensemble d'instructions correspond. C'est pour ça qu'il ne faut pas optimiser le code car les paquets d'instructions se mélangent un peu, et lorsqu'on lance le debugger, on a des sauts pas-à-pas qui ne correspondent pas à des sauts ligne par ligne dans le code source. :) 

Ah oui, en effet, souvenirs .. Le debugger pour tester si ça marche.

Citation :
Un programme compilé, c'est juste un ensemble d'octets (comme dans ma signature) qui est chargé quelque part en mémoire RAM. Le processeur possède un registre (IP pour Instruction Pointer) qui indique l'adresse mémoire de la prochaine instruction à exécuter au prochain cycle d'horloge.
Donc, pour faire ça, le lancement d'un programme (toto.exe) est chargé en mémoire, donc tout le contenu du fichier est chargé en mémoire. Or, la mémoire sert aussi à stocker des informations, comme par exemple une valeur constante écrite directement dans le programme. Maintenant, à la place d'une simple valeur constante, on peut aussi y mettre tout le contenu d'une image directement dans le programme. Il suffit juste que le registre IP n'aille jamais pointer dans la zone où il y a l'image (en faisant des saut d'instructions par exemple), car sinon, le processeur, tout bête, va exécuter les instructions qu'il voit (ce qui va certainement générer un crash).
Du coup, dans un fichier .exe on peut directement y mettre des images et toute autres données que l'on appelle des ressources.
Un éditeur de ressource permet de modifier les données embarquées dans l'exe. L'exemple classique est l'icône du programme qui est embarqué dans le programme, car si on devait mettre un fichier .ICO à côté de l'exe, ça ne serait pas très ergonomique. ;) 

Ok, là j'ai compris :) 
L'interface du programme en quelque sorte. Et le logiciel ne montre que ça ? Sinon je suppose que c'est pas simple de s'y retrouver, enfin j'en sais rien avec mon niveau :p 

Citation :
Non, parce que:
- soit tu as les sources du programme (logiciel libre), et tu peux directement modifier les sources et les ressources (qui sont de simples fichiers)
- soit tu n'as pas les sources, et donc c'est que l'éditeur ne veut pas qu'on touche au programme, et il ajoute une mention concernant le rétro-engineering interdisant la décompilation et la modification des fichiers (ressources externes et embarquées comprises).

Ok, mais finalement le programme marchera même sur un fichier protégé ou pas ?
Le "crack", le but, c'est bien de faire sauter la protection ?

J'aimerais juste voir à quoi ça ressemble. Etant donné que je ne connais pas l'assembleur, le mieux pour moi est d'essayer un éditeur hexadécimal ? Sur une .DLL , par exemple ?

Merci :) 
a b L Programmation
20 Octobre 2008 21:37:55

Tu peux trouver gratuitement des PDF (cherche Art of Assembly sous google), c'est en anglais et c'est un gros, très gros pavé, mais il y a presque tout. ;) 

Citation :
Tout faire, qu'entends-tu par toute faire ? Le batch est certes "puissant" (par les boucles for par exemple), mais aussi limité, non ?

Oui, mais avec la commande DEBUG, tu peux exécuter du langage machine dans ton .bat (par redirection avec un fichier). A partir du moment où tu peux coder en langage machine, tu t'adresses directement au CPU, donc tu peux théoriquement (parce qu'en pratique, ce n'est pas simple ;)  ) tout faire. C'est pour ça que les fichier .bat peuvent embarquer des virus.
C'est sûr qu'en batch sans utilisation de DEBUG, on est très rapidement limité (même en théorie ;)  ).

Citation :
Tu voulais dire ...com ? Le debug est long ? Parce que rien ne s'affiche :p 

Si tu lances DEBUG avec le fichier .COM, il est chargé en mémoire (mais pas exécuté (c'est la commande g pour lancer). Dans la commande e<adresse>, tu vois le contenu en binaire de la mémoire, là où le programme a été chargé. Avec u<adresse>, c'est pareil ça lit la mémoire et ça "décompile" en assembleur. Si tu ne mets pas l'adresse, ça commencer à <adresse base mémoire>:100. Si tu fait u plusieurs fois sans mettre d'adresse, ça incrément l'adresse de lecture. Par contre comme tu lis en mémoire RAM, ça ne s'arrête pas à la fin du programme, ça continue ailleurs (et du coup ça met n'importe quoi comme instruction :)  ).

Citation :
L'interface du programme en quelque sorte. Et le logiciel ne montre que ça ? Sinon je suppose que c'est pas simple de s'y retrouver, enfin j'en sais rien avec mon niveau :p 

Oui, tu peux changer l'icône du programme en le modifiant en binaire. Après je ne suis pas rentré dans les détails, mais disons que qu'on met une zone dédié aux ressources, une autre au code lui-même, ce qui fait que ce genre de programme s'y retrouve facilement.

Citation :
Ok, mais finalement le programme marchera même sur un fichier protégé ou pas ?

Bien sur ton programme c'est du binaire, c'est juste un fichier bianire qui est bêtement chargé en mémoire (une machine c'est toujours bête :)  ).

Citation :
Le "crack", le but, c'est bien de faire sauter la protection ?

Le but, c'est de modifier le code en modifiant l'instruction en langage machine (par exemple en inversant la condition d'un test).
Regarde le code de ma signature. En fait, je boucle sur tous les pixels de l'écran (320x200 pixels). Arrivé au dernier pixel (en bas à droite de l'écran, je remonte tout en haut), donc pour savoir si je suis arrivé en bas, je regarde si mon registre de compteur CX est arrivé à 320 * 200 = 64000 = FA00h. Si je veux modifier le programme pour qu'il ne fasse que la moitié de l'acran, il me faut changer la valeur FA00h en 7D00h. En instruction machine, le test est:
  1. 81F900FA CMP CX, FA00h
  2. 7502 JNZ +02h

CMP est l'instruction qui compare le contenu de CX avec FA00h. Si c'est égal, le registre des flag est mis à jour, et le bit Z (Z pour le flag zéro) est mis à 1, sinon il est mis à 0. L'instruction JNZ +02h teste si le flag Z est est à 1. Si c'est le cas, elle fait ajouter +2 dans le registre IP. Et donc pour le CPU, la prochaine instruction n'est pas la suivante mais celle située 2 octets plus loin (l'instruction XOR CH,CH prend 2 octets, donc, c'est comme un goto après le xor).
Petite remarque, XOR CH, CH, c'est CH = CH XOT CH, où XOR est le OU exclusif. Et si on fait un OU exclusif d'une même valeur, on obtient sur chaque bit 0, donc ça permet de mettre CH à 0. Ce code est équivalent à MOV CH, 00h.
Bref, comme je l'ai indiqué, les 2 instructions qui nous intéresse donnent en binaire: 81 F9 00 FA 75 02, où 75 02 est le JNZ +02.
Donc, il me suffit de changer directement en binaire le 00 FA en 00 7D, et voilà, seulement la moitié de l'écran est utilisé (81 F9 00 7D 75 02).
Bon, je ne vais pas expliquer comment cracker un programme, le but c'est juste de comprendre comment fonctionne une machine au plus bas niveau pour des programme de haut niveau.

Citation :
J'aimerais juste voir à quoi ça ressemble. Etant donné que je ne connais pas l'assembleur, le mieux pour moi est d'essayer un éditeur hexadécimal ? Sur une .DLL , par exemple ?

En fait, la difficulté, c'est l'apprentissage de l'assembleur, parce que comme c'est très proche du matériel, ce n'est pas le langage qui est complexe (car ce n'est finalement que comme de l'encodage de caractères en un peu plus poussé), c'est l'utilisation du jeu d'instruction d'un processeur dans une architecture matérielle précise qui l'est.
a c 232 L Programmation
21 Octobre 2008 09:48:05

Juste un truc vis à vis de Vista, c'est pas un problème de droits pour qu'il t'empèche certains trucs ? En exécutant en tant qu'admin, ça passe pas ?!
21 Octobre 2008 18:36:00

Apparemment, y a cette option que pour les exécutables purs, .exe.

Citation :
Oui, mais avec la commande DEBUG, tu peux exécuter du langage machine dans ton .bat (par redirection avec un fichier). A partir du moment où tu peux coder en langage machine, tu t'adresses directement au CPU, donc tu peux théoriquement (parce qu'en pratique, ce n'est pas simple ;)  ) tout faire. C'est pour ça que les fichier .bat peuvent embarquer des virus.
C'est sûr qu'en batch sans utilisation de DEBUG, on est très rapidement limité (même en théorie ;)  ).

Oki, je vois ce que tu veux dire. Utilisation d'un langage dans un autre.

Citation :
En fait, la difficulté, c'est l'apprentissage de l'assembleur, parce que comme c'est très proche du matériel, ce n'est pas le langage qui est complexe (car ce n'est finalement que comme de l'encodage de caractères en un peu plus poussé), c'est l'utilisation du jeu d'instruction d'un processeur dans une architecture matérielle précise qui l'est.

Ok ;)  Juste comme ça, tu connais un cours qui commence par la base ? (pas genre developpez.com)

Merci, je vais tester l'éditeur hexa pour voir, donc finalement, on peut TOUT voir vraiment? Intéressant..

J'ai essayé avec un exe que j'avais fait avec visual++. Et en caractère, ça me met pas ce que j'attendais (on ne voit pas le programme tel qu'il a été écrit). Normal ? Il y a une traduction lorsqu'on déboggue le programme ou ..? :D 

Merci

a b L Programmation
21 Octobre 2008 20:42:50

Citation :
Juste un truc vis à vis de Vista, c'est pas un problème de droits pour qu'il t'empèche certains trucs ? En exécutant en tant qu'admin, ça passe pas ?

Déjà sous win XP ils ont bloqué l'utilisation du clavier (les deux interruptions), alors ça ne m'étonnerait pas qu'ils aient bloqués le plein écran, ça donne l'impression que l'on n'est plus sous DOS (on cache bien la poussière sous le tapis :D  ).

Citation :
Apparemment, y a cette option que pour les exécutables purs, .exe.

mais avec les vieux exe de type DOS, je pense que ça doit être pareil (sinon ça doit être facilement contournable).

Citation :
Ok ;)  Juste comme ça, tu connais un cours qui commence par la base ? (pas genre developpez.com)

Non désolé. Dans tous les cas il faut lire beaucoup de doc, mais je pense qu'il doit existe de bons tutoriaux. :) 

Citation :
Merci, je vais tester l'éditeur hexa pour voir, donc finalement, on peut TOUT voir vraiment? Intéressant..

En théorie oui, mais il faut savoir comment les données sont structurées .

Citation :
J'ai essayé avec un exe que j'avais fait avec visual++.

Tu as programmé en C ?
Lors de la compilation, le code C est transformé en assembleur, et pour les .exe, il faut ajouter l'en-tête. Par contre, lorsque tu compile et que tu lances en débug (en mettant un point d'arrêt), tu peux faire un clic droit sur le code pour voir à quel code assembleur correspond une ligne de code C.

Citation :
Et en caractère, ça me met pas ce que j'attendais (on ne voit pas le programme tel qu'il a été écrit).

Je n'ai pas compris.
21 Octobre 2008 21:35:19

Hellow,

Citation :
Non désolé. Dans tous les cas il faut lire beaucoup de doc, mais je pense qu'il doit existe de bons tutoriaux. :) 

Oki, je ferai de petites recherches, quand l'occasion se présentera ;) 

Citation :
Tu as programmé en C ?
Lors de la compilation, le code C est transformé en assembleur, et pour les .exe, il faut ajouter l'en-tête. Par contre, lorsque tu compile et que tu lances en débug (en mettant un point d'arrêt), tu peux faire un clic droit sur le code pour voir à quel code assembleur correspond une ligne de code C.

Si on peut appeler ça programmer. Tu m'avais aidé. Voilà le sujet ;)  : http://www.infos-du-net.com/forum/267211-21-tableaux-po...
Tiens d'ailleurs, le fameux /0 en C correspond à 0x00? Fait longtemps que j'ai pas fait de C, même si c'était de très bas niveau.
J'avais tenté de ressayer, mais je commençais à trouver ça trop compliqué entre autres avec les fonctions concernant le buffer (getchar ..). Je m'y remettrai sûrement (enfin si je suis pris en IUT, et vu comment commencent mes notes de maths de cette année de TS ^^)

Citation :
Je n'ai pas compris.

Bah, tu vois dans le lien que je t'ai donné, le "programme" jeu.exe que j'avais fait.
Si je l'édite, je ne vois pas les fonctions et tout comme j'avais tapé en C, je suppose que c'est normal ?
Donc c'est en assembleur ? Et pas en binaire ou hexa..
Sinon je re-vérifierai si je ne me suis tout simplement pas trompé quelque part. Je vais regarder si ça correspond à de l'assembleur même si j'y connais rien. Je suppose déjà que c'est plus gros qu'avec le C, l'assembleur.

Merci ;) 
a b L Programmation
22 Octobre 2008 20:22:42

Citation :
Tiens d'ailleurs, le fameux /0 en C correspond à 0x00?

Oui, 0x00 est équivalent à '\0', c'est donc bien l'octet nul qui indique une fin de chaîne de caractères en C.

Citation :
Si je l'édite, je ne vois pas les fonctions et tout comme j'avais tapé en C, je suppose que c'est normal ?

Oui parce que les noms de fonctions et de variables sont remplacés par des adresses mémoires, parce que si tu trouvais les noms de fonctions telles que tu les as écrite, il faudrait qu'un programme lise les caractères, l'analyse, fasse des recherche en mémoire pour savoir où ça se trouve, etc. C'est ce qui est fait par un langage interprété, mais du coup ça fait ramer un peu la machine, car il y a l'analyse du source.
En assembleur, l'appel à une fonction, c'est un CALL <adresse relative à la position courante>. Pour une variable, c'est juste une adresse mémoire dans laquelle on lit ou écrit la valeur.

Citation :
Donc c'est en assembleur ? Et pas en binaire ou hexa..

On peut presque dire que mathématiquement il y a une bijection entre le langage assembleur et le langage machine binaire, c'est-à-dire que pour tout programme assembleur, il existe un unique programme machine, et inversement (dans le cas où par assembleur, j'entends l'assembleur sans espace, sans commentaire, et sans nom de variable).
Donc on peut faire un abus de langage en parlant d'assembleur lorsqu'on parle de langage machine puisque le passage de l'un à l'autre se fait simplement (comme pour le passage du point de code à l'UTF-8 et inversement ;)  ). Et c'est aussi comme faire l'abus de langage de parler de données binaires lorsqu'on les représente en hexadécimal.

Citation :
Sinon je re-vérifierai si je ne me suis tout simplement pas trompé quelque part. Je vais regarder si ça correspond à de l'assembleur même si j'y connais rien. Je suppose déjà que c'est plus gros qu'avec le C, l'assembleur.

Oui tu peux compter une dizaine de ligne assembleur pour une ligne de code C (enfin ça dépend de la ligne de code C ;)  ).
22 Octobre 2008 23:01:17

Citation :
On peut presque dire que mathématiquement il y a une bijection entre le langage assembleur et le langage machine binaire, c'est-à-dire que pour tout programme assembleur, il existe un unique programme machine, et inversement (dans le cas où par assembleur, j'entends l'assembleur sans espace, sans commentaire, et sans nom de variable).
Donc on peut faire un abus de langage en parlant d'assembleur lorsqu'on parle de langage machine puisque le passage de l'un à l'autre se fait simplement (comme pour le passage du point de code à l'UTF-8 et inversement ;)  ). Et c'est aussi comme faire l'abus de langage de parler de données binaires lorsqu'on les représente en hexadécimal.

En fait, ce que je voulais dire, peut-être ce que t'as compris ^^
On voit le code hexadécimal, mais on voit le code hexadécimal d'un programme en assembleur (en C à la base) ou autre chose ?
Je suppose que tu y as déjà répondu mais bon :D 

Sinon, d'accord, je referai des tests pour voir un peu comment ça se passe.

Merci ;) 
a b L Programmation
22 Octobre 2008 23:07:40

Oui quand tu regardes le fichier .exe avec un éditeur hexa, tu regardes effectivement le code asembleur en langage machine avec en plus l'en-tête de fichier exe.
23 Octobre 2008 16:55:10

Oki, merci ;) 

Je vais relire un peu tout ce que tu m'as dit, l'essayer et je reviendrai ;) 

Encore merci !
14 Décembre 2008 17:50:42

Bonsoir CRicky,

Quoi de Neuf ?

Je peux te poser des questions sur un sujet un peu différent. Une autre personne m'aidait, mais elle est très très occupée, donc si tu as le temps ;) 

Merci, @++
a b L Programmation
14 Décembre 2008 19:46:31

Pose la question au lieu de me demander si tu peux la poser :D 
14 Décembre 2008 23:10:23

Oki,

Alors je te copie un bout de conversation avec lui, et ma réponse.

Si tu peux m'en dire plus ;) 

(La conversation se passe suite à un sujet que j'ai fait sur les services).

Une de ses réponses :

Citation :
Je vais reprendre une explication globale mais fort rapide.
un processeur a la capacité d'effectuer des instructions. (manipuler des registres du cpu (rien avoir avec le registre windows, on est que dans le hardware ici l'OS est pas la), faire une addition, une soustraction, aller lire et écrire en ram ...).
Les ingénieurs aillant crée ses processeurs ce sont dit que tout le monde ne pouvait pas faire n'importe quoi, ils ont donc décidé de créer des anneaux, du 0 au 3. l'anneau 0 permet d'effectuer toutes les instructions dont le processeur est capable, l'anneau 1 n'en connait que quelques unes en moins, l'anneau 2 en connait encore quelques une en moins que l'anneau 1 et l'anneau 3 accède a quelques instructions en moins que l'anneau 2).
Bref tout va pour le mieu dans le meilleur des mondes dans le monde du silicone heuuu silicium pardon ... (on mettra ca sur le compte du sommeil).

Et un beau jour naquis l'os et le hardware vit que cela était bon (non non ce n'est en rien biblique promis tongue )
L'OS se dit: je n'ai pas besoins d'autant de restriction, je vais me contenter de deux d'entre elle, les deux extrêmes (bon en fait c'est pas vrai, au debut les processeurs n'avait que deux anneaux et si les OS ont continuer a en garder que deux c'est par retrocompatibilite, faudra aller dire a bill que les processeurs avec deux anneaux ne font pas tourner vista ...).
L'OS qui tend que maintenant est tres tres petit n'utilise actuellement que l'anneau 0, c'est le kernel.

Apres l'OS basique les géants de wall stress (qui ne voulait pas faire comme leur arrière grand père en 29) se sont dis qu'il fallait que l'ordinateur se vende a tout le monde et donc qu'il soit bien plus accessible.
Naquis les programmes utilisables sans doctorat en physique/mathematique/electronique ... puis vint la souris et tous les petits basard user friendly que nous connaissons aujourd'hui.
Oui mais a l'époque nous étions bête et méchant et (bien que nous n'aillons pas trop changer) nous utilisions encore uniquement le ring0 et rien d'autre.
Avec l'apparition des reseaux et des premiers virus/vers/malware l'utilisation du ring3 est venue petit a petit.

Puis wall stress (l'endroit ou les actions des groupes phramaceutique creve le plafond car la moitie des gens de wall stress est accro au calment et autre antidepresseur) a vu qu'il n'etais pas le seul a gagner de l'argent et qu'une hierarchie des utilisateurs de l'ordinateur s'organisait.
De la naquis les différentes sessions utilisateurs (codee dans l'OS présente uniquement par du code et non de maniere hardware) qui fure incorporée dans les programmes present dans le ring3.

Pour faire simple, beaucoup d'americain considere que l'OS c'est tout ce qui est dans le ring0 et que le reste n'est que logiciel (y compris l'interface graphique et les logiciels manipulant l'OS) ce qui cela dis est assez malin.


Ma question/réponse :

Citation :
Yop,

Merci pour ce résumé Wink

Finalement, le topic est juste ?

Donc pour résumer :

Ring 3 = Userland = Windows = Sessions
Ring 0 = Kernel (drivers de type boot ?)

C'est bien ça ?

Donc le ring est décerné par le processeur :

- le 0 au kernel et aux drivers au boot
- le 3 à Windows, sessions, interface, logiciels ..

Donc la session système est bien en ring3 et pas en ring 0. Seul le type d'utilisateur différencie les restrictions, mais il n'y a pas de haut ou bas en ring3, mais simplement le ring3.
Ainsi Admin et System sont en ring3, mais les restrictions ne sont pas les mêmes, c'est exact ?

Les drivers de boot sont-ils à assimiler au kernel ? Le seul moyen d'être en ring0 est donc seulement de démarrer très tôt, puisque cela n'est pas géré par les sessions. Alors qu'un service en start=3 aura les droits système (car c'est une question de session)

Voilou ! Merci de me dire si j'ai fait des erreurs ou des maladresses dans ce que je viens de dire ?


Merci ! :) 
a b L Programmation
15 Décembre 2008 21:35:57

Pour moi, les rings processeurs ne sont utiles que pour limiter la casse, en isolant au maximum tout ce qui ne doit pas avoir de "collision" (thread, session, jeux d'instructions 32/64bits, etc).
Si rajouter un niveau de privilège ne sert pas à isoler des fonctionnements, alors ça ne sert à rien (trop de sécurité tue la sécurité :)  ).

Bref, sinon les niveaux introduites dans les intels à partir du 286:
0: noyau système (gestion mémoire et ordonnanceur).
1: services systèmes (gestions de périphériques de base), ne doit pas intervenir dans l'ordonnancement.
2: extensions système (gestions de services systèmes). Isolation d'une couche applicative considérée de bas niveau. L'intérêt de cette couche me semble limitée, car l'importance de l'isolation pour le bon fonctionnement du système me parait dérisoire.
3: Applications, ne doit pas modifier le fonctionnement de l'OS.

Après, on peut concevoir des processeurs/OS avec une multitude de couches (c'est à la mode y compris au niveau applicatif :)  ), mais il ne faut pas en abuser (la sur-sécurité peut poser des problèmes de performance).
A un niveau plus élevé, et plus connu, on retrouve le problème avec la gestion mémoire d'un programme entre le choix d'une gestion libre, performante mais dangereuse (en C++ basique), et le choix d'une gestion de référencements (machine virtuelle en Java ou C#) sure mais peuvent poser des problème de performance dans des cas particuliers.
16 Décembre 2008 10:33:42

Hello :) 

Citation :
Si rajouter un niveau de privilège ne sert pas à isoler des fonctionnements, alors ça ne sert à rien (trop de sécurité tue la sécurité :)  ).

Oui, je suis d'accord, c'est logique.

Pour ce qui est des rings, il me semblait que l'OS n'utilisait que le 0 et le 3 ?
"Les processeurs de la famille x86 implémentent quatre anneaux de privilèges mais dans la grande majorité des cas, seuls deux sont réellement exploités par les systèmes d'exploitation actuels (tel que Microsoft Windows ou les dérivés d'UNIX).

Ces deux anneaux de protections sont le ring0, l'anneau de protection ayant le plus de privilèges, et qui est l'anneau sous lequel fonctionne le cœur du système d'exploitation ainsi que le ring3 sous lequel fonctionnent les logiciels utilisateurs.

La transition d'un mode à un autre est assurée par l'instruction en langage assembleur SYSENTER."
Donc c'est bien ce que tu dis, mais seulement deux sont exploités (quel est l'intérêt d'en mettre 4 alors :D  )

Sinon es-tu à peu près d'accord avec ceci ? (j'aimerais bien savoir pour les drivers de boot = kernel je suppose)

Citation :
Ring 3 = Userland = Windows = Sessions
Ring 0 = Kernel (drivers de type boot ?)

C'est bien ça ?

Donc le ring est décerné par le processeur :

- le 0 au kernel et aux drivers au boot
- le 3 à Windows, sessions, interface, logiciels ..

Donc la session système est bien en ring3 et pas en ring 0. Seul le type d'utilisateur différencie les restrictions, mais il n'y a pas de haut ou bas en ring3, mais simplement le ring3.
Ainsi Admin et System sont en ring3, mais les restrictions ne sont pas les mêmes, c'est exact ?

Les drivers de boot sont-ils à assimiler au kernel ? Le seul moyen d'être en ring0 est donc seulement de démarrer très tôt, puisque cela n'est pas géré par les sessions. Alors qu'un service en start=3 aura les droits système (car c'est une question de session)


Merci beaucoup, toujours des réponses très constructives :) 

J'aurais beaucoup aimé faire un cours sur les Rings et les Session, car cela ferait une belle cohérence entre tous les cours (le forum dont je t'avais parlé, je ne sais pas si tu te souviens), sans rentrer dans détails techniques bien-sûr !
    • Premier
    • Précédent
    • 3 / 8
    • 4
    • 5
    • 6
    • 7
    • Plus de pages
    • Suivant
    • Dernier
      • 1
      • 2
      • 3 / 8
      • 4
      • 5
      • 6
      • 7
      • 8
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS