¿se puede averiguar si estamos en una maquina virtual?

24/10/2005 - 23:03 por jorge | Informe spam
¿hay alguna manera de que algun programa pueda averiguar de alguna forma si
se está ejecutando en una maquina real, o en una maquina virtual como vmware
o Virtual PC?

P.D.:Tengo conocimientos de programacion e incluso hice algun pinito con
ensamblador.

jorge

Preguntas similare

Leer las respuestas

#1 JM Tella Llop [MVP Windows]
24/10/2005 - 23:13 | Informe spam
Se puede perfectamente por el software llegar a saber esto.

He visto varios trucos de programacion pero que me parecen chapuceros:
realizar un programa en C:, situar un manejador de excpeciones y ejeuctar
operaciones no validas -y privilegiadas- analizando posteriormente el codigo
atrapado en el manejador. Esto codigos, en ciertas instrucciones tan simples
como las IN / OUT normalmente reciben codigos de error diferentes a los que
realmente se darian en un sistema operativo en una maquina real.

La manera mas elegante por parte del software de hacerlo, sería si
tuviesemos una instruccion no privilegiada (es decir, de las que se pueden
ejecutar en modo user -ring3- y que por tanto no disparen ningun manejador
de excepcion) y que esta nos devolviese datos que fuesen diferentes en una
maquina real de una maquina virtual. Aunque no se si puede haber mas, al
menos la instruccion SIDT cumple las premisas anteriores. Esta instruccion
nos devuelve el contenido del registro de la 'interrupt descriptor table'
(IDTR).

Como solamente hay un registro IDTR y en el caso de una maquina virtual, hay
al menos dos sistemas operativos en ejecucion concurrentemente (el host y el
invitado) la maquina virtual necesita reasignar el IDTR del sistema
operativo invitado para no entrar en conflictos con la maquina host. En este
caso, cuando nuestro programa de prueba ejecute una instruccion SIDT, la
cual, al no ser privilegiada no provocará una excepcion (que atrape la
maquina virtual y por tanto pueda falsearnos el resultado dandonos el
original), y por tanto recibiremos un valor que al analizarlo podremos
comprobar que no es el esperado en una maquina "real".

Jose Manuel Tella Llop
MVP - Windows
(quitar XXX)
http://www.multingles.net/jmt.htm

Este mensaje se proporciona "como está" sin garantías de ninguna clase,
y no otorga ningún derecho.

This posting is provided "AS IS" with no warranties, and confers no
rights.
You assume all risk for your use.



"jorge" wrote in message
news:
¿hay alguna manera de que algun programa pueda averiguar de alguna forma
si se está ejecutando en una maquina real, o en una maquina virtual como
vmware o Virtual PC?

P.D.:Tengo conocimientos de programacion e incluso hice algun pinito con
ensamblador.

jorge



Respuesta Responder a este mensaje
#2 Leonardo Daniel Ulanosky
25/10/2005 - 00:11 | Informe spam
Muy interesante, tu propuesta.. y me has hecho sentir nostalgia.
Yo llegué a ver mucho de programación en Assembler, -creo
que no hay ni un foro ya para eso ya- manejaba de todo
hasta que salió W95, y ahi, si apareció un entorno gráfico serio
que me obligó por el trabajo a discontinuar todo aquello...
-el masm y el c++ de borland v3.1 fueron mis herramientas
hasta allá por el 94-

Se que el C del visual estudio u otros, te permite programar
en asm, pero me recomendarías un link o algo, para poder
volver a re-entrar en ese tema y poder al menos probar lo
que sugieres.?

Saludos y gracias.


"JM Tella Llop [MVP Windows]" escribió en el mensaje
news:uumqd$
Se puede perfectamente por el software llegar a saber esto.

He visto varios trucos de programacion pero que me parecen chapuceros:
realizar un programa en C:, situar un manejador de excpeciones y ejeuctar
operaciones no validas -y privilegiadas- analizando posteriormente el
codigo atrapado en el manejador. Esto codigos, en ciertas instrucciones
tan simples como las IN / OUT normalmente reciben codigos de error
diferentes a los que realmente se darian en un sistema operativo en una
maquina real.

La manera mas elegante por parte del software de hacerlo, sería si
tuviesemos una instruccion no privilegiada (es decir, de las que se pueden
ejecutar en modo user -ring3- y que por tanto no disparen ningun manejador
de excepcion) y que esta nos devolviese datos que fuesen diferentes en una
maquina real de una maquina virtual. Aunque no se si puede haber mas, al
menos la instruccion SIDT cumple las premisas anteriores. Esta instruccion
nos devuelve el contenido del registro de la 'interrupt descriptor table'
(IDTR).

Como solamente hay un registro IDTR y en el caso de una maquina virtual,
hay al menos dos sistemas operativos en ejecucion concurrentemente (el
host y el invitado) la maquina virtual necesita reasignar el IDTR del
sistema operativo invitado para no entrar en conflictos con la maquina
host. En este caso, cuando nuestro programa de prueba ejecute una
instruccion SIDT, la cual, al no ser privilegiada no provocará una
excepcion (que atrape la maquina virtual y por tanto pueda falsearnos el
resultado dandonos el original), y por tanto recibiremos un valor que al
analizarlo podremos comprobar que no es el esperado en una maquina "real".

Jose Manuel Tella Llop
MVP - Windows
(quitar XXX)
http://www.multingles.net/jmt.htm

Este mensaje se proporciona "como está" sin garantías de ninguna clase,
y no otorga ningún derecho.

This posting is provided "AS IS" with no warranties, and confers no
rights.
You assume all risk for your use.



"jorge" wrote in message
news:
¿hay alguna manera de que algun programa pueda averiguar de alguna forma
si se está ejecutando en una maquina real, o en una maquina virtual como
vmware o Virtual PC?

P.D.:Tengo conocimientos de programacion e incluso hice algun pinito con
ensamblador.

jorge







Respuesta Responder a este mensaje
#3 Antonio FD
25/10/2005 - 00:23 | Informe spam
msdn.microsoft.com

"Leonardo Daniel Ulanosky" escribió en el mensaje news:
Muy interesante, tu propuesta.. y me has hecho sentir nostalgia.
Yo llegué a ver mucho de programación en Assembler, -creo
que no hay ni un foro ya para eso ya- manejaba de todo
hasta que salió W95, y ahi, si apareció un entorno gráfico serio
que me obligó por el trabajo a discontinuar todo aquello...
-el masm y el c++ de borland v3.1 fueron mis herramientas
hasta allá por el 94-

Se que el C del visual estudio u otros, te permite programar
en asm, pero me recomendarías un link o algo, para poder
volver a re-entrar en ese tema y poder al menos probar lo
que sugieres.?

Saludos y gracias.


"JM Tella Llop [MVP Windows]" escribió en el mensaje
news:uumqd$
Se puede perfectamente por el software llegar a saber esto.

He visto varios trucos de programacion pero que me parecen chapuceros:
realizar un programa en C:, situar un manejador de excpeciones y ejeuctar
operaciones no validas -y privilegiadas- analizando posteriormente el
codigo atrapado en el manejador. Esto codigos, en ciertas instrucciones
tan simples como las IN / OUT normalmente reciben codigos de error
diferentes a los que realmente se darian en un sistema operativo en una
maquina real.

La manera mas elegante por parte del software de hacerlo, sería si
tuviesemos una instruccion no privilegiada (es decir, de las que se pueden
ejecutar en modo user -ring3- y que por tanto no disparen ningun manejador
de excepcion) y que esta nos devolviese datos que fuesen diferentes en una
maquina real de una maquina virtual. Aunque no se si puede haber mas, al
menos la instruccion SIDT cumple las premisas anteriores. Esta instruccion
nos devuelve el contenido del registro de la 'interrupt descriptor table'
(IDTR).

Como solamente hay un registro IDTR y en el caso de una maquina virtual,
hay al menos dos sistemas operativos en ejecucion concurrentemente (el
host y el invitado) la maquina virtual necesita reasignar el IDTR del
sistema operativo invitado para no entrar en conflictos con la maquina
host. En este caso, cuando nuestro programa de prueba ejecute una
instruccion SIDT, la cual, al no ser privilegiada no provocará una
excepcion (que atrape la maquina virtual y por tanto pueda falsearnos el
resultado dandonos el original), y por tanto recibiremos un valor que al
analizarlo podremos comprobar que no es el esperado en una maquina "real".

Jose Manuel Tella Llop
MVP - Windows
(quitar XXX)
http://www.multingles.net/jmt.htm

Este mensaje se proporciona "como está" sin garantías de ninguna clase,
y no otorga ningún derecho.

This posting is provided "AS IS" with no warranties, and confers no
rights.
You assume all risk for your use.



"jorge" wrote in message
news:
¿hay alguna manera de que algun programa pueda averiguar de alguna forma
si se está ejecutando en una maquina real, o en una maquina virtual como
vmware o Virtual PC?

P.D.:Tengo conocimientos de programacion e incluso hice algun pinito con
ensamblador.

jorge











Respuesta Responder a este mensaje
#4 Sygrama Software
25/10/2005 - 02:07 | Informe spam
Hola José Manuel:
Me parece haber visto algo en el foro de VirtualPC, acerca de preguntar a través de alguna función standard de API cuál es el procesador. En el caso de la máquina virtual responde "Microsoft". Para más precisiones, recurrir al foro microsoft.public.virtualpc (sólo en inglés).
Saludos
Claudia Podestá
Rosario - Argentina
"JM Tella Llop [MVP Windows]" escribió en el mensaje news:uumqd$
Se puede perfectamente por el software llegar a saber esto.

He visto varios trucos de programacion pero que me parecen chapuceros:
realizar un programa en C:, situar un manejador de excpeciones y ejeuctar
operaciones no validas -y privilegiadas- analizando posteriormente el codigo
atrapado en el manejador. Esto codigos, en ciertas instrucciones tan simples
como las IN / OUT normalmente reciben codigos de error diferentes a los que
realmente se darian en un sistema operativo en una maquina real.

La manera mas elegante por parte del software de hacerlo, sería si
tuviesemos una instruccion no privilegiada (es decir, de las que se pueden
ejecutar en modo user -ring3- y que por tanto no disparen ningun manejador
de excepcion) y que esta nos devolviese datos que fuesen diferentes en una
maquina real de una maquina virtual. Aunque no se si puede haber mas, al
menos la instruccion SIDT cumple las premisas anteriores. Esta instruccion
nos devuelve el contenido del registro de la 'interrupt descriptor table'
(IDTR).

Como solamente hay un registro IDTR y en el caso de una maquina virtual, hay
al menos dos sistemas operativos en ejecucion concurrentemente (el host y el
invitado) la maquina virtual necesita reasignar el IDTR del sistema
operativo invitado para no entrar en conflictos con la maquina host. En este
caso, cuando nuestro programa de prueba ejecute una instruccion SIDT, la
cual, al no ser privilegiada no provocará una excepcion (que atrape la
maquina virtual y por tanto pueda falsearnos el resultado dandonos el
original), y por tanto recibiremos un valor que al analizarlo podremos
comprobar que no es el esperado en una maquina "real".

Jose Manuel Tella Llop
MVP - Windows
(quitar XXX)
http://www.multingles.net/jmt.htm

Este mensaje se proporciona "como está" sin garantías de ninguna clase,
y no otorga ningún derecho.

This posting is provided "AS IS" with no warranties, and confers no
rights.
You assume all risk for your use.



