Bon, je vais essayer de répondre, mais je ne garantis rien, si quelqu'un de plus expérimenté veut confirmer/infirmer...
Code :
- int swallow_redpill () {
- unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3"; /* les 3 premiers char de rpill corrsponde à 0X0F010D, code de l'instruction SIDT */
- *((unsigned*)&rpill[3]) = (unsigned)m; /* là, c'est tricky: on écrese les 0 de queue de rpill par l'adresse de m, qui va contenir la valeur du registre IDTR */
- ((void(*)())&rpill)(); /* appel effectif de l'instruction IDTR en spécifiant l'adresse utilisée pour le mémoriser la valeur du registre en question */
- return (m[5]>0xd0) ? 1 : 0; /* on compare la valeur renvoyée reflétant le contenu du registre en question */
- /* s'il est supérieure à une certaine valeur, c'est que c'est l'adresse a été fournie par une machine virtuelle, donc qu'on tourne sur un OS virtuel. Apparemment, ce code dépend de la machine virtuelle, d'où sa conclusion qu'on peut l'utiliser pour faire du fingerprinting (un peu comme nmap) */
- }
|
Conclusion: en fait, elle bidouille du code en C en pour appeller l'instruction en question en passant par son code hexa (elle concatène l'instruction avec son paramètre, et marque la fin avec '\xc3' dans rpill), sans passer par de l'assembleur : rpill représente l'instruction qui va être appellée, ensuite elle compare la valeur retournée par l'instrcution à une valeur limite pour vérifier si on tourne sur une VMM
Je ne sais pas pourquoi elle n'utilise pas de l'assembleur.
Message édité par simple_stupid le 08-07-2006 à 23:48:39