Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: t4r0x en 23 Septiembre 2014, 12:40 pm



Título: Como comprobar el modo del procesador en Windows?
Publicado por: t4r0x en 23 Septiembre 2014, 12:40 pm
Buenas, segun tengo entendido en Windows x64 se puede cambiar el modo del
procesador usando un JMP FAR, asi que mi duda es si existe alguna manera de saber
el modo actual en el que se encuentra el procesador? talvez usando alguna instruccion
especial. para entederme mejor digamos que tengo mi codigo en un proceso X ahora
para ejecutar mi codigo de forma correcta necesito saber primero el modo en el que se
encuentra el procesador en ese punto porque segun tengo entendido los opcodes del
x86 son diferentes al de x64.

gracias.


Título: Re: Como comprobar el modo del procesador en Windows?
Publicado por: Eternal Idol en 23 Septiembre 2014, 14:38 pm
¿Y como llego tu codigo hasta ese proceso? Si abriste un HANDLE al proceso en cuestion entonces llama a IsWow64Process (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684139%28v=vs.85%29.aspx) para saber si tenes que escribir codigo de 32 o 64 bits en el.


Título: Re: Como comprobar el modo del procesador en Windows?
Publicado por: MCKSys Argentina en 23 Septiembre 2014, 17:02 pm
Hola!

