elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Ingeniería Inversa (Moderadores: karmany, .:UND3R:., MCKSys Argentina)
| | |-+  Primera instrucción de una funcion de una DLL
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Primera instrucción de una funcion de una DLL  (Leído 3,288 veces)
nhaalclkiemr


Desconectado Desconectado

Mensajes: 1.678


Máximo exponente 9DB9F1AEED2FADBDE 997BBE20FEDA92


Ver Perfil WWW
Primera instrucción de una funcion de una DLL
« en: 14 Febrero 2008, 18:59 pm »

Weno no sabía muy bien donde poner esto pero supongo que ira aqui...

Lo que quiero es saber como puedo obtener la primera instruccion de una función de una DLL...

No pido asi un code que lo haga, sino más bien alguna caracteristica del formato PE que me diga donde empieza cada una de las funciones de una DLL...

Por ejemplo el EntryPoint nos dice la primera instruccion al ejecutarse (supongo que será la del Main), pues lo que quiero es saber como puedo obtener las posiciones de la primera instruccion de cada una de las funciones de una DLL...

Alguien sabe?

Saludos ;)
En línea

StasFodidoCrypter 1.0 - 100% (old)
StasFodidoCrypter 2.0 - 85% (deserted)
Fire AV/FW-Killer - 97% (deserted)
R-WlanXDecrypter 1.0- 100%
karmany
Moderador
***
Desconectado Desconectado

Mensajes: 1.614


Sueñas que sueñas


Ver Perfil WWW
Re: Primera instrucción de una funcion de una DLL
« Respuesta #1 en: 14 Febrero 2008, 22:22 pm »

Es muy fácil..

Lo primero tienes que ir a la Export Table. Allí te indica todas las funciones que la dll exporta.
Para saber dónde comienza una determinada función de una librería, puedes implementarlo tú mismo con una forma muy sencilla y es llamando a la API GetProcAddress a la que le pasas el handle de la librería y el nombre (string) de la función que tú quieres. Esta pienso que es la forma más sencilla.

La forma teórica de dónde comienza cada función (resumo mucho mucho) es la siguiente:
En el encabezado (PE header) tienes una dirección hacia la Export Table. Por ej. voy a mirar una dll cualquiera y la miro con un editor de PE (o con un editor hexadecimal si sabes leer el PE header) y veo lo siguiente:
 
Código:
          RVA           Size
Export:  0002C0D0    00000092

En esta dll la Image Base es la siguiente: 04000000
Por lo tanto la Dirección Virtual donde comienza la Tabla de Exportaciones es:
0402C0D0
La export Table contiene las RVA (relativas a la base de la dll) de las funciones que exporta.

Ahora me voy a 0402C0D0 cargando la librería en el OllyDBG y dumpeo esa dirección y veo lo siguiente:
Código:
0402C0D0  00 00 00 00 0E 4A 76 41 00 00 00 00 16 C1 02 00  ....JvA....Á.
0402C0E0  01 00 00 00 03 00 00 00 03 00 00 00 F8 C0 02 00  .........øÀ.
0402C0F0  04 C1 02 00 10 C1 02 00 55 43 00 00 3B 42 00 00  Á.Á.UC..;B..
0402C100  DF 42 00 00 21 C1 02 00 31 C1 02 00 44 C1 02 00  ßB..!Á.1Á.DÁ.
0402C110  00 00 01 00 02 00 63 64 72 35 30 73 2E 64 6C 6C  ....cdr50s.dll
0402C120  00 43 44 52 43 6F 6E 6E 65 63 74 44 72 69 76 65  .CDRConnectDrive
0402C130  00 43 44 52 47 65 74 53 75 70 70 6F 72 74 4C 65  .CDRGetSupportLe
0402C140  76 65 6C 00 43 44 52 47 65 74 53 75 70 70 6F 72  vel.CDRGetSuppor
0402C150  74 4C 65 76 65 6C 57 69 74 68 49 6E 71 75 69 72  tLevelWithInquir
0402C160  79 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  y...............

Como se observa el 4º dword es el puntero a la dll. Y a simple vista se ve que exporta únicamente 3 funciones.
Ahora después te paso un link con toda la información pero si te fijas en el offset 28h (40 decimal) verás estos bytes: 55 43 00 00 - 3B 42 00 00 - DF 42 00 00 Estos bytes son las RVA que tú buscas..

Por ejemplo para la primera función: CDRConnectDrive la RVA es 55 43 00 00 es decir, 4355h. Si recuerdas la Image Base es 4000000 por lo tanto la dirección virtual (recuerda: Dirección Virtual VA) es 4004355.
Voy a comprobarlo: cargo la librería en el OllyDBG y me voy a 4004355 y OllyDBG ya me indica dónde estoy y efectivamente me dice que estoy en CDRConnectDrive.

Así se calcula y así también lo hacen los editores de PE. Para más información y donde puedes compilar un programa en MASM32 te dejo el siguiente enlace:

http://win32assembly.online.fr/pe-tut7.html

Un saludo
karmany
« Última modificación: 14 Febrero 2008, 22:30 pm por karmany » En línea

nhaalclkiemr


Desconectado Desconectado

Mensajes: 1.678


Máximo exponente 9DB9F1AEED2FADBDE 997BBE20FEDA92


Ver Perfil WWW
Re: Primera instrucción de una funcion de una DLL
« Respuesta #2 en: 14 Febrero 2008, 22:39 pm »

Perfectamente explicado muchas gracias ya entiendo (así da gusto preguntar ;D ) :D

Voy a intentar hacer un code que me devuelva las direcciones, si tengo cualquier problema ya lo pongo...

Muchas gracias :D saludos ;)
En línea

StasFodidoCrypter 1.0 - 100% (old)
StasFodidoCrypter 2.0 - 85% (deserted)
Fire AV/FW-Killer - 97% (deserted)
R-WlanXDecrypter 1.0- 100%
nhaalclkiemr


Desconectado Desconectado

Mensajes: 1.678


Máximo exponente 9DB9F1AEED2FADBDE 997BBE20FEDA92


Ver Perfil WWW
Re: Primera instrucción de una funcion de una DLL
« Respuesta #3 en: 15 Febrero 2008, 23:09 pm »

Mira con el DUMPBIN ejecuté: dumpbin /EXPORTS zlib.dll ...aí se muestran las funciones que se exportan:

Código:
dumpbin /EXPORTS zlib.dll
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file zlib.dll

File Type: DLL

  Section contains the following exports for zlib.dll

           0 characteristics
    39801DF8 time date stamp Thu Jul 27 13:33:12 2000
        0.00 version
           1 ordinal base
          84 number of functions
          61 number of names

    ordinal hint RVA      name

          1    0 00001710 adler32
          2    1 00001900 compress
         39    2 00001850 compress2
          3    3 000019A0 crc32
          4    4 00001F70 deflate
          5    5 000023A0 deflateCopy
          6    6 000022F0 deflateEnd
          7    7 00001B20 deflateInit2_
          8    8 00001AF0 deflateInit_
          9    9 00001EA0 deflateParams
         10    A 00001E20 deflateReset
         11    B 00001D20 deflateSetDictionary
         38    C 00001920 get_crc_table
         12    D 00003F50 gzclose
         13    E 000034B0 gzdopen
         34    F 00003EE0 gzeof
         14   10 00003FE0 gzerror
         15   11 00003BF0 gzflush
         30   12 00003A10 gzgetc
         41   13 00003A40 gzgets
         16   14 00003230 gzopen
         28   15 00003B30 gzprintf
         29   16 00003B90 gzputc
         40   17 00003BC0 gzputs
         17   18 000037E0 gzread
         32   19 00003E40 gzrewind
         31   1A 00003CF0 gzseek
         35   1B 000034F0 gzsetparams
         33   1C 00003EC0 gztell
         18   1D 00003AA0 gzwrite
         19   1E 00005D30 inflate
         20   1F 00005BA0 inflateEnd
         21   20 00005BF0 inflateInit2_
         22   21 00005D10 inflateInit_
         23   22 00005B50 inflateReset
         24   23 00006170 inflateSetDictionary
         25   24 00006200 inflateSync
         37   25 000062D0 inflateSyncPoint
         26   26 00008700 uncompress
         62   27 00008C60 unzClose
         72   28 000098C0 unzCloseCurrentFile
         64   29 00008CD0 unzGetCurrentFileInfo
         73   2A 00009950 unzGetGlobalComment
         63   2B 00008CA0 unzGetGlobalInfo
         76   2C 00009810 unzGetLocalExtrafield
         65   2D 000090B0 unzGoToFirstFile
         66   2E 00009100 unzGoToNextFile
         75   2F 00009180 unzLocateFile
         61   30 00008860 unzOpen
         67   31 00009270 unzOpenCurrentFile
         68   32 000095B0 unzReadCurrentFile
         74   33 000087A0 unzStringFileNameCompare
         71   34 000097E0 unzeof
         70   35 000097B0 unztell
         36   36 0000A580 zError
         84   37 0000A3A0 zipClose
         83   38 0000A0E0 zipCloseFileInZip
         80   39 000099E0 zipOpen
         81   3A 00009AB0 zipOpenNewFileInZip
         82   3B 00009FC0 zipWriteInFileInZip
         27   3C 0000A570 zlibVersion

  Summary

        2000 .data
        2000 .rdata
        1000 .reloc
        1000 .rsrc
        A000 .text


A ver, si no me equivoco aqui 00001710 sreía la direccion (en Hex) de la funcion adler32, la direccion de la funcion compress sería 00001900. Me equivoco?

Entonces si voy a la direccion 00001900 (con un editor hexadecimal por ejemplo) me encontraré ante la primera instruccion que se ejecutará con la funcion compress...me equivoco?

EDIT: Si si que me equivoco pero no se en que...a lo mejor lo que obtení no son las direcciones de las funciones no se...miré con el olly y no me coincide...

Weno dejo más detalles de la cabecera de la libreria zlib.dll, a ver si me decis aí cual sería la primera instruccion de alguna de sus funciones (para exportar):

Código:
dumpbin /HEADERS zlib.dll
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file zlib.dll

