Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eternal Idol

#421
Cita de: marax en 10 Mayo 2020, 12:26 PM
Aunque sigo con una pregunta: ¿deben todos los ISR salvar el valor de los registros que utiliza?

"A typical ISR structure is shown below
<save the registers used in the ISR>
sti     ; enable further interrupts
...
<ISR body>
...
<restore the saved registers>
iret    ; return to the interrupted program"

https://link.springer.com/chapter/10.1007/0-387-27155-4_15

Cita de: marax en 10 Mayo 2020, 12:26 PMEsto lo lei varias veces pero no logro entender precisamente a lo que te refieres.

Que yo sepa el hook antes de la instruccion cli llama al ISR que estaba originalmente en 09h y al servicio 01h del ISR de la interrupcion 16h:

Código (ASM) [Seleccionar]
PUSHF ;empuja EFLAGS en la pila
CALL CS :_oldISR
MOV AH,01H
PUSHF  ;empuja EFLAGS en la pila
CALL CS:_chkISR


Cita de: marax en 10 Mayo 2020, 12:26 PM¿Cual libro?

The Rootkit Arsenal Escape and Evasion in the Dark Corners of the System de Bill Blunden (2009), HookTSR es un ejemplo que viene en el segundo capitulo (no se quien habra copiado a quien ya que no diste la fuente de tu fragmento).

Cita de: marax en 10 Mayo 2020, 12:26 PMEsta bien... te refieres con simular a mantener la integridad de la entrada inmediatamente anterior de la cadena de ejecucion de las interrupciones (en la pila), ¿no?.

Para poder llamar al ISR hace falta poner EFLAGS en la pila ya que igual que el hook de ISR debe terminar con IRET y esa instruccion asume que EFLAGS fue empujado en la pila. Por cierto hace falta ejecutar CLI en el hook justamente por haber llamado a los otros ISRs que ejecutaron STI, el hook es llamado con las interrupciones ya deshabilitadas como se explica en el enlace de arriba (15.1    Interrupt Processing in the Real Mode).
#422
Cita de: marax en  9 Mayo 2020, 17:58 PMEntiendo bien lo que hace esta instruccion: desactiva las interupciones enmascarables. Y se que existen variedad de ejemplos acerca de su filosofia, sin embargo no me queda clara su necesidad real; creo que muchas soluciones podrian implementarse mas facilmente sin ello.

https://en.wikipedia.org/wiki/Interrupt_flag#CLI

"CLI is commonly used as a synchronization mechanism in uniprocessor systems. For example, a CLI is used in operating systems to disable interrupts so kernel code (typically a driver) can avoid race conditions with an interrupt handler."

En principio es para evitar que tu codigo sea interrumpido en medio de su ejecucion, para evitar la reentrada. ¿Que manera mas sencilla que cli/sti propones?

Mas informacion y ejemplo practico: http://www.plantation-productions.com/Webster/www.artofasm.com/DOS/ch17/CH17-4.html#HEADING4-139

Cita de: marax en  9 Mayo 2020, 17:58 PM¿es porque el contenido de los registros se pierde? ¿entonces por que no ademas de guardar el regustro EFLAGS en la pila no tambien el contenido de los registros?

En el fragmento que dejaste no se guarda EFLAGS, pero bueno entiendo que yo tengo ese libro en papel, en realidad se empuja EFLAGS en la pila para simular el estado de llamada a una interrupcion, sino se joderia la pila cuando el codigo original de la interrupcion (o el de la int 16h) se terminara con IRET.

"In Real-Address Mode, the IRET instruction preforms a far return to the interrupted program or procedure. During this operation, the processor pops the return instruction pointer, return code segment selector, and EFLAGS image from the stack to the EIP, CS, and EFLAGS registers, respectively, and then resumes execution of the interrupted program or procedure."

https://www.felixcloutier.com/x86/iret:iretd
#423
ASM / Re: Declaracion de segmentos en TASM
9 Mayo 2020, 18:30 PM
Cita de: marax en  9 Mayo 2020, 18:25 PM
No. Me refiero a la versatilidad del codigo maquina; las posibilidades del exito con la suerte se llevan al minimo.
Me mal interpretaste.  :rolleyes:
Saludos.

Y es que no tiene absolutamente nada que ver con lo que yo dije, tenemos la suerte de que la plataforma en la que trabajamos haya avanzado lo suficiente como para no tener que preocuparnos por estos temas arcaicos en la vida real de un programador.
#424
ASM / Re: Declaracion de segmentos en TASM
9 Mayo 2020, 18:13 PM
Cita de: marax en  9 Mayo 2020, 17:16 PMMe parece demasiado arriesgado hablar de suerte y de ensamblador en el mismo contexto...  :-X

¿Cual seria el riesgo exactamente? ¿Tener que lidiar con codigo de los años 80s/90s? Las probabilidades de que tenga la necesidad (el foro no cuenta, hablo profesionalmente) de depurar (debug.com/.exe desaparecio de mi SO hace rato largo cuando aparecieron a su vez los procesadores de 64 bits) y/o programar en ensamblador x86 de 16 bits son infimas por no decir nulas y ya lo eran incluso la decada pasada.
#425
ASM / Re: Declaracion de segmentos en TASM
8 Mayo 2020, 17:36 PM
Cita de: RayR en  8 Mayo 2020, 17:29 PMY es que hace demasiado tiempo que no toco nada de esto, y si ya de por sí el tema de la segmentación en x86 es complejo...

Yo ya lo habia olvidado por completo, por suerte, pero al menos ahora tengo en la mente mas razones para agradecer estar trabajando con un modelo de memoria plano ;-) ;-) ;-)
#426
ASM / Re: Declaracion de segmentos en TASM
8 Mayo 2020, 16:38 PM
"The segment alignment attribute tells the linker to ensure that a segment begins on a specified boundary."

En este punto el manual es explicito (y tambien habla de la generacion de segmentos, los segmentos de memoria son pre-existentes al programa), el alineamiento le dice al enlazador que se asegure que un segmento comienza en un limite especifico, este puede ser en bytes: 1, 2, 4, 16, 256 y 4096.

En la practica podemos ver como eso sucede con los ejemplos ya publicados, y no estamos hablando de segmentos superpuestos, estos no inician en la misma direccion de memoria segmentada (de hacerlo hablariamos siempre del mismo segmento de memoria, parrafo X, direccion de memoria lineal X con igual o diferente tamaño, el cual el procesador desconoce), solo puede haber segmentos superpuestos cuando involucramos un selector de segmento + un desplazamiento - el ejemplo seria 0710h:0006h y 0709h:0076h ambas direcciones segmentadas apuntan al mismo lugar con dos segmentos diferentes - de otra manera tratamos exclusivamente con valores consecutivos de 0 a 0xFFFF. Aca hablamos de varios segmentos de TASM contenidos en un solo segmento de memoria por la forma de declararlos.

No se puede acceder de ninguna manera a 256 o 4096 bytes atomicamente (en modo real creo que a 16 tampoco, sinceramente esto me esta haciendo releer material precambrico), el alineamiento - que por defecto es 16 en TASM - no tiene que ver con eso.

El procesador no sabe nada de estos segmentos declarados en TASM, MS-DOS despues de cargar el ejecutable solo sabe que tiene que hacer relocalizaciones y gracias.

SEGMENT cseg 'lalala' << le dice a TASM genera un segmento de codigo (cseg) llamado lalala, esto (el nombre) no se ve reflejado en el binario, en el manual hay una muy breve explicacion.
#427
ASM / Re: Declaracion de segmentos en TASM
7 Mayo 2020, 20:09 PM
¿Que es un segmento sin su contenido? ¿Un rango de memoria? Separar un segmento de sus datos no tiene sentido, un segmento es un bloque de memoria, un conjunto de bytes alineado a un parrafo y esos bytes que son sus datos tienen valores. Sin ir mas lejos al declarar un segmento en TASM nos permite darle valor a su contenido.

"The segment alignment attribute tells the linker to ensure that a segment begins on a
specified boundary. This is important because data can be loaded faster on the 80x86
processors if it's properly aligned."

De la misma manera equiparar los segmentos de memoria y los segmentos declarados por TASM me parece errado como concepto y por lo explicado en este mismo hilo es imposible que sean exactamente lo mismo. Si seg2 es 0x910 y antes esta seg1 que es 0x910 quiere decir que seg2 no inicia en la misma posicion, por pura logica; es cierto que el segmento de memoria 0x910 siempre inicia en la misma direccion pero si podemos tener 3 segmentos declarados por TASM que inician en un mismo selector de segmento no podemos seguir diciendo que son lo mismo que los segmentos de memoria.

Hacer referencia a seg2 en el codigo es solo una parte - inconclusa - del trabajo necesario para acceder a los datos que el segmento declarado por TASM contiene, se necesita tambien un desplazamiento, el cual tambien se puede conseguir haciendo referencia al mismo seg2 con offset.

No se desperdicia nada, si inicia el segmento TASM con un offset de 2 bytes es que hay otro segmento TASM anteriormente ocupando 1 o 2 bytes (lo cual lo hace intrinsicamente diferente a un segmento de memoria que solo puede iniciar alineado a un parrafo). No es como lo planteas, offset de seg2 y offset de var1 son lo mismo, no hay nada que ocupe otros 2 bytes entre medias, el primer elemento de ese segmento no inicia en otro lugar que no sea el principio del mismo. Es cierto que offset es con respecto al segmento de memoria, es la unica forma de que funcione.

Si seg2 iniciara en 0910:000 siempre entonces offset daria siempre 0 para un segmento declarado por TASM y no es el caso, devuelve el desplazamiento necesario para poder hacer estos segmentos de TASM funcionales.

Código (asm) [Seleccionar]
SEGMENT seg1 WORD
var db 7
var2 db 8
ENDS seg1

SEGMENT seg2 WORD
var1 DW 666h
ENDS seg2

SEGMENT cseg WORD
entry:
mov ax, seg1
mov ax, seg2
mov ax, offset seg1 ;0x0
mov ax, offset seg2 ;0x2
mov ax, offset var1 ;0x2
#428
ASM / Re: Declaracion de segmentos en TASM
7 Mayo 2020, 12:52 PM
Cierto, aunque es necesario contar tanto con el selector de segmento como con el desplazamiento (offset) para para obtener una direccion segmentada con la que poder trabajar.




The segment address is always added to a 16-bit offset in the instruction to yield a linear address, which is the same as physical address in this mode. For instance, the segmented address 06EFh:1234h (here the suffix "h" means hexadecimal) has a segment selector of 06EFh, representing a segment address of 06EF0h, to which the offset is added, yielding the linear address 06EF0h + 1234h = 08124h.

Because of the way the segment address and offset are added, a single linear address can be mapped to up to 212 = 4096 distinct segment:offset pairs. For example, the linear address 08124h can have the segmented addresses 06EFh:1234h, 0812h:0004h, 0000h:8124h, etc.

https://en.wikipedia.org/wiki/X86_memory_segmentation




Volviendo al ejemplo original los segmentos declarados por TASM arrancan en (entre otras direcciones segmentadas):
ref 0710h:0000h
seg 0710h:0002h
seg2 0710h:0004h
cseg 0710h:0006h

Poner el selector de segmento en AX no es suficiente para acceder a los datos (AX no sirve como indice tampoco), ni saber donde arranca el segmento declarado en TASM.

Para poder acceder a los datos con los segmentos declarados en mi ejemplo:
Código (asm) [Seleccionar]
entry:
mov bx, offset seg2
mov al, byte ptr [bx] ;esto no lee de 0:[bx] o [bx]:0, lee de ds:[bx] es decir ds:[0x8]
mov al, byte ptr cs:[bx] ;cs:[bx] es decir cs:[0x8] es 0x66
mov al, byte ptr cs:[2] ;es 0x3

mov bx, seg1
mov ds, bx ;ponemos en dx el selector de segmento
mov bx, offset seg1 ;ponemos en bx el desplazamiento
mov al, byte ptr [bx + 1] ;ds:[0x5] es 0x5
mov al, byte ptr [bx + 2] ;ds:[0x6] es 0x7


Si le damos nombre a nuestros datos como por ejemplo cambiando uno por despues podemos acceder a los mismos:
Código (asm) [Seleccionar]
var db 7
...
entry:
mov bx, seg1
mov ds, bx
mov bx, offset var
mov al, byte ptr [bx] ;ds:[0x6] es 0x7
#429
ASM / Re: Declaracion de segmentos en TASM
6 Mayo 2020, 17:17 PM
Cita de: marax en  4 Mayo 2020, 16:02 PMHonestamente pense que los segmentos se cargaban en el orden en el que son especificados en el codigo fuente.

Tanto en tu ejemplo como en el mio lo hacen, presta atencion al punto de entrada del codigo.

Cita de: marax en  4 Mayo 2020, 16:02 PMOtra pregunta, si no es molestia... ¿y si el contenido del segmento es mayor al rango de direccionamiento especificado?

Nada mejor que probar para averiguar.
#430
Foro Libre / Re: Tema Coronavirus COVID-19.
5 Mayo 2020, 15:59 PM
[youtube=640,360]https://www.youtube.com/watch?v=Q5BZ09iNdvo[/youtube]




'Érase una vez un virus': China se mofa de EE UU en una animación hecha con piezas como las de Lego

La agencia oficial de noticias china difunde un vídeo en el que la Estatua de la Libertad conversa con un guerrero de Xian

Se abre el telón, mientras empiezan a sonar los acordes de The Entertainer, la tonada que popularizó la película El Golpe. En el escenario, de un lado, una figura similar a las de Lego representando uno de los célebres guerreros de terracota de Xian, cubierto con una mascarilla. Del otro, la Estatua de la Libertad con el rostro descubierto. Va a empezar una sátira sobre cómo China percibe la estrategia de Estados Unidos —y las críticas del presidente Donald Trump— contra el coronavirus.

Los dos países, cuya relación se ha ido deteriorando a pasos agigantados durante el mandato de Trump, se han enzarzado en una guerra de recriminaciones sobre el origen y la gestión de la pandemia. El presidente estadounidense cree que el nuevo coronavirus se originó en un laboratorio de Wuhan, el foco original de la pandemia que ya ha infectado a más de tres millones de personas en el mundo. También acusa a China de haber ocultado información en las primeras semanas, impidiendo así que el resto del mundo pudiera responder a la pandemia de manera adecuada, y ha planteado que podría exigir el pago de reparaciones al país asiático. La semana pasada, el republicano llegó a insistir en que la gestión china de la pandemia era prueba de que China haría "todo lo posible" por conseguir que él perdiera la reelección en las elecciones estadounidenses del próximo noviembre.

Diplomáticos chinos, por contra, han planteado que el virus pudo entrar en su país traído por soldados de EE UU que participaron en los VII Juegos Mundiales Militares celebrados en esa ciudad en octubre pasado. Pekín también ha negado rotundamente tener ningún interés en interferir en las elecciones estadounidenses. A pesar de que en China no se puede acceder a YouTube ni a Twitter, sus diplomáticos utilizan estas herramientas para difundir sus mensajes.

Ahora, en el vídeo de animación de menos de dos minutos difundido por Xinhua, se burla de los comentarios en los que Trump ha restado importancia a la crisis desde que Pekín anunció el descubrimiento de una nueva enfermedad a finales de diciembre. "Hemos descubierto un nuevo virus", anuncia el guerrero de terracota. "¿Y qué?" -le contesta la Estatua de la Libertad- "Solo es una gripe".

El guerrero continúa enumerando una serie de recomendaciones e hitos de la lucha de China contra la pandemia y la estatua le responde con frases trumpianas mientras enrojece progresivamente, víctima de la fiebre, y queda conectada a una vía de goteo intravenoso. "El virus no es peligroso. Pero millones de chinos han muerto. Pero el virus no es peligroso. Tenemos razón. Aunque nos contradigamos", sostiene la figurilla que representa a Estados Unidos. El monumento acusa constantemente al guerrero de haber mentido y ocultado información.

"¿Os estáis oyendo a vosotros mismos?", pregunta el guerrero. "Nosotros siempre tenemos razón, aunque nos contradigamos", insiste la estatua, ahora ya cubierta con mascarilla. "Eso es lo que me gusta de vosotros, estadounidenses: vuestra consistencia", concluye el guerrero chino.