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
/* -=================================================================- 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.