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
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  localizacion de funciones o metodos..
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: localizacion de funciones o metodos..  (Leído 6,593 veces)
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
localizacion de funciones o metodos..
« en: 4 Febrero 2022, 01:32 am »

Buen dia o tades

Antes veia a las funciones como un puñado de procedimientos, pero despues de ver un video me entro la duda, y me da la espina que inclusive las funciones se alojan en una direccion de memoria, lo digo porque hay punteros a funciones...

Mi duda es,  como se almacena una funcion en memoria?.. es acaso la primera celda donde comienza el primer tipo local generado?

Ej:

Código
  1. void una_funcion (){      //donde se localiza ?
  2.     int x = 0;    //0x0003425   (direccion en la ram donde se localiza x)
  3. }

No es que se localice una celda antes que 0x0003425 ?

Saludos


En línea

Dungeons & dragons;
dragons.Attack();
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: localizacion de funciones o metodos..
« Respuesta #1 en: 4 Febrero 2022, 09:45 am »

Todo está en memoria, tanto el código como los datos. Y depende de la arquitectura pero la memoria de código suele estar separada del de los datos y marcada como sólo lectura.

Un pequeño snipet que te indica dónde se sitúa cada dato:
Código
  1. #include <stdio.h>
  2.  
  3. int global;
  4.  
  5. int main() {
  6.    int local;
  7.    static int local_estatico;
  8.  
  9.    printf("main\t\t: %p\n", main);
  10.    printf("global\t\t: %p\n", &global);
  11.    printf("local_estatico\t: %p\n", &local_estatico);
  12.    printf("local\t\t: %p\n", &local);
  13.    printf("Hay %I64u bytes entre main y su variable local.", (void*)&local - (void*)main);
  14. }

* Si estás en linux cambia %I64u por %llu

Fíjate en lo curioso de las variables estáticas.


« Última modificación: 4 Febrero 2022, 09:49 am por MAFUS » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: localizacion de funciones o metodos..
« Respuesta #2 en: 4 Febrero 2022, 09:47 am »

Por supuesto que estan en memoria cuando un programa se carga para su ejecucion (es decir se transforma en un proceso).

Las variables locales se ubican en la pila y las funciones en alguna sección de codigo, asi que la respuesta es no, lo que sucede es que se cargan todas las secciones, de datos y de codigo, que tiene el programa en memoria segun el formato de ejecutable.


A este ejemplo lo compile de manera que no incluyera la RTL y no fuera optimizado el codigo (o x desapareceria):
Código
  1. #include <windows.h>
  2.  
  3. char msg[] = "hola";
  4.  
  5. void main()
  6. {
  7. __debugbreak();
  8. unsigned int x = MB_OKCANCEL;
  9. MessageBox(0, msg, msg, x);
  10. }

Mi ejemplo se llama hi, voy a ejecutarlo y con el depurador le vamos a dar una minima ojeada, lm nos muestra los modulos cargados en el proceso:
0:000> lm
start    end        module name
00830000 00837000   hi       C (private pdb symbols)  C:\ProgramData\dbg\sym\hi.pdb\2A2EA34E458847C7B510C3251A92BACFe\hi.pdb
74ee0000 74ef8000   win32u     (deferred)            
74f00000 74f7b000   msvcp_win   (deferred)            
74f80000 75120000   USER32     (deferred)            
75460000 75484000   GDI32      (deferred)            
759d0000 75af0000   ucrtbase   (deferred)            
76290000 764a4000   KERNELBASE   (deferred)            
76830000 7690e000   gdi32full   (deferred)            
769c0000 76ab0000   KERNEL32   (pdb symbols)          C:\ProgramData\dbg\sym\wkernel32.pdb\5DBE558364DB859C4A8BF0C3F35C0FFD1\wkernel32.pdb
76d50000 76d75000   IMM32      (deferred)            
76f60000 77103000   ntdll      (pdb symbols)          C:\ProgramData\dbg\sym\wntdll.pdb\433094D2BBFF99FD8B094875FD33DF661\wntdll.pdb

Ahora con !dh (dump header) vemos las cabeceras y algunas secciones de hi.exe:
0:000> !dh hi.exe

File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
     14C machine (i386)
       5 number of sections
61FCE3DF time date stamp Fri Feb  4 09:29:19 2022

       0 file pointer to symbol table
       0 number of symbols
      E0 size of optional header
     102 characteristics
            Executable
            32 bit word machine

OPTIONAL HEADER VALUES
     10B magic #
   14.16 linker version
    1200 size of code
     A00 size of initialized data
       0 size of uninitialized data
    1005 address of entry point ;este es el offset al punto de entrada, aca arranca la ejecucion del programa
    1000 base of code
         ----- new -----
00830000 image base ;se carga en la direccion especificada en nuestro ejecutable (formato PE)
    1000 section alignment
     200 file alignment
       3 subsystem (Windows CUI)
    6.00 operating system version
    0.00 image version
    6.00 subsystem version
    7000 size of image
     400 size of headers
       0 checksum
00100000 size of stack reserve
00001000 size of stack commit
00100000 size of heap reserve
00001000 size of heap commit
    8540  DLL characteristics
            Dynamic base
            NX compatible
            No structured exception handler
            Terminal server aware
       0 [       0] address [size] of Export Directory
    5030 [      28] address [size] of Import Directory
       0 [       0] address [size] of Resource Directory
       0 [       0] address [size] of Exception Directory
       0 [       0] address [size] of Security Directory
    6000 [      10] address [size] of Base Relocation Directory
    3000 [      38] address [size] of Debug Directory
       0 [       0] address [size] of Description Directory
       0 [       0] address [size] of Special Directory
       0 [       0] address [size] of Thread Storage Directory
       0 [       0] address [size] of Load Configuration Directory
       0 [       0] address [size] of Bound Import Directory
    5000 [      30] address [size] of Import Address Table Directory
       0 [       0] address [size] of Delay Import Directory
       0 [       0] address [size] of COR20 Header Directory
       0 [       0] address [size] of Reserved Directory


SECTION HEADER #1
   .text name
    104D virtual size
    1000 virtual address
    1200 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
         (no align specified)
         Execute Read

SECTION HEADER #3
   .data name
     106 virtual size
    4000 virtual address
     200 size of raw data
    1A00 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
         (no align specified)
         Read Write

...

¿Entonces donde estara nuestro codigo? En 00830000 + 1000, veamos que hay ahi:

0:000> u 0x1000+hi.exe
hi!ILT+0(_main)+0xffffffff`fffffffb:
00831000 cc              int     3
00831001 cc              int     3
00831002 cc              int     3
00831003 cc              int     3
hi!ILT+0(_main)  (hi+0x1004):
00831004 cc              int     3
hi!ILT+0(_main):
00831005 e906000000      jmp     hi!main (00831010)
0083100a cc              int     3
0083100b cc              int     3

¿Cual era el punto de entra segun las cabeceras? 00831005, donde hay un salto a nuestra funcion main.

0:000> uf 00831010
hi!main [c:\src\hi.cpp @ 6]:
    6 00831010 55              push    ebp
    6 00831011 8bec            mov     ebp,esp
    6 00831013 51              push    ecx
    7 00831014 cc              int     3
    8 00831015 c745fc01000000  mov     dword ptr [ebp-4],1 ;aca esta la X, en la pila, no en una sección del ejecutable
    9 0083101c 8b45fc          mov     eax,dword ptr [ebp-4]
    9 0083101f 50              push    eax
    9 00831020 6800408300      push    offset hi!msg (00834000) ;.data
    9 00831025 6800408300      push    offset hi!msg (00834000) ;.data
    9 0083102a 6a00            push    0
    9 0083102c ff1500508300    call    dword ptr [hi!_imp__MessageBoxA (00835000)]
   10 00831032 33c0            xor     eax,eax
   10 00831034 8be5            mov     esp,ebp
   10 00831036 5d              pop     ebp
   10 00831037 c3              ret

¿Donde esta msg? En la sección de datos .data, veamosla:

0:000> db 4000+hi.exe
00834000  68 6f 6c 61 00 00 00 00-00 00 00 00 00 00 00 00  hola............

Hay sección omitidas arriba, las vamos a obviar para simplificar.  Y si vamos agregando funciones seran ubicadas en la sección de codigo (.code) por defecto.
En línea

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
.xAk.


Desconectado Desconectado

Mensajes: 397


F0r3v3R NeWbI3


Ver Perfil WWW
Re: localizacion de funciones o metodos..
« Respuesta #3 en: 4 Febrero 2022, 22:02 pm »

Se puede ver también en el preprocesado, los compiladores permiten mostrarlo, por ejemplo gcc -E g++ -E cl /P  y se ve en orden.
En línea


digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: localizacion de funciones o metodos..
« Respuesta #4 en: 2 Abril 2022, 20:43 pm »

Muchas gracias por las aclaraciones.
En línea

Dungeons & dragons;
dragons.Attack();
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: localizacion de funciones o metodos..
« Respuesta #5 en: 3 Abril 2022, 09:02 am »

De nada.
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
localizacion IP
Dudas Generales
carlotta 7 9,464 Último mensaje 2 Mayo 2011, 18:26 pm
por el-brujo
sobrecarga de metodos, se puede aplicar en metodos abstract o interfaces?
Desarrollo Web
jhonatanAsm 0 3,219 Último mensaje 16 Agosto 2011, 00:22 am
por jhonatanAsm
Mi localizacion de mi IP... « 1 2 »
Hacking
x64core 11 17,155 Último mensaje 16 Septiembre 2011, 20:57 pm
por el-brujo
¿Sobrecargar las funciones standard o crear nuestros propios metodos? [PYTHON]
Scripting
Yidu 2 3,212 Último mensaje 15 Enero 2017, 18:31 pm
por Yidu
localizacion
Foro Libre
mz39720 0 1,560 Último mensaje 8 Noviembre 2017, 19:43 pm
por mz39720
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines