elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Como decodificar prefijos de x86 instrucciones 32 bits apropiadamente???
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Como decodificar prefijos de x86 instrucciones 32 bits apropiadamente???  (Leído 3,969 veces)
harry_the_blogger

Desconectado Desconectado

Mensajes: 105


Visita mi blog es enriquemesa.blogspot.com


Ver Perfil WWW
Como decodificar prefijos de x86 instrucciones 32 bits apropiadamente???
« en: 24 Septiembre 2014, 04:33 am »

Hola, amigos. Estoy desarrollando un pequeño desensamblador en ensamblador (suena algo redundante, pero no lo es). Tengo una duda. Antes que nada, quiero decir que ya estoy leyendo los manuales de Intel y revisando páginas en internet. (Para que no digan que no investigo).

El problema es el siguiente: Digamos tengo una instruccion X. ¿Como hago para saber si el primer byte que tengo en frente es un opcode en puro, un prefijo, o un opcode extendido?. Antes yo había tratado comparando el byte inicial con los valores asignados por Intel a los prefijos x86, pero ¿que pasa si la instruccion, de casualidad posee el mismo valor en hexadecimal que el prefijo?.

Ah, ¿Será que alguien me puede aclarar si los prefijos cumplen el siguiente orden?



¿Y como hago para reconocer si debería ser un prefijo? Por que según Intel, los prefijos pueden ir en cualquier orden dentro de los 4 primeros bytes (me refiero, LOCK a veces preceder a un SEGMENT OVERRIDE o viceversa=. (Aunque la imagen anterior pareciera decirme lo contrario)

Citar
Intel says:
Groups 1 through 4
may be placed in any order relative to each other.

Si alguien pudiera darme una mano con este problema, estaría muy agradecido. Sé que este tema es algo bastante extenso, pero pienso que aquí al menos podría recibir al menos una orientación. ¿o no? XD.

¿Será que alguien tiene un fragmento de codigo, que sea capaz de reconocer cuando el primer byte es un prefijo o un opcode? Gracias.





« Última modificación: 24 Septiembre 2014, 05:23 am por harry_the_blogger » En línea

Vista mi blog es enriquemesa.blogspot.com
xv0


Desconectado Desconectado

Mensajes: 1.027



Ver Perfil
Re: Como decodificar prefijos de x86 instrucciones 32 bits apropiadamente???
« Respuesta #1 en: 24 Septiembre 2014, 15:13 pm »

Intentare ayudarte, pero como dijiste el tema es muy extenso.

Citar
¿Como hago para saber si el primer byte que tengo en frente es un opcode en puro, un prefijo, o un opcode extendido?

Como tu bien dijiste, en los manuales hay unas tablas con los valores de los prefixos, que conste que yo me estoy leyendo los tomos de AMD, en el tomo numero 3, en la pagina 7 tienes la tabla con los valores de los prefijos.

Pero si lees la numero 2, hay tienes un diagrama del encoding de la sintaxis. Seria cuestion de comparar el primer byte con los valores de la tabla como bien dijiste, ahora mismo es eso lo unico que se me ocurre ami tambien.

Citar
¿que pasa si la instruccion, de casualidad posee el mismo valor en hexadecimal que el prefijo?.

Supongo que te refieres al opcode, que yo sepa ningun prefijo tiene que coincidir con ningun opcode, seria cuestion de revisarlos, pero en teoria no tienes porque tener ese problema.

Corrijanme si me equivoco

Citar
¿Será que alguien me puede aclarar si los prefijos cumplen el siguiente orden?

Sobre el orden, no lo tengo muy claro, se que al menos pueden aver 4 o 3 de los 5 prefijos que hay, creo...

El orden que me se de momento es este, Lock o Repeat esos los primeros, Operand-Size Override y luego el Segment Override.

Address-Size Override ahora mismo no se.

Cualquier cosa ya sabes.

Un saludo.


En línea

harry_the_blogger

Desconectado Desconectado

Mensajes: 105


Visita mi blog es enriquemesa.blogspot.com


Ver Perfil WWW
Re: Como decodificar prefijos de x86 instrucciones 32 bits apropiadamente???
« Respuesta #2 en: 24 Septiembre 2014, 19:22 pm »

Gracias cpu2. ¿Entonces, no sabes si los prefijos siguen el orden que indica la imagen? (LOCK/REP/REPNE, luego Address size override, luego Operand size y de ultimo Segment Override??

Sé que me diste una idea, pero, ¿no sabes exactamente si los prefijos pueden seguir el orden indicado anteriormente? Porque si lo siguen, creo que serìa capaz de escribir de forma más sencilla la parte de identificacion de prefijos.

Ah, y estuve mirando, y al parecer si hay opcodes que coinciden con los valores de los prefijos, aunque creo que los opcodes que coinciden no deberían tener ese prefijo.

Empezar este desensamblador está algo dificil. XD. Bueno, cuando lo terminé tendré un proyecto más en mi casa.
En línea

Vista mi blog es enriquemesa.blogspot.com
MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.517


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Como decodificar prefijos de x86 instrucciones 32 bits apropiadamente???
« Respuesta #3 en: 24 Septiembre 2014, 19:53 pm »

Hola!

Podrías mirar el source de distorm si te surjen dudas...  :P

No es para que le copies, sino para aclarte esos temas.  :)

Saludos!
En línea

MCKSys Argentina

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

xv0


Desconectado Desconectado

Mensajes: 1.027



Ver Perfil
Re: Como decodificar prefijos de x86 instrucciones 32 bits apropiadamente???
« Respuesta #4 en: 24 Septiembre 2014, 20:53 pm »

@harry_the_blogger

Pordrias decirme cuales son los opcodes que coinciden con los prefijos? Simplemente para ahorrar tiempo.

Bueno yo hice un disassembler algunas instrucciones y este es el orden que me dice, como sabras el prefijo lock solamente se puede aplicar lgunas instrucciones, por ejemplo al rep no.

Código
  1. lock movw %cx, %cs:(%rax)    ; >>>> f0 66 2e 89 08

Como puedes observar 0xf0 es Lock, 0x66 Operand-Size Override que indicaria 16 bit, 0x2e Segment Override el registro del segmento.

Supongo que Address-Size Override tendra el mismo puesto que Operand-Size Override, pero para direcciones.

Si miras Repeat.

Código
  1. repe scasw  ; >>>> f3 66 af
  2.  
  3. repe scasb  ; >>>> f3 ae

Como puedes observar con el prefijo Repeat pasa lo mismo que con el Lock, pero recuerda que estos dos no se pueden conbinar.

Cualquier duda ya sabes.

@MCKSys Argentina

Que bueno, seguro que eso le ayudara bastante.

Un saludo.

Modifico:

Encontre un opcode que coincide con el Repeat 0xf2, se trata de la instruccion crc32, pero date cuenta que son mas bytes, bueno son como unos 4, no se muy bien ya que esta instruccion es de SSE4.2.

Y como puedes observar en la imagen el opcode puede ser 1 o 2 bytes, esa me dejo descolocado.
« Última modificación: 24 Septiembre 2014, 21:08 pm por cpu2 » En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Como decodificar prefijos de x86 instrucciones 32 bits apropiadamente???
« Respuesta #5 en: 24 Septiembre 2014, 22:18 pm »


Ah, ¿Será que alguien me puede aclarar si los prefijos cumplen el siguiente orden?
El orden de los prefijos no importa.

¿Será que alguien tiene un fragmento de codigo, que sea capaz de reconocer cuando el primer byte es un prefijo o un opcode? Gracias.
Simplemente hace un comparación del primer byte contra los prefijos conocidos, si es un prefijo guarda la información y pasa al siguiente
byte, verificar el maximo numero de prefijos, luego empezar a verificar los opcodes.

Además creo que un buen desesamblador deberia tener como entrada el modo en el que se encuentra la CPU asi tratar de mejorar el resultado, aunque para ofuscación de código suele usarse instrucciónes privilegiadas para joder a los desesambladores.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines