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:
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:
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.htmlUn saludo
karmany