PE signature found

File Type: DLL

FILE HEADER VALUES
             14C machine (i386)
               5 number of sections
        39801DF8 time date stamp Thu Jul 27 13:33:12 2000
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
            210E characteristics
                   Executable
                   Line numbers stripped
                   Symbols stripped
                   32 bit word machine
                   DLL

OPTIONAL HEADER VALUES
             10B magic #
            6.00 linker version
            9A00 size of code
            3800 size of initialized data
               0 size of uninitialized data
            A7B0 RVA of entry point
            1000 base of code
            B000 base of data
        10000000 image base
            1000 section alignment
             200 file alignment
            4.00 operating system version
            1.12 image version
            4.00 subsystem version
               0 Win32 version
           11000 size of image
            1000 size of headers
               0 checksum
               2 subsystem (Windows GUI)
               0 DLL characteristics
          100000 size of stack reserve
            1000 size of stack commit
          100000 size of heap reserve
            2000 size of heap commit
               0 loader flags
              10 number of directories
            BFA0 [     5D5] RVA [size] of Export Directory
            BE18 [      3C] RVA [size] of Import Directory
            F000 [     370] RVA [size] of Resource Directory
               0 [       0] RVA [size] of Exception Directory
               0 [       0] RVA [size] of Certificates Directory
           10000 [     264] RVA [size] of Base Relocation Directory
               0 [       0] RVA [size] of Debug Directory
               0 [       0] RVA [size] of Architecture Directory
               0 [       0] RVA [size] of Special Directory
               0 [       0] RVA [size] of Thread Storage Directory
               0 [       0] RVA [size] of Load Configuration Directory
               0 [       0] RVA [size] of Bound Import Directory
               0 [       0] RVA [size] of Import Address Table Directory
               0 [       0] RVA [size] of Delay Import Directory
               0 [       0] RVA [size] of Reserved Directory
               0 [       0] RVA [size] of Reserved Directory


SECTION HEADER #1
   .text name
    982A virtual size
    1000 virtual address
    9A00 size of raw data
     400 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60000020 flags
         Code
         Execute Read

SECTION HEADER #2
  .rdata name
    1575 virtual size
    B000 virtual address
    1600 size of raw data
    9E00 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
40000040 flags
         Initialized Data
         Read Only

SECTION HEADER #3
   .data name
    189C virtual size
    D000 virtual address
    1600 size of raw data
    B400 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
C0000040 flags
         Initialized Data
         Read Write

SECTION HEADER #4
   .rsrc name
     370 virtual size
    F000 virtual address
     400 size of raw data
    CA00 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
40000040 flags
         Initialized Data
         Read Only

SECTION HEADER #5
  .reloc name
     2AE virtual size
   10000 virtual address
     400 size of raw data
    CE00 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
42000040 flags
         Initialized Data
         Discardable
         Read Only

  Summary

        2000 .data
        2000 .rdata
        1000 .reloc
        1000 .rsrc
        A000 .text

Saludos y gracias ;)
« Última modificación: 15 Febrero 2008, 23:18 pm por nhaalclkiemr » En línea

StasFodidoCrypter 1.0 - 100% (old)
StasFodidoCrypter 2.0 - 85% (deserted)
Fire AV/FW-Killer - 97% (deserted)
R-WlanXDecrypter 1.0- 100%
nhaalclkiemr


Desconectado Desconectado

Mensajes: 1.678


Máximo exponente 9DB9F1AEED2FADBDE 997BBE20FEDA92


Ver Perfil WWW
Re: Primera instrucción de una funcion de una DLL
« Respuesta #4 en: 17 Febrero 2008, 06:18 am »

Al final ya lo conseguí  :xD

La cuestion era: tengo el 00001900 (ese lo se obtener bien) de la funcion y le resto C00. El C00 es la diferencia entre las direcciones virtuales y las fisicas y lo obtengo restando 1000-400 (en HEX)...el 1000 es el virtual address de la primera sección y el 400 el file pointer to raw data de la primera sección. Y weno como cuando obtienes la direccion 00001900 te aparece sin la ImageBase no hace falta restarsela despues...

Weno saludos y gracias por todo ;)
« Última modificación: 17 Febrero 2008, 06:21 am por nhaalclkiemr » En línea

StasFodidoCrypter 1.0 - 100% (old)
StasFodidoCrypter 2.0 - 85% (deserted)
Fire AV/FW-Killer - 97% (deserted)
R-WlanXDecrypter 1.0- 100%
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
se atasca en una instruccion
Java
Tyrz 9 5,673 Último mensaje 21 Enero 2011, 20:57 pm
por kasiko
Instrucción % en C++?
Programación General
.:UND3R:. 1 2,363 Último mensaje 17 Enero 2012, 16:49 pm
por pucheto
Saltar instrucción [OllyDbg] « 1 2 »
Ingeniería Inversa
TomaSs 11 6,117 Último mensaje 12 Junio 2012, 15:09 pm
por apuromafo CLS
Instruccion if
Programación C/C++
BJM 3 2,118 Último mensaje 22 Octubre 2012, 17:48 pm
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines