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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda GetProcAddress
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda GetProcAddress  (Leído 2,651 veces)
naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Duda GetProcAddress
« en: 5 Marzo 2013, 02:41 am »

Buenas a todos, he visto varios códigos donde hacen algo como esto:

Código
  1. GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxA");
  2.  

Entiendo que obtiene la dirección de memoria de la función MessageBoxA, pero lo que no logro entender es cómo es que es la misma dirección para todos los procesos? No se si me explico bien, pero no entiendo como funciona esto.


En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Duda GetProcAddress
« Respuesta #1 en: 5 Marzo 2013, 03:06 am »

Buenas a todos, he visto varios códigos donde hacen algo como esto:

Código
  1. GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxA");
  2.  

Entiendo que obtiene la dirección de memoria de la función MessageBoxA, pero lo que no logro entender es cómo es que es la misma dirección para todos los procesos? No se si me explico bien, pero no entiendo como funciona esto.

Cada proceso tiene su propio espacio de memoria virtual ( el tamaño depende de la version de Windows que se ha instalado en el sistema: 32, 64 bits ).
El manipulador de memoria sabe cuando desmapear una pagina de memoria cuando ya no es usada y cuando volver a mapearla para su uso.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366912(v=vs.85).aspx
http://en.wikipedia.org/wiki/Virtual_memory


En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Duda GetProcAddress
« Respuesta #2 en: 5 Marzo 2013, 03:15 am »

Mi duda me surge cuando vi este código:

Código
  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. typedef int (WINAPI *_MessageBoxA)(HWND, LPCTSTR, LPCTSTR, UINT);
  5.  
  6. struct sTDatos_MessageBoxA
  7. {
  8.    _MessageBoxA direccionMessageBoxA;
  9.    char titulo[255], texto[255];
  10. };
  11.  
  12. typedef struct sTDatos_MessageBoxA TDatos_MessageBoxA;
  13.  
  14. void Hilo_MessageBoxA(TDatos_MessageBoxA *datos)
  15. {
  16.    datos->direccionMessageBoxA(0, datos->texto, datos->titulo, 0);
  17. }
  18.  
  19. void Inyectar_MessageBoxA(DWORD pID, char* titulo, char* texto)
  20. {
  21.    DWORD tamFunc;
  22.    HANDLE tHandle, funcionRemota;
  23.    TDatos_MessageBoxA datos, *direccionDatosRemotos;
  24.    void* direccionFuncionRemota;
  25.  
  26.    tHandle = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, 0, pID);
  27.  
  28.    datos.direccionMessageBoxA = (_MessageBoxA)GetProcAddress(GetModuleHandle("USER32.DLL"), "MessageBoxA");
  29.    sprintf(datos.titulo, titulo);
  30.    sprintf(datos.texto, texto);
  31.  
  32.    direccionDatosRemotos = (TDatos_MessageBoxA*)VirtualAllocEx(tHandle, 0, sizeof(TDatos_MessageBoxA), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
  33.    WriteProcessMemory(tHandle, direccionDatosRemotos, &datos, sizeof(TDatos_MessageBoxA), NULL);
  34.  
  35. tamFunc = (DWORD)Inyectar_MessageBoxA - (DWORD)Hilo_MessageBoxA;
  36.  
  37. direccionFuncionRemota = VirtualAllocEx(tHandle, 0, tamFunc, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  38. WriteProcessMemory(tHandle, direccionFuncionRemota, (void*)Hilo_MessageBoxA, tamFunc, NULL);
  39.  
  40. funcionRemota = CreateRemoteThread(tHandle, NULL, 0, (LPTHREAD_START_ROUTINE)direccionFuncionRemota, direccionDatosRemotos, 0, NULL);
  41.  
  42. WaitForSingleObject(funcionRemota,INFINITE);
  43.   CloseHandle(funcionRemota);
  44.  
  45.   VirtualFreeEx(tHandle,direccionFuncionRemota,0,MEM_RELEASE);
  46.   VirtualFreeEx(tHandle,direccionDatosRemotos,0,MEM_RELEASE);  
  47.  
  48.   CloseHandle(tHandle);  
  49. }
  50.  
  51. int main()
  52. {
  53.    DWORD pID;
  54.    HWND hWnd;
  55.  
  56.    hWnd = FindWindow("SciCalc", NULL);
  57.  
  58.    if(hWnd!=NULL)
  59.    {
  60.        GetWindowThreadProcessId(hWnd, &pID);
  61.        Inyectar_MessageBoxA(pID, "descifra.me", "Codigo inyectado!");
  62.    }
  63.  
  64.    return 0;
  65. }
  66.  

Cómo es que al crear un hilo en otro proceso se puede utilizar esta dirección en el hilo creado en el otro proceso:

datos.direccionMessageBoxA = (_MessageBoxA)GetProcAddress(GetModuleHandle("USER32.DLL"), "MessageBoxA");

Me surge la duda porque la llamada a GetModuleHandle se hace en un proceso distinto.
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Duda GetProcAddress
« Respuesta #3 en: 5 Marzo 2013, 03:24 am »

Cuando el loader de Windows carga un .exe, carga modulos tales como ntdll, kernel32,etc
Por ser los primeros es que podria no haber conflicto entre espacios de memoria entre modulos por eso cada modulo de cada proceso
podría cargarse en el mismo espacio de memoria de un proceso, aunque yo preferiría obtener la direcciones de funciones desde el proceso 
en el que se ha inyectado el codigo, ese codigo no es la mejor forma de inyección.
En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Duda GetProcAddress
« Respuesta #4 en: 5 Marzo 2013, 03:38 am »

Muchas gracias por la aclaratoria x64Core esa era mi duda
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
GetProcAddress alternative function
Programación Visual Basic
cobein 2 3,148 Último mensaje 9 Octubre 2008, 00:24 am
por cobein
[MASM32] KernelBase Address + GetProcAddress
Análisis y Diseño de Malware
The Swash 0 3,632 Último mensaje 9 Mayo 2011, 02:23 am
por The Swash
Duda con GetProcAddress
Ingeniería Inversa
.:UND3R:. 5 4,358 Último mensaje 8 Agosto 2011, 19:35 pm
por .:UND3R:.
[resuelto] Ayuda con GetProcAddress
Programación C/C++
xiruko 5 3,583 Último mensaje 27 Noviembre 2012, 22:58 pm
por xiruko
no logro invocar a getprocaddress en masm 64 bits
ASM
Belial & Grimoire 3 3,326 Último mensaje 6 Agosto 2013, 06:10 am
por Belial & Grimoire
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines