qu'est ce que "savoir émuler le code" ?
qu'est ce que "savoir émuler le code" ?
qu'est ce que "savoir émuler le code" ?
qu'est ce que "savoir émuler le code" ?
qu'est ce que "savoir émuler le code" ?
qu'est ce que "savoir émuler le code" ?
j'ai une questio plutôt technique pour nos boss de la programmation
antiviral:
qu'est ce que "savoir émuler le code" ?
j'ai une questio plutôt technique pour nos boss de la programmation
antiviral:
qu'est ce que "savoir émuler le code" ?
j'ai une questio plutôt technique pour nos boss de la programmation
antiviral:
qu'est ce que "savoir émuler le code" ?
Pfff... où commencer? :-)
Alors, commençons au tout début: un virus est un programme, et
un programme est une série d'instructions (pour le processeur
dans le cas d'un virus binaire; mais, plus généralement, une
instruction peut très bien être destinée aussi à un interprète de
scripts par exemple).
Dans la préhistoire virale, quand on voulait détecter un virus, on
regardait de quelles instructions il était constitué. A partir de cela
on créait une "signature", c'est-à-dire une chaîne d'octets
représentant une partie des instructions du virus. Je vous donne
un exemple: pour le virus Cascade, la signature utilisée par McAfee
était 141$FL, ce qui correspondait au bout de code suivant:
xor [si], si
xor [si], sp
inc si
dec sp
Evidemment, il fallait choisir la signature de manière à ne pas
provoquer de fausses alerts: il fallait donc une signature dont
on était à peu près sûr qu'elle n'apparaîtrait jamais dans un
programme propre. Il fallait aussi que la signature puisse identifier
le virus à chaque fois, et pas seulement un exemplaire particulier du
virus.
Seulement voilà, quelques années après les débuts sont apparus les
virus polymorphes. Ces virus sont capables de changer d'apparence.
Une seule signature ne suffisait donc plus; théoriquement il aurait
fallu une signature pour chaque version possible du virus. Or même
dans le cas d'un changement d'apparence réalisé par un simple
cryptage xor avec un seul octet on se serait retrouvé avec
255 signatures.
On a donc "exploité" une "faille" dans les virus polymorphes: en
effet, leur corps ne change pas - c'est uniquement la manière dont le
corps est crypté et le code de décryptage qui changent. Donc, s'il y
a une partie constante, on peut créer une signature.
Mais pour pouvoir appliquer la recherche de signatures il a d'abord
fallu trouver un moyen pour décrypter le corps du virus. Le meilleur
moyen de réaliser cela était l'émulation, c'est-à-dire qu'on dotait
l'antivirus d'un moteur capable de simuler en partie un ordinateur.
En fait un programme est donc exécuté à l'intérieur de l'antivirus,
sans aucun danger pour le vrai système à l'extérieur.
Donc, les virus se sont décryptés eux-mêmes et l'antivirus n'avait
plus qu'à chercher la signature. :-)
Donc l'émulation sert d'une part à la détection de virus qu'on ne
peut pas détecter avec une simple chaîne d'octets.
D'autre part,
l'émulation permet d'obtenir au fur et à mesure de son progrès des
informations sur le comportement d'un programme, et ces informations
peuvent ensuite être utilisées pour l'analyse heuristique (c'est
l'analyse heuristique dynamique par opposition à l'analyse statique
qui consiste à rechercher des séquences de code sous forme de chaîne
et à effectuer d'autres analyses... statiques quoi).
Quant à savoir émuler correctement le code: une bonne émulation n'est
pas facile à programmer et elle peut être contournée assez facilement.
Il y a donc des différences de qualité entre les différents
émulateurs.
Dans ce cas précis de Dr. Web contre Kaspersky, il s'agissait je crois
de l'émulation de l'instruction idiv qui sert à diviser deux nombres.
Il faut prendre en compte par exemple que l'on ne peut pas diviser par
zéro, que le résultat peut être trop grand pour résider dans la
mémoire interne du processeur, etc.
Pfff... où commencer? :-)
Alors, commençons au tout début: un virus est un programme, et
un programme est une série d'instructions (pour le processeur
dans le cas d'un virus binaire; mais, plus généralement, une
instruction peut très bien être destinée aussi à un interprète de
scripts par exemple).
Dans la préhistoire virale, quand on voulait détecter un virus, on
regardait de quelles instructions il était constitué. A partir de cela
on créait une "signature", c'est-à-dire une chaîne d'octets
représentant une partie des instructions du virus. Je vous donne
un exemple: pour le virus Cascade, la signature utilisée par McAfee
était 141$FL, ce qui correspondait au bout de code suivant:
xor [si], si
xor [si], sp
inc si
dec sp
Evidemment, il fallait choisir la signature de manière à ne pas
provoquer de fausses alerts: il fallait donc une signature dont
on était à peu près sûr qu'elle n'apparaîtrait jamais dans un
programme propre. Il fallait aussi que la signature puisse identifier
le virus à chaque fois, et pas seulement un exemplaire particulier du
virus.
Seulement voilà, quelques années après les débuts sont apparus les
virus polymorphes. Ces virus sont capables de changer d'apparence.
Une seule signature ne suffisait donc plus; théoriquement il aurait
fallu une signature pour chaque version possible du virus. Or même
dans le cas d'un changement d'apparence réalisé par un simple
cryptage xor avec un seul octet on se serait retrouvé avec
255 signatures.
On a donc "exploité" une "faille" dans les virus polymorphes: en
effet, leur corps ne change pas - c'est uniquement la manière dont le
corps est crypté et le code de décryptage qui changent. Donc, s'il y
a une partie constante, on peut créer une signature.
Mais pour pouvoir appliquer la recherche de signatures il a d'abord
fallu trouver un moyen pour décrypter le corps du virus. Le meilleur
moyen de réaliser cela était l'émulation, c'est-à-dire qu'on dotait
l'antivirus d'un moteur capable de simuler en partie un ordinateur.
En fait un programme est donc exécuté à l'intérieur de l'antivirus,
sans aucun danger pour le vrai système à l'extérieur.
Donc, les virus se sont décryptés eux-mêmes et l'antivirus n'avait
plus qu'à chercher la signature. :-)
Donc l'émulation sert d'une part à la détection de virus qu'on ne
peut pas détecter avec une simple chaîne d'octets.
D'autre part,
l'émulation permet d'obtenir au fur et à mesure de son progrès des
informations sur le comportement d'un programme, et ces informations
peuvent ensuite être utilisées pour l'analyse heuristique (c'est
l'analyse heuristique dynamique par opposition à l'analyse statique
qui consiste à rechercher des séquences de code sous forme de chaîne
et à effectuer d'autres analyses... statiques quoi).
Quant à savoir émuler correctement le code: une bonne émulation n'est
pas facile à programmer et elle peut être contournée assez facilement.
Il y a donc des différences de qualité entre les différents
émulateurs.
Dans ce cas précis de Dr. Web contre Kaspersky, il s'agissait je crois
de l'émulation de l'instruction idiv qui sert à diviser deux nombres.
Il faut prendre en compte par exemple que l'on ne peut pas diviser par
zéro, que le résultat peut être trop grand pour résider dans la
mémoire interne du processeur, etc.
Pfff... où commencer? :-)
Alors, commençons au tout début: un virus est un programme, et
un programme est une série d'instructions (pour le processeur
dans le cas d'un virus binaire; mais, plus généralement, une
instruction peut très bien être destinée aussi à un interprète de
scripts par exemple).
Dans la préhistoire virale, quand on voulait détecter un virus, on
regardait de quelles instructions il était constitué. A partir de cela
on créait une "signature", c'est-à-dire une chaîne d'octets
représentant une partie des instructions du virus. Je vous donne
un exemple: pour le virus Cascade, la signature utilisée par McAfee
était 141$FL, ce qui correspondait au bout de code suivant:
xor [si], si
xor [si], sp
inc si
dec sp
Evidemment, il fallait choisir la signature de manière à ne pas
provoquer de fausses alerts: il fallait donc une signature dont
on était à peu près sûr qu'elle n'apparaîtrait jamais dans un
programme propre. Il fallait aussi que la signature puisse identifier
le virus à chaque fois, et pas seulement un exemplaire particulier du
virus.
Seulement voilà, quelques années après les débuts sont apparus les
virus polymorphes. Ces virus sont capables de changer d'apparence.
Une seule signature ne suffisait donc plus; théoriquement il aurait
fallu une signature pour chaque version possible du virus. Or même
dans le cas d'un changement d'apparence réalisé par un simple
cryptage xor avec un seul octet on se serait retrouvé avec
255 signatures.
On a donc "exploité" une "faille" dans les virus polymorphes: en
effet, leur corps ne change pas - c'est uniquement la manière dont le
corps est crypté et le code de décryptage qui changent. Donc, s'il y
a une partie constante, on peut créer une signature.
Mais pour pouvoir appliquer la recherche de signatures il a d'abord
fallu trouver un moyen pour décrypter le corps du virus. Le meilleur
moyen de réaliser cela était l'émulation, c'est-à-dire qu'on dotait
l'antivirus d'un moteur capable de simuler en partie un ordinateur.
En fait un programme est donc exécuté à l'intérieur de l'antivirus,
sans aucun danger pour le vrai système à l'extérieur.
Donc, les virus se sont décryptés eux-mêmes et l'antivirus n'avait
plus qu'à chercher la signature. :-)
Donc l'émulation sert d'une part à la détection de virus qu'on ne
peut pas détecter avec une simple chaîne d'octets.
D'autre part,
l'émulation permet d'obtenir au fur et à mesure de son progrès des
informations sur le comportement d'un programme, et ces informations
peuvent ensuite être utilisées pour l'analyse heuristique (c'est
l'analyse heuristique dynamique par opposition à l'analyse statique
qui consiste à rechercher des séquences de code sous forme de chaîne
et à effectuer d'autres analyses... statiques quoi).
Quant à savoir émuler correctement le code: une bonne émulation n'est
pas facile à programmer et elle peut être contournée assez facilement.
Il y a donc des différences de qualité entre les différents
émulateurs.
Dans ce cas précis de Dr. Web contre Kaspersky, il s'agissait je crois
de l'émulation de l'instruction idiv qui sert à diviser deux nombres.
Il faut prendre en compte par exemple que l'on ne peut pas diviser par
zéro, que le résultat peut être trop grand pour résider dans la
mémoire interne du processeur, etc.
Au fait il est où cet article, t'as un lien?
Au fait il est où cet article, t'as un lien?
Au fait il est où cet article, t'as un lien?
Débat : l'apparence est-elle la forme ?
C'est bon, grâce à Nick je viens de le lire. C'est nul.
Faut avouer aussi que ces temps-ci c'est pas folichon la lecture de ce NG.
Débat : l'apparence est-elle la forme ?
C'est bon, grâce à Nick je viens de le lire. C'est nul.
Faut avouer aussi que ces temps-ci c'est pas folichon la lecture de ce NG.
Débat : l'apparence est-elle la forme ?
C'est bon, grâce à Nick je viens de le lire. C'est nul.
Faut avouer aussi que ces temps-ci c'est pas folichon la lecture de ce NG.
Bah, c'est une idée intéressante. Au lieu de comparer les interfaces,
comparer l'émulation. :-)
Bah, c'est une idée intéressante. Au lieu de comparer les interfaces,
comparer l'émulation. :-)
Bah, c'est une idée intéressante. Au lieu de comparer les interfaces,
comparer l'émulation. :-)
Désolé de poser cette question,
mais peut-on en déduire qu'un AV qui émule correctement le code est
un bon AV au niveau programmation ?
dans ce cas, quels AVs sortent du lot ? (sur le plan de la qualité de
prog)
Dr.Web ?
AVP ?
NOD32 ?
J'ai l'impression ,grâce à vos explications, que l'émulation est
difficile à réaliser...
cela réduit donc le nombre des AVs bien réalisés me semble t-il...
Désolé de poser cette question,
mais peut-on en déduire qu'un AV qui émule correctement le code est
un bon AV au niveau programmation ?
dans ce cas, quels AVs sortent du lot ? (sur le plan de la qualité de
prog)
Dr.Web ?
AVP ?
NOD32 ?
J'ai l'impression ,grâce à vos explications, que l'émulation est
difficile à réaliser...
cela réduit donc le nombre des AVs bien réalisés me semble t-il...
Désolé de poser cette question,
mais peut-on en déduire qu'un AV qui émule correctement le code est
un bon AV au niveau programmation ?
dans ce cas, quels AVs sortent du lot ? (sur le plan de la qualité de
prog)
Dr.Web ?
AVP ?
NOD32 ?
J'ai l'impression ,grâce à vos explications, que l'émulation est
difficile à réaliser...
cela réduit donc le nombre des AVs bien réalisés me semble t-il...
Désolé de poser cette question, mais peut-on en déduire qu'un AV qui
émule correctement le code est un bon AV au niveau programmation ?
dans ce cas, quels AVs sortent du lot ? (sur le plan de la qualité de
prog)
Dr.Web ?
AVP ?
NOD32 ?
J'ai l'impression ,grâce à vos explications, que l'émulation est
difficile à réaliser...
Désolé de poser cette question, mais peut-on en déduire qu'un AV qui
émule correctement le code est un bon AV au niveau programmation ?
dans ce cas, quels AVs sortent du lot ? (sur le plan de la qualité de
prog)
Dr.Web ?
AVP ?
NOD32 ?
J'ai l'impression ,grâce à vos explications, que l'émulation est
difficile à réaliser...
Désolé de poser cette question, mais peut-on en déduire qu'un AV qui
émule correctement le code est un bon AV au niveau programmation ?
dans ce cas, quels AVs sortent du lot ? (sur le plan de la qualité de
prog)
Dr.Web ?
AVP ?
NOD32 ?
J'ai l'impression ,grâce à vos explications, que l'émulation est
difficile à réaliser...
2. La complexité.
Il existe des centaines d'instructions pour le processeur, avec
plusieurs modes d'accès à la mémoire différents, avec des instructions
différentes pour plusieurs types d'opérations: opérations "normales",
coprocesseur pour opérations mathématiques, opérations MMX, SSE et
3Dnow.
2. La complexité.
Il existe des centaines d'instructions pour le processeur, avec
plusieurs modes d'accès à la mémoire différents, avec des instructions
différentes pour plusieurs types d'opérations: opérations "normales",
coprocesseur pour opérations mathématiques, opérations MMX, SSE et
3Dnow.
2. La complexité.
Il existe des centaines d'instructions pour le processeur, avec
plusieurs modes d'accès à la mémoire différents, avec des instructions
différentes pour plusieurs types d'opérations: opérations "normales",
coprocesseur pour opérations mathématiques, opérations MMX, SSE et
3Dnow.