es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Windows XP – VirtualAlloc() cómo hacerlo (¿dónde está memoryapi.h???)

Necesito usar VirtualAlloc() en una aplicación de código C para ejecutar un fragmento de código ensamblador utilizando un puntero de memoria. Estoy intentando construir el código en Windows XP de 32 bits con fines de prueba, pero no encuentro una forma de utilizar VirtualAlloc().

Instalé el último paquete redistribuible de Visual C++ disponible siguiendo la sugerencia de Microsoft aquí:
https://learn.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist?view=msvc-170

¿Algún consejo? Gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para utilizar VirtualAlloc() en una aplicación de código C con el fin de ejecutar un fragmento de código en ensamblador utilizando un puntero de memoria en Windows XP de 32 bits, se deben seguir los siguientes pasos:

    1. Asegúrese de tener instalado el paquete redistribuible más reciente de Visual C++. Puede descargarlo desde el sitio web de Microsoft en https://learn.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist?view=msvc-170.
    2. En el código C, incluya el archivo de encabezado Windows.h, el cual contiene las definiciones necesarias para trabajar con la función VirtualAlloc().

    3. Declare una variable puntero para almacenar la dirección del bloque de memoria asignada por la función VirtualAlloc(), de la siguiente manera:

      LPVOID lpMem = NULL;
      

    4. Llame a la función VirtualAlloc() para asignar un bloque de memoria con el tamaño y los indicadores de protección deseados. Por ejemplo, para asignar un bloque de memoria con permisos de lectura, escritura y ejecución, utilice el siguiente código:
      lpMem = VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
      

      Aquí, dwSize es el tamaño del bloque de memoria a asignar, el cual se puede determinar a partir del tamaño del código en ensamblador. El indicador MEM_COMMIT especifica que la memoria debe asignarse de inmediato, y el indicador PAGE_EXECUTE_READWRITE especifica que el bloque de memoria debe tener permisos de ejecución, lectura y escritura.

    5. Una vez que se haya asignado el bloque de memoria, copie el código en ensamblador al bloque de memoria utilizando la variable puntero, de la siguiente manera:

      memcpy(lpMem, pAssemblyCode, dwSize);
      

      Aquí, pAssemblyCode es un puntero al código en ensamblador, y dwSize es el tamaño del código.

    6. Por último, llame al puntero de función que apunta al bloque de memoria que contiene el código en ensamblador, de la siguiente manera:

      ((void(*)())lpMem)();
      

      Esto ejecutará el código en ensamblador almacenado en el bloque de memoria asignado.

    Siguiendo estos pasos, debería ser posible utilizar VirtualAlloc() en una aplicación de código C para ejecutar un fragmento de código en ensamblador utilizando un puntero de memoria en Windows XP de 32 bits.

Comments are closed.