Personalizar un archivo de manifiesto EXE

Personalice el manifiesto EXE de Windows para controlar privilegios, habilitar conciencia DPI y mejorar la seguridad editando el manifiesto predeterminado con herramientas de recursos. Aprenda a crear, modificar y firmar manifiestos para una ejecución segura y confiable.

Personalizando un archivo de manifiesto EXE

Customizing an EXE Manifest File

Cuando compilas un proyecto para una plataforma de destino Windows, RAD Studio incluye automáticamente un archivo de manifiesto de aplicación. Puedes usar el archivo de manifiesto de aplicación predeterminado como base para tu archivo de manifiesto de aplicación personalizado:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 <dependency>
   <dependentAssembly>
     <assemblyIdentity
       type="win32"
       name="Microsoft.Windows.Common-Controls"
       version="6.0.0.0"
       publicKeyToken="6595b64144ccf1df"
       language="*"
       processorArchitecture="*"/>
   </dependentAssembly>
 </dependency>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
   <security>
     <requestedPrivileges>
       <requestedExecutionLevel
         level="asInvoker"
         uiAccess="false"/>
       </requestedPrivileges>
   </security>
 </trustInfo>
</assembly>

Creando un archivo de manifiesto de aplicación personalizado

Para hacerlo, solo necesitas un programa Resources hacker/inspector que te permita cambiar el manifiesto de un archivo EXE.

Personalmente uso el software de Angus Johnson desde hace mucho tiempo porque es simple y fácil de usar.

Image1

Cambiando el nivel de elevación requerido

El manifiesto de aplicación predeterminado declara el nivel de elevación requerido como asInvoker. Eso significa que tu aplicación tendrá el mismo nivel de elevación que su proceso padre. Si deseas elevar tu aplicación al nivel de privilegio de Administrador en Windows, simplemente cambia el valor del atributo level en la etiqueta requestedExecutionLevel de asInvoker a requireAdministrator.

Puedes agregar eso a la sección TrustInfo y a la etiqueta <security> donde agregarás tanto el Level como el uiAccess al Nivel de Ejecución Solicitado:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
        </requestedPrivileges>
    </security>
</trustInfo>
  • uiAccess

    • false — La aplicación no necesita enviar entradas a la interfaz de usuario de otra ventana en el escritorio. Las aplicaciones que no proporcionan accesibilidad deben establecer este indicador en false. Las aplicaciones que necesiten enviar entradas a otras ventanas en el escritorio (por ejemplo, teclado en pantalla) deben establecer este valor en true.

    • true — La aplicación puede omitir los niveles de protección de la interfaz para enviar entradas a ventanas con privilegios superiores en el escritorio. Esta configuración debe usarse solo para aplicaciones de accesibilidad de UI.

  • Level : Aquí puedes encontrar una tabla que explica el Nivel declarado en el manifiesto de la aplicación y su comportamiento

Table

**

Cambiando la conciencia DPI

Para crear una aplicación consciente del DPI, necesitas declarar la conciencia DPI en el manifiesto de la aplicación. Por ejemplo, para declarar que tu aplicación es consciente del DPI por monitor, añade lo siguiente antes de la etiqueta de cierre </assembly>:

<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
   <asmv3:windowsSettings
        xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
     <dpiAware>True/PM</dpiAware>
   </asmv3:windowsSettings>
</asmv3:application>

Probando los privilegios de administrador

El siguiente fragmento de código puede servir como una prueba rápida para verificar si tu aplicación requiere (y tiene concedidos correctamente) privilegios de nivel Administrador. Declara el nivel de elevación requerido de tu aplicación como requireAdministrator y ejecuta el siguiente procedimiento:

C++:

#include <System.Win.Registry.hpp>
#include <Winapi.Windows.hpp>

void __fastcall isAdmin(TObject *Sender){
    TRegistry *reg;
    bool openResult;
    reg = new TRegistry(KEY_READ);
    reg->RootKey = HKEY_LOCAL_MACHINE;
    reg->Access = KEY_WRITE;
    openResult = reg->OpenKey("Software\\MyCompanyName\\MyApplication\\" , true);
    if (openResult != true){
        MessageDlg("No se puede escribir en el registro. Su aplicación NO tiene privilegios de nivel Administrador.",
                    TMsgDlgType::mtError, mbOKCancel, 0);
    }else{
        MessageDlg("Escritura en el registro permitida. Su aplicación tiene privilegios de nivel Administrador.",
                    TMsgDlgType::mtInformation, mbOKCancel, 0);
    }
    reg->CloseKey();
    reg->Free;
}
  • La aplicación mostrará uno de los siguientes mensajes:

    • No se puede escribir en el registro. Su aplicación NO tiene privilegios de nivel Administrador.

    • Escritura en el registro permitida. Su aplicación tiene privilegios de nivel Administrador.

Esta prueba funciona porque necesitas privilegios de nivel Administrador para escribir en la parte HKEY_LOCAL_MACHINE\Software del registro.
El fragmento en realidad no escribe nada en el registro, solo solicita el permiso de escritura.

Asegúrate de compilar tu aplicación y luego ejecutarla fuera del IDE, porque el IDE depurará la aplicación con privilegios de nivel Administrador por defecto (sin respetar tu manifiesto de aplicación).

© 2021 - Sofiane Hamlaooui - Haciendo del mundo un lugar mejor 🌎

Obtener insights de IA sobre este artículo

I just do cybersecurity stuff.

Discusión

Deja un Comentario

Los comentarios de invitados serán revisados antes de aparecer en el sitio.

Aún no hay comentarios. ¡Sé el primero en iniciar la discusión!

¿Sugerencias o reportar un error? ¡Contáctanos!