Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: .:UND3R:. en 18 Noviembre 2011, 17:46 pm



Título: Por que esta instrucción no es válida?
Publicado por: .:UND3R:. en 18 Noviembre 2011, 17:46 pm
1)He aquí la instrucción:

Código
  1. mov ds, 1000h


2)Otra cosa, un programa en modo protegido mov puede tener como destino registros de segmento exceptuando a CS?

Saludos

EDIT:

3) movzx var2,al    ; es válida??? var2 WORD 1000h (yo creo que sí)




Título: Re: Por que esta instrucción no es válida?
Publicado por: _Enko en 19 Noviembre 2011, 13:32 pm
esa seria la forma correcta de hacerlo en modo real.
Código:
mov al, 1000h
mov ds, al



3) NO
Código:
0F B6 / r	 MOVZX r16, r/m8	 Move byte to word with zero-extension
0F B6 / r MOVZX r32, r/m8 Move byte to doubleword, zero-extension
0F B7 / r MOVZX r32, r/m16 Move word to doubleword, zero-extension
el destino tiene que ser un registro.

saludos.


Título: Re: Por que esta instrucción no es válida?
Publicado por: .:UND3R:. en 20 Noviembre 2011, 15:40 pm
Hola, en cuando a la pregunta dos, me refería a mov no ha movxz jeje


Saludos


Título: Re: Por que esta instrucción no es válida?
Publicado por: _Enko en 20 Noviembre 2011, 16:24 pm
Mi respuesta era a la pregunta 1 y 3. La 2 no la vi.

2) Sacado de AMD_INSTRUCTION_SET
Citar
Copies an immediate value or the value in a general-purpose register, segment register, or memory
location (second operand) to a general-purpose register, segment register, or memory location. The
source and destination must be the same size (byte, word, doubleword, or quadword) and cannot both
be memory locations
Citar
When reading segment-registers with a 32-bit operand size, the processor zero-extends the 16-bit
selector results to 32 bits. When reading segment-registers with a 64-bit operand size, the processor
zero-extends the 16-bit selector to 64 bits. If the destination operand specifies a segment register (DS,
ES, FS, GS, or SS), the source operand must be a valid segment selector
Citar
Attempting to use the MOV instruction to load the CS register generates an invalid opcode exception
(#UD). Use the far JMP, CALL, or RET instructions to load the CS registe



Como destino se puede tener DS, FS, GS, SS  y ES (en modo KERNEL, RING0. Si lo haces en modo usuario, el programa muere)

Para modificar CS, lo que se hace es un far jump.
Me imagino que habras visto varias veces algo asi:
Código:
mov eax, [fs:0x0]
mov eax, [fs:0x20] etc..
FS en realidad no guarda una direccion de memoria en modo protegido, ni tampoco CS, DS, ES, GS etc...
Lo que guardan es un Indice a una tabla. Y en esa tabla si se guarda la direccion. (gdt). Se los suele llamar "selectores" en vez de "segmento" ya que son eso, un indicde selector. CodeSelector, DataSelector etc...

Para modificar el CS lo que hay que hacer es un far jump indicando que "indice"/selector de esa tabla hay que usar.
Código
  1. jmp pword 0x08: .kernel ;usamos el primer selector
  2. .kernel:
  3.  
  4. ;o tambien
  5. jmp pword 0x1B: 1000h ;el selector que usa windows supongo
  6.  
  7. ;donde luego en la memoria en la direccion [CS: 1000h] esta el codigo
  8.  

Saludos



Título: Re: Por que esta instrucción no es válida?
Publicado por: .:UND3R:. en 21 Noviembre 2011, 04:18 am
Me haz aclarado bastantes dudas, gracias _Enko

Saludos