Como comprobar el modo del procesador en Windows?

Iniciado por t4r0x, 23 Septiembre 2014, 12:40 PM

0 Miembros y 2 Visitantes están viendo este tema.

t4r0x

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.

Eternal Idol

¿Y como llego tu codigo hasta ese proceso? Si abriste un HANDLE al proceso en cuestion entonces llama a IsWow64Process para saber si tenes que escribir codigo de 32 o 64 bits en el.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

MCKSys Argentina

Hola!

Si no quieres usar una API, revisa este post. En especial, la parte donde dice "In long mode the current CS determines if..."

Aqui hay otro link que puede interesarte tambien. Pregunta por Delphi, pero tambien le dan una respuesta usando asm.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


t4r0x

Cita de: 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 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...


Cita de: MCKSys Argentina en 23 Septiembre 2014, 17:02 PM
Hola!

Si no quieres usar una API, revisa este post. En especial, la parte donde dice "In long mode the current CS determines if..."

Aqui 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.

Eternal Idol

#4
Cita de: MCKSys Argentina en 23 Septiembre 2014, 17:02 PMSi no quieres usar una API, revisa este 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).

Cita de: MCKSys Argentina en 23 Septiembre 2014, 17:02 PMAqui 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).

Cita de: t4r0x en 23 Septiembre 2014, 19:10 PM
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.

Cita de: t4r0x en 23 Septiembre 2014, 19:10 PMgracias, 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 ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

t4r0x

Cita de: Eternal Idol en 23 Septiembre 2014, 19:21 PM
Si se puede saltando al otro selector.
No entendi bien podrias explicarme...

Cita de: Eternal Idol en 23 Septiembre 2014, 19:21 PM
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

Eternal Idol

#6
Cita de: t4r0x en 23 Septiembre 2014, 19:29 PM
No entendi bien podrias explicarme...

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

Cita de: t4r0x en 23 Septiembre 2014, 19:29 PMBueno 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 y llamas a GetThreadContext .
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

t4r0x

Cita de: Eternal Idol en 23 Septiembre 2014, 19:38 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 y llamas a GetThreadContext .
Bueno en parte era simplemente curiosidad... en otra parte talvez me funcione no lo se... gracias!

x64core

#8
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')