Autor
|
Tema: Como decodificar prefijos de x86 instrucciones 32 bits apropiadamente??? (Leído 3,947 veces)
|
harry_the_blogger
Desconectado
Mensajes: 105
Visita mi blog es enriquemesa.blogspot.com
|
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) 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
Mensajes: 1.027
|
Intentare ayudarte, pero como dijiste el tema es muy extenso. ¿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. ¿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 ¿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
Mensajes: 105
Visita mi blog es enriquemesa.blogspot.com
|
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
|
Hola! Podrías mirar el source de distorm si te surjen dudas... 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
Mensajes: 1.027
|
@ harry_the_bloggerPordrias 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. 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. repe scasw ; >>>> f3 66 af 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 ArgentinaQue 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
Mensajes: 1.908
|
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Instrucciones 64-bit vs. Instrucciones Avanzadas (SSE, SSE2, SSE3, SSE4, AVX)
ASM
|
Fly_NighT
|
8
|
7,551
|
5 Marzo 2014, 07:45 am
por xv0
|
|
|
¿Cómo testear apropiadamente la velocidad en una red local?
Redes
|
lipman
|
3
|
2,800
|
7 Abril 2014, 19:06 pm
por Platanito Mx
|
|
|
¿Como decodificar x86 opcodes apropiadamente?
« 1 2 »
ASM
|
harry_the_blogger
|
10
|
9,718
|
4 Febrero 2015, 16:26 pm
por JavierJV
|
|
|
¿Como leer un libro apropiadamente?
Dudas Generales
|
FGM24
|
2
|
3,031
|
24 Septiembre 2022, 00:27 am
por FGM24
|
|
|
¿Cómo recomiendan dar instrucciones a una persona o IA para que jugue como una?
Programación General
|
Tachikomaia
|
0
|
1,112
|
28 Enero 2024, 05:19 am
por Tachikomaia
|
|