RT_MAINFEST 文件

概述: MAINFEST文件说明及相关使用

0x01 可以指定加载的dll

可以通过修改 MAINFEST 文件内容来修改 dll 的加载位置。

示例:

如下所示分别指定了 vcruntime140d.dllucrtbased.dlllibcrypto-3.dlllibssl-3.dll 四个dll的加载路径

1
2
3
4
5
6
7
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<file name="vcruntime140d.dll" loadFrom="C:\Users\holdy\Documents\TestMySQL\temp1\vcruntime140d.dll"></file>
<file name="ucrtbased.dll" loadFrom="C:\Users\holdy\Documents\TestMySQL\temp1\ucrtbased.dll"></file>
<file name="libcrypto-3.dll" loadFrom="D:\Documents\A_Source\WindowsTec\Debug\mysqlcppconn8-static-debug-openssl3-mtd\libcrypto-3.dll"></file>
<file name="libssl-3.dll" loadFrom="D:\Documents\A_Source\WindowsTec\Debug\mysqlcppconn8-static-debug-openssl3-mtd\libcrypto-3.dll"></file>
</assembly>

0x02 自动提升Vista、Win7上进程的权限–RT_MANIFEST

很多时候自己开发的应用程序需要以更高的用户权限来运行,特别是在Vista、Win7下面。

如何使得自己编写的应用程序在运行时也如同下面的方式一样,提示权限提升。

方法:

  1. 按照通常方式,开发VC程序,编译、生成.exe文件;

  2. 在Debug或Release文件夹下面,新建一个“程序名+.exe+.manifest”的文件。若你生成的应用程序名称叫MyApp.exe,在MyApp.exe所在的目录下新建一个名称为MyApp.exe.manifest的文件,将该文件以文本方式打开(如notepad)

  3. 将下面的此段XML,粘贴到刚刚新建的MyApp.exe.manifest文件中,并保存。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
    <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
    <requestedPrivileges>
    <requestedExecutionLevel level='requireAdministrator' uiAccess='false' />
    </requestedPrivileges>
    </security>
    </trustInfo>
    </assembly>

    requestedExecutionLevel元素中的“level”属性可以取下面的值(比较简单的英文,相信大家都能看懂)。

  4. 运行.Net Visual Studio命令提示符(注意是.Net下类似cmd.exe的工具,不是Windows附件里面的cmd.exe)。如果你安装了Visual Studio .Net 2003 或 2005 、2008、2010等开发工具,在开始菜单->Visual Studio 2003或2005->Visual Studio工具下面可以找到该工具。

  5. 运行.Net Visual Studio命令提示符之后,将当前目录更改到你应用程序(MyApp.exe)所在的目录下面,之后输入如下命令:

mt.exe -manifest “MyApp.exe.manifest” -outputresource:“MyApp.exe”;#1

(此处的MyApp要替换成你自己应用程序的名字)

  1. 之后再到你应用程序的目录下面就会看到,现在应用程序的图标比原来多了一个安全盾。
    运行程序就会出现提示。

注:如果您开发的是动态链接库DLL。则在.Net Visual Studio命令提示符中输入的命令应该为:

1
mt.exe -manifest "MyApp.dll.manifest" -outputresource:"MyApp.dll";#2

最后,读者不妨自己测试一下本文所讲的方法,在Vista或Win7系统下,编写一个修改系统时间的简单应用,在不采用此方法之前,看能否修改成功。如果不能试试本文讲述的方法,然后运行程序再看看能否修改成功。

修改系统时间的代码如下:

COleDateTime tm;
SYSTEMTIME st;
tm.ParseDateTime(_T(“2000-10-10 17:00:00”));
tm.GetAsSystemTime(st);
SetLocalTime(&st);

在Vista下提升应用程序的执行权限

在 vista系统应用程序执行时默认不会使用超级用户权限,这会使一些创建文件和目录的IO操作失败,出现访问错误.这种现象是因为Vista的UAC特性 引起的.

要避免这种情况,可以强制用户在运行应用程序时以超级用户权限执行程序.具体做法:

  1. 编辑manifest文 件. 在manifest文件中配置好应用程序执行时需要的参数和执行环境.下面是一个实际例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.0.0.0"
    processorArchitecture="X86"
    name="IsUserAdmin"
    type="win32"/>

    <description>Description of your application</description>
    <!-- Identify the application security requirements. -->
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
    <requestedPrivileges>
    <requestedExecutionLevel
    level="requireAdministrator"
    uiAccess="false"/>
    </requestedPrivileges>
    </security>
    </trustInfo>

    </assembly>
  2. 编辑应用程序的资源文件(rc后缀的文件),在其中加入下面两行代码:

    1
    #define MANIFEST_RESOURCE_ID 1MANIFEST_RESOURCE_ID RT_MANIFEST "{Application.exe}.manifest"

    其中 Application.exe 替换成要编译生成的可执行文件名.

  3. 编译链接程序,生成可执行应用程序.

  4. 运行 mt.exe命令,把manifest文件和生成的可执行程序链接起来.把manifest内容写入可执行文件.
    命令行为:

    1
    mt.exe –manifest temp.manifest –outputresource:YourApp.exe;#1

    到这一步,生成的可执行文件就可以在vista下运行时弹出UAC确认框,让用户确认以超级用户权限执行应用程序.


RT_MAINFEST 文件
https://hodlyounger.github.io/2023/10/27/A_OS/Windows/文件与结构体/【WIN】RT_MAINFEST/
作者
mingming
发布于
2023年10月27日
许可协议