Si no quieres usar una API, revisa este (http://wiki.osdev.org/X86-64) post. En especial, la parte donde dice "In long mode the current CS determines if..."

Aqui (http://stackoverflow.com/questions/1436185/how-can-i-tell-if-im-running-on-x64) hay otro link que puede interesarte tambien. Pregunta por Delphi, pero tambien le dan una respuesta usando asm.

Saludos!


Título: Re: Como comprobar el modo del procesador en Windows?
Publicado por: t4r0x en 23 Septiembre 2014, 19:10 pm
¿Y como llego tu codigo hasta ese proceso? Si abriste un HANDLE al proceso en cuestion entonces llama a IsWow64Process (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684139%28v=vs.85%29.aspx) para saber si tenes que escribir codigo de 32 o 64 bits en el.
Bueno no abro ninguna handle de proceso más bien un handle de hilo ya que inyecto codigo.
Pero IsWow64Process es para saber si el proceso es WOW64... estoy tomando en cuenta que el proceso
es ya WOW64 (32-bits) porque creo que sólo en proceso WOW64 es posible cambiar de procesador...


Hola!

Si no quieres usar una API, revisa este (http://wiki.osdev.org/X86-64) post. En especial, la parte donde dice "In long mode the current CS determines if..."

Aqui (http://stackoverflow.com/questions/1436185/how-can-i-tell-if-im-running-on-x64) hay otro link que puede interesarte tambien. Pregunta por Delphi, pero tambien le dan una respuesta usando asm.

Saludos!
gracias, comparando directamente un valor es una manera confiable? :P
y eso de usar IsWow64Process no me funciona aqui, yo no quiero saber si el proceso es de 64bits or 32-bits, lo que quiero es saber el modo en el que se
encuentra un proceso X de 32bits en un Windows de 64bits y si es posible detectarlo mediante un codigo que seria inyectado.


Título: Re: Como comprobar el modo del procesador en Windows?
Publicado por: Eternal Idol en 23 Septiembre 2014, 19:21 pm
Si no quieres usar una API, revisa este (http://wiki.osdev.org/X86-64) post. En especial, la parte donde dice "In long mode the current CS determines if..."

Muy interesante aunque seria una solucion heuristica, investigue un poco mas por Internet y mientras Microsoft no cambie las GDT si CS es 0x33 estas en 64 bits y si es 0x23 en 32 bits (esto en una maquina de 64 bits con un Windows de 64 bits).

Aqui (http://stackoverflow.com/questions/1436185/how-can-i-tell-if-im-running-on-x64) hay otro link que puede interesarte tambien. Pregunta por Delphi, pero tambien le dan una respuesta usando asm.

El codigo en assembly comprueba si la CPU es capaz de trabajar en 64 bits pero no es capaz de saber si el S.O. o un proceso en particular en ejecucion lo son (para eso hacen uso de la API que mencione).

Bueno no abro ninguna handle de proceso más bien un handle de hilo ya que inyecto codigo.
Pero IsWow64Process es para saber si el proceso es WOW64... estoy tomando en cuenta que el proceso
es ya WOW64 (32-bits) porque creo que sólo en proceso WOW64 es posible cambiar de procesador...

Si se puede saltando al otro selector.

gracias, comparando directamente un valor es una manera confiable? :P
y eso de usar IsWow64Process no me funciona aqui, yo no quiero saber si el proceso es de 64bits or 32-bits, lo que quiero es saber el modo en el que se
encuentra un proceso X de 32bits en un Windows de 64bits y si es posible detectarlo mediante un codigo que seria inyectado.

No al 100%. Un proceso en si puede ser de 32 o 64 bits, en todo caso los hilos pueden estar en X momento ejecutando codigo en un modo o en otro, solo podrias saberlo si los pausaras pero no veo cual es el objetivo sinceramente, si el tema es saber en que modo se ejecutara TU codigo inyectado la respuesta es muy sencilla: si es un proceso de 32 bits el hilo arrancara en 32 bits. Salvo que no crees un hilo sino que lo secuestres, en ese caso, estamos hablando de malware seguro ...


Título: Re: Como comprobar el modo del procesador en Windows?
Publicado por: t4r0x en 23 Septiembre 2014, 19:29 pm
Si se puede saltando al otro selector.
No entendi bien podrias explicarme...

No al 100%. Un proceso en si puede ser de 32 o 64 bits, en todo caso los hilos pueden estar en X momento ejecutando codigo en un modo o en otro, solo podrias saberlo si los pausaras pero no veo cual es el objetivo sinceramente, si el tema es saber en que modo se ejecutara TU codigo inyectado la respuesta es muy sencilla: si es un proceso de 32 bits el hilo arrancara en 32 bits.
Bueno en parte es curiosidad en saber en modo de ejecucion de un hilo de un proceso X ( desde mi proceso ) y tambien si es posible
estando ya mi codigo desde ese proceso X. cual seria la manera confable? :P


Título: Re: Como comprobar el modo del procesador en Windows?
Publicado por: Eternal Idol en 23 Septiembre 2014, 19:38 pm
No entendi bien podrias explicarme...

Como dijiste al principio con salto largo pasando de 0x23 a 0x33 y viceversa.

Bueno en parte es curiosidad en saber en modo de ejecucion de un hilo de un proceso X ( desde mi proceso ) y tambien si es posible
estando ya mi codigo desde ese proceso X. cual seria la manera confable? :P

No sirve para nada saber eso asi que no hace ninguna falta una manera mas confiable (esta implicaria poder leer la GDT), suspendes con SuspendThread (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686345%28v=vs.85%29.aspx) y llamas a GetThreadContext  (http://msdn.microsoft.com/en-us/library/windows/desktop/ms679362%28v=vs.85%29.aspx).


Título: Re: Como comprobar el modo del procesador en Windows?
Publicado por: t4r0x en 23 Septiembre 2014, 20:10 pm
Como dijiste al principio con salto largo pasando de 0x23 a 0x33 y viceversa.

No sirve para nada saber eso asi que no hace ninguna falta una manera mas confiable (esta implicaria poder leer la GDT), suspendes con SuspendThread (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686345%28v=vs.85%29.aspx) y llamas a GetThreadContext  (http://msdn.microsoft.com/en-us/library/windows/desktop/ms679362%28v=vs.85%29.aspx).
Bueno en parte era simplemente curiosidad... en otra parte talvez me funcione no lo se... gracias!


Título: Re: Como comprobar el modo del procesador en Windows?
Publicado por: x64core en 24 Septiembre 2014, 21:52 pm
algunas instrucciones de x86 y x86-64 son codificadas de la misma manera, son pocas y se podria saber el modo en el cual se encuentra ejecutando el contexto sin necesidad de comparar usando push's y pop con un solo bit establecido para luego usar popf si la bandera es establecida entonces esta en 32-bits. aunque la verdad tambien me parece inutil (' modo en el que se
encuentra el procesador en ese punto')