"jorge" wrote in message
news:
¿hay alguna manera de que algun programa pueda averiguar de alguna forma
si se está ejecutando en una maquina real, o en una maquina virtual como
vmware o Virtual PC?

P.D.:Tengo conocimientos de programacion e incluso hice algun pinito con
ensamblador.

jorge







Respuesta Responder a este mensaje
#5 JM Tella Llop [MVP Windows]
25/10/2005 - 15:38 | Informe spam
En Virtual PC no lo he probado (pero el Virtual PC está muerto.. y si MS
no se pone las pilas con el Virtual Server, este ultimo tambien lo estará.
Vmware es una competencia fortisima). Pero en vmware no es así. Te devuelve
el mismo procesador que el original instalado.

Jose Manuel Tella Llop
MVP - Windows
(quitar XXX)
http://www.multingles.net/jmt.htm

Este mensaje se proporciona "como está" sin garantías de ninguna clase,
y no otorga ningún derecho.

This posting is provided "AS IS" with no warranties, and confers no
rights.
You assume all risk for your use.



"Sygrama Software" wrote in message
news:
Hola José Manuel:
Me parece haber visto algo en el foro de VirtualPC, acerca de preguntar a
través de alguna función standard de API cuál es el procesador. En el caso
de la máquina virtual responde "Microsoft". Para más precisiones, recurrir
al foro microsoft.public.virtualpc (sólo en inglés).
Saludos
Claudia Podestá
Rosario - Argentina
"JM Tella Llop [MVP Windows]" escribió en el mensaje
news:uumqd$
Se puede perfectamente por el software llegar a saber esto.

He visto varios trucos de programacion pero que me parecen chapuceros:
realizar un programa en C:, situar un manejador de excpeciones y ejeuctar
operaciones no validas -y privilegiadas- analizando posteriormente el
codigo
atrapado en el manejador. Esto codigos, en ciertas instrucciones tan
simples
como las IN / OUT normalmente reciben codigos de error diferentes a los
que
realmente se darian en un sistema operativo en una maquina real.

La manera mas elegante por parte del software de hacerlo, sería si
tuviesemos una instruccion no privilegiada (es decir, de las que se pueden
ejecutar en modo user -ring3- y que por tanto no disparen ningun manejador
de excepcion) y que esta nos devolviese datos que fuesen diferentes en una
maquina real de una maquina virtual. Aunque no se si puede haber mas, al
menos la instruccion SIDT cumple las premisas anteriores. Esta instruccion
nos devuelve el contenido del registro de la 'interrupt descriptor table'
(IDTR).

Como solamente hay un registro IDTR y en el caso de una maquina virtual,
hay
al menos dos sistemas operativos en ejecucion concurrentemente (el host y
el
invitado) la maquina virtual necesita reasignar el IDTR del sistema
operativo invitado para no entrar en conflictos con la maquina host. En
este
caso, cuando nuestro programa de prueba ejecute una instruccion SIDT, la
cual, al no ser privilegiada no provocará una excepcion (que atrape la
maquina virtual y por tanto pueda falsearnos el resultado dandonos el
original), y por tanto recibiremos un valor que al analizarlo podremos
comprobar que no es el esperado en una maquina "real".

Jose Manuel Tella Llop
MVP - Windows
(quitar XXX)
http://www.multingles.net/jmt.htm

Este mensaje se proporciona "como está" sin garantías de ninguna clase,
y no otorga ningún derecho.

This posting is provided "AS IS" with no warranties, and confers no
rights.
You assume all risk for your use.



"jorge" wrote in message
news:
¿hay alguna manera de que algun programa pueda averiguar de alguna forma
si se está ejecutando en una maquina real, o en una maquina virtual como
vmware o Virtual PC?

P.D.:Tengo conocimientos de programacion e incluso hice algun pinito con
ensamblador.

jorge







Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida