[Script]Script para calcular offset de un ejectuable

Iniciado por .:UND3R:., 26 Septiembre 2011, 20:40 PM

0 Miembros y 1 Visitante están viendo este tema.

.:UND3R:.

Me surgió la duda de como obtener el OffsetRaw de manera manual, buscando en google todos recomendaban programas y siempre que se tocaba la palabra "fórmula o cálculo" venía con la palabra "no es necesaria por existen programas...", por eso se me ocurrió crear un script encargado de mostrar el offset raw, en la cabecera del script se puede apreciar detalladamente de forma explicativa y con ejemplos el cálculo para obtener offset raw

Los datos que entregan son:
offset RAW y la sección que corresponde el address buscado
para buscar se debe insertar el address en VA (Como lo muestra Ollydbg)

Código (asm) [Seleccionar]
/*
    -=================================================================-
                                                 
        Script realizado por :UND3R                                       
        Script para : Encontrar Offset RAW                                                                                             
        Fecha : 26/09/2011                                           
                                                                     
                    -=[ Comentario del Script ]=-
     Fórmula:
     RVA: Valor relativo en memoria (Relative Value Address)                                 
     VA: Valor absoluto en memoria (Value Absolute)                                                               
     RAW: Dirección en el disco
     
     -OllyDBG Nos muestra por defecto direciones de tipo VA
     VA(Value Absolute)=ImageBase+RVA     

     Ejemplo: 40101D=400000(ImageBase)+101D(RVA)
         
     -Si queremos saber el raw de un address ubicado en la cabezera PE (PE header)
     se debe restar address-ImageBase=RVA=RAW     

     Ejemplo: 400056(VA)-400000(ImageBase)=56h(RAW)   

     -Si queremos saber el raw de un address ubicado en una sección     
     se debe hacer lo siguiente:
     
     Obtener el RVA del addres:
     Address-ImageBase=RVA
     
     luego a RVA restarle los siguientes valores:     
     RVA-(VirtualAddress-PointerToRawData)=RAW     

     *VirtualAddress y PointerToRawData varían en cada sección

                                                                 
                                                                     
    -=================================================================-
*/
VAR NOM_SECCION
VAR VALOR
VAR HEADER
VAR CONTADOR_SEC
VAR VIRTUAL_ADDRESS
VAR VIRTUAL_SIZE
VAR N_SECCIONES
VAR MODULE_BASE
VAR PUNTERO_PE
INC CONTADOR_SEC //Incrementa CONTADOR_SEC en 1
PREGUNTAR:
ASK "Introduzca el address a calcular el Offset RAW"
MOV RESULTADO,$RESULT //Mueve el resultado a la variable RESULTADO
MOV VALOR,RESULTADO //Mueve RESULTADO a la variable VALOR
GMI eip,MODULEBASE //Obtiene la Base del módulo
MOV MODULE_BASE,$RESULT //Mueve el resultado a MODULE_BASE
MOV PUNTERO_PE,MODULE_BASE //Mueve la Base del módulo a la variable PUNTERO_PE
ADD PUNTERO_PE,3C //Suma 3C con PUNTERO_PE
MOV PUNTERO_PE,[PUNTERO_PE] //Mueve el contenido dentro de PUNTERO_PE a PUNTERO_PE
ADD PUNTERO_PE,MODULE_BASE  //Suma PUNTERO_PE con MODULE_BASE
MOV N_SECCIONES,PUNTERO_PE  //Mueve PUNTERO_PE a N_SECCIONES
ADD N_SECCIONES,6 //Suma N_SECCIONES con 6 para obtener el número de secciones
MOV N_SECCIONES,[N_SECCIONES],1 //Mueve el primer byte del contenido dentro de N_SECCIONES a N_SECCIONES
ADD PUNTERO_PE,F8 //Suma PUNTERO_PE con F8
MOV HEADER,PUNTERO_PE //Mueve PUNTERO_PE a la variable HEADER
ADD HEADER,C //Suma C a la variable HEADER
MOV HEADER,[HEADER] //Mueve lo que está dentro de HEADER a la variable HEADER
ADD HEADER,MODULE_BASE
CMP RESULTADO,MODULE_BASE //Compara si el valor introducido con el valor de la ImageBase
JB  ERROR_ADDRESS //Si el valor introducido es menor salta a ERROR_ADDRESS
CMP RESULTADO,HEADER //Compara el valor introducido con el inicio de la primera sección
JB CALCULAR_1 //Si el valor introducido es menor hará el cálculo correspondiente de un address ubicado en la sección PE header
BUCLE:          //Bucle encargado de buscar la sección que corresponde el valor introducido
ADD PUNTERO_PE,8
MOV VIRTUAL_SIZE,[PUNTERO_PE]
ADD PUNTERO_PE,4
MOV VIRTUAL_ADDRESS,[PUNTERO_PE]
ADD VIRTUAL_SIZE,VIRTUAL_ADDRESS
ADD VIRTUAL_SIZE,MODULE_BASE
SUB VIRTUAL_SIZE,1
CMP RESULTADO,VIRTUAL_SIZE
JB CALCULAR_2
CMP CONTADOR_SEC,N_SECCIONES
JA ERROR_ADDRESS
INC CONTADOR_SEC
ADD PUNTERO_PE,1C
JMP BUCLE
CALCULAR_1:     //Fórmula de address ubicada en PE header
SUB VALOR,MODULE_BASE
MOV NOM_SECCION,"PE header"
JMP SALIR
CALCULAR_2:  //Fórmula de address ubicada en una sección
ADD PUNTERO_PE,8
MOV NOM_SECCION,PUNTERO_PE
SUB NOM_SECCION,14
MOV NOM_SECCION,[NOM_SECCION],8
BUF NOM_SECCION
STR NOM_SECCION
LOG NOM_SECCION
MOV PUNTERO_PE,[PUNTERO_PE]
SUB VALOR,MODULE_BASE
SUB VIRTUAL_ADDRESS,PUNTERO_PE
SUB VALOR,VIRTUAL_ADDRESS
JMP SALIR
ERROR_ADDRESS:
MSG "ERROR:Address introducida incorrecta"
JMP PREGUNTAR
SALIR:
EVAL "VA:[{RESULTADO}]=Offset RAW:[{VALOR}h] sección:{NOM_SECCION}"
MSG $RESULT
ret


Saludos a Tinkipinki que nunca me hizo un reto, tomaré este script como reto ya que de forma indirecta lo hizo.

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

Tinkipinki

Hola .:UND3R:.  felicitarte por el aporte. Estoy ansioso por llegar a casa y poderlo probar detenidamente y comentarte como me va.

Citar
Saludos a Tinkipinki que nunca me hizo un reto, tomaré este script como reto ya que de forma indirecta lo hizo.

Es dificil retarte pero seguro que te voy a dar algun que otro dolor de cabeza mas... jeje  :rolleyes:  Todavia estoy digiriendo toda la informacion surgida de preguntas al foro en posts anteriores.

Saludos

.:UND3R:.

#2
jaja no creo que sea difícil, no me manejo mucho en script, Saludos

EDIT: modifiqué la explicación (El script no)

ya que restaba imagebase-rva dando esto negativo, por lo que debía ser al revés.

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

Tinkipinki

Ok .:UND3R:. , ya lo he probado y funciona correctamente.
Es una pequeña maravilla, al menos para mi... ;-)

Saludos

.:UND3R:.

que bueno que te haya gustado :D, sirve mucho si no quieres usar programas anexos a ollydbg

Saludos

Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)