Malware
  • La Biblia del Desarrollo de Malware para Windows
  • Introducción al Malware
    • ¿Qué es el Malware?
    • La Historia del Malware
    • Clasificación del Malware
    • Métodos de Distribución del Malware
  • Los Malwares Más Impactantes de la Historia
    • Stuxnet: El Malware que Destruyó una Planta Nuclear
    • Pegasus: El Malware Espía de Nivel Estatal
  • Introducción al Desarrollo de Malware
    • Herramientas y Lenguajes Más Comunes en el Desarrollo de Malware
    • Lenguajes Recomendados para el Desarrollo de Malware
    • Binarios Famosos de Windows y sus Lenguajes de Desarrollo
    • Fundamentos de compilacion
    • Nuestro primer "Malware"
    • Malware: Del Disco a la Memoria
  • APIs de Windows
    • Windows Internals
    • Windows on Windows (WOW)
    • Bibliotecas DLL en la Tecnología WOW64
    • Win32 APIs: El Corazón del Desarrollo de Software en Windows
      • Componentes Clave de las Win32 APIs
      • Cómo Funcionan las Win32 APIs y su relacion con el Malware
      • Uso de Win32 con C#
    • Kernel32.dll: La Biblioteca Fundamental en el Sistema Operativo Windows
      • VirtualAlloc en C#: Asignación y Gestión de Memoria
      • RtlMoveMemory: Copia de Memoria en Windows
      • CreateThread en C#: Creación y Manejo de Hilos
    • AllocationType y MemoryProtection
    • Windows Registry
  • Shell Reverse
    • Fundamentos de reverse shell
    • Desarrollando Nuestro Primer Simple Reverse Shell via TCP
      • C#
      • PowerShell
      • Python
Powered by GitBook
On this page
  1. APIs de Windows
  2. Win32 APIs: El Corazón del Desarrollo de Software en Windows

Uso de Win32 con C#

using System;
using System.Runtime.InteropServices;

class Program
{
    // Importamos la biblioteca "advapi32.dll", que contiene funciones para la gestión de seguridad y usuarios en el sistema operativo Windows.
    // En este caso, utilizamos GetUserName para obtener el nombre de usuario del sistema actual.
    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    // Definimos la firma de la función GetUserName, especificando que toma un buffer de caracteres y un valor de tamaño de buffer como parámetros.
    // El atributo "Out" indica que lpBuffer será llenado con el valor de retorno.
    // El atributo "In, Out" en pcbBuffer indica que el valor se pasa y se puede modificar para indicar el tamaño del nombre del usuario.
    public static extern bool GetUserName(
        [Out] char[] lpBuffer,          // Buffer donde se almacenará el nombre del usuario.
        [In, Out] ref uint pcbBuffer   // Tamaño del buffer (en caracteres). Al salir de la función, contiene el número de caracteres que contiene el nombre de usuario.
    );

    static void Main(string[] args)
    {
        // Declaramos un arreglo de caracteres llamado buffer con un tamaño de 256, lo suficiente para contener el nombre de usuario.
        char[] buffer = new char[256];
        // Inicializamos la variable bufferSize con el tamaño del buffer. Esta variable será modificada para reflejar el tamaño real del nombre de usuario.
        uint bufferSize = (uint)buffer.Length;

        // Llamamos a la función GetUserName, pasando el buffer y el tamaño del buffer. 
        // Si la llamada tiene éxito, la función devolverá true y almacenará el nombre de usuario en el buffer.
        if (GetUserName(buffer, ref bufferSize))
        {
            // Creamos una nueva cadena (string) a partir de los caracteres almacenados en el buffer.
            // Usamos el tamaño del buffer (pcbBuffer) para determinar la longitud de la cadena, restando 1 para excluir el carácter de terminación nulo.
            string username = new string(buffer, 0, (int)bufferSize - 1);
            // Imprimimos el nombre de usuario en la consola.
            Console.WriteLine("Nombre de usuario: " + username);
        }
        // Esperamos la entrada del usuario para evitar que la consola se cierre inmediatamente después de la ejecución.
        Console.ReadLine();
    }
}

El código proporcionado es un ejemplo de cómo interactuar con la API de Windows usando P/Invoke en C# para llamar a funciones de Win32. Específicamente, utiliza la función GetUserName de la biblioteca advapi32.dll para obtener el nombre de usuario del sistema operativo en el que se ejecuta el programa. Las Win32 APIs proporcionan una interfaz estándar para interactuar con el sistema operativo a nivel de bajo nivel, y se utilizan ampliamente en aplicaciones que requieren acceso a características esenciales del sistema como manejo de archivos, redes, autenticación y más.

La función GetUserName es parte de advapi32.dll, una biblioteca dinámica que maneja operaciones avanzadas de seguridad y autenticación en Windows. Esta función recupera el nombre de usuario de la cuenta actual que está ejecutando el programa. El uso de P/Invoke en C# permite llamar a esta función de Win32 desde el código administrado, lo cual es esencial cuando se necesita acceder a funcionalidades del sistema operativo fuera del alcance de la biblioteca .NET estándar.

PreviousCómo Funcionan las Win32 APIs y su relacion con el MalwareNextKernel32.dll: La Biblioteca Fundamental en el Sistema Operativo Windows

Last updated 5 months ago