RT_MAINFEST 文件
概述: MAINFEST文件说明及相关使用
0x01 可以指定加载的dll
可以通过修改 MAINFEST 文件内容来修改 dll 的加载位置。
示例:
如下所示分别指定了 vcruntime140d.dll
、 ucrtbased.dll
、 libcrypto-3.dll
、libssl-3.dll
四个dll的加载路径
1 |
|
0x02 自动提升Vista、Win7上进程的权限–RT_MANIFEST
很多时候自己开发的应用程序需要以更高的用户权限来运行,特别是在Vista、Win7下面。
如何使得自己编写的应用程序在运行时也如同下面的方式一样,提示权限提升。
方法:
-
按照通常方式,开发VC程序,编译、生成.exe文件;
-
在Debug或Release文件夹下面,新建一个“程序名+.exe+.manifest”的文件。若你生成的应用程序名称叫MyApp.exe,在MyApp.exe所在的目录下新建一个名称为MyApp.exe.manifest的文件,将该文件以文本方式打开(如notepad)
-
将下面的此段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”属性可以取下面的值(比较简单的英文,相信大家都能看懂)。
-
运行.Net Visual Studio命令提示符(注意是.Net下类似cmd.exe的工具,不是Windows附件里面的cmd.exe)。如果你安装了Visual Studio .Net 2003 或 2005 、2008、2010等开发工具,在开始菜单->Visual Studio 2003或2005->Visual Studio工具下面可以找到该工具。
-
运行.Net Visual Studio命令提示符之后,将当前目录更改到你应用程序(MyApp.exe)所在的目录下面,之后输入如下命令:
mt.exe -manifest “MyApp.exe.manifest” -outputresource:“MyApp.exe”;#1
(此处的MyApp要替换成你自己应用程序的名字)
- 之后再到你应用程序的目录下面就会看到,现在应用程序的图标比原来多了一个安全盾。
运行程序就会出现提示。
注:如果您开发的是动态链接库DLL。则在.Net Visual Studio命令提示符中输入的命令应该为:
1 |
|
最后,读者不妨自己测试一下本文所讲的方法,在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特性 引起的.
要避免这种情况,可以强制用户在运行应用程序时以超级用户权限执行程序.具体做法:
-
编辑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> -
编辑应用程序的资源文件(rc后缀的文件),在其中加入下面两行代码:
1
#define MANIFEST_RESOURCE_ID 1MANIFEST_RESOURCE_ID RT_MANIFEST "{Application.exe}.manifest"
其中 Application.exe 替换成要编译生成的可执行文件名.
-
编译链接程序,生成可执行应用程序.
-
运行 mt.exe命令,把manifest文件和生成的可执行程序链接起来.把manifest内容写入可执行文件.
命令行为:1
mt.exe –manifest temp.manifest –outputresource:YourApp.exe;#1
到这一步,生成的可执行文件就可以在vista下运行时弹出UAC确认框,让用户确认以超级用户权限执行应用程序.