使用清单的 DLL 重定向

2023-12-10

我需要可靠地重定向应用程序对特定 DLL 的查找。使用 app.exe.local 方法不起作用,因为如果应用程序具有清单(嵌入或单独的文件),则本地文件将被忽略。因此,我尝试通过在清单中将 DLL 定义为私有程序集来进行 DLL 重定向。

我有一个测试应用程序 LoadDll.exe 它只是调用

LoadLibrary("C:\\EmptyDll.dll");

LoadDll.exe 具有清单(作为单独的文件,LoadDll.exe.manifest)

<?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.1"
  processorArchitecture="x86"
  name="LoadDll"
  type="win32"
/>
<dependency>
  <dependentAssembly>
    <assemblyIdentity
      type="win32"
      name="EmptyDll"
      version="1.0.0.1"
      processorArchitecture="x86"
    />
  </dependentAssembly>
</dependency>
</assembly>

包含 LoadDll.exe 的应用程序文件夹(不是 c:\)包含带有嵌入式清单的 EmptyDll.dll。

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<assemblyIdentity
      type="win32"
      name="EmptyDll"
   version="1.0.0.1"
      processorArchitecture="x86"
    />    
</assembly>

但是,LoadDll.exe 会继续加载 C:\EmptyDll.dll,而不是应用程序文件夹中的 EmptyDll.dll。

如果您破坏任一清单(例如更改 EmptyDll.dll 清单标识中的版本号),LoadDll.exe 不会加载,因此 Windows 会读取和处理清单文件,但只是将其忽略。

有人有什么想法吗?

Thanks!

Toby


所以看来不可能将呼叫重定向到LoadLibrary使用清单的绝对路径。

经过多次使用清单后,似乎一旦你克服了所有糟糕的文档清单,实际上就变得非常简单了。

基本上,当加载可执行文件时,Windows 会收集使用标识和依赖元素链接的所有相关清单。然后,对于清单文件中包含的每个文件元素,它会在激活上下文中添加一个条目:

'name attribute of file element' -> 'absolute path of manifest file' + 'name attribute of file element'

现在,当进行加载库调用时,它会在激活上下文映射中搜索与加载库的路径参数匹配的键,然后调用Loadlibrary以及该键的值。

所以如果我的应用程序c:\foo\foo.exe依赖于清单c:\foo\baa\baa.manifest, and baa.manifest包含一个文件元素<file name="empty.dll"/>,那么激活上下文将具有映射:"empty.dll" -> "c:\foo\baa\empty.dll"

所以任何电话LoadLibrary("empty.dll")将被重定向到LoadLibrary("C:\foo\baa\empty.dll").

然而,LoadLibrary("c:\anotherpath\empty.dll")不会被重定向!

现在来证明我的观点:清单文件和激活上下文是多么简单。如果 baa.manifest 的文件元素是<file name="c:\anotherpath\empty.dll"/>你做了一个LoadLibrary("C:\anotherpath\empty.dll")调用时,LoadLibrary 调用将被重定向到LoadLibrary("C:\foo\baa\C:\anotherpath\empty.dll"),是的,一条畸形的路径......

file 元素确实有一个名为“loadFrom”的未记录属性,它的作用正如听起来的那样,并且似乎非常适合解决这个问题。使用 loadFrom,我能够重定向绝对路径 loadlibrary 调用,但它似乎以奇怪的方式搞砸了可执行文件中的其他依赖项。如果有人了解更多有关“loadFrom”如何工作的信息,我会非常感兴趣。

那么我的问题最后是怎么解决的呢?通过使用令人难以置信的 DLL 特洛伊木马方法,描述于道德黑客。基本上,您创建一个虚拟 kernel32.dll,它将所有调用重定向到原始 kenerl32.dll,但 LoadLibrary 调用除外,您可以在其中放置自己的重定向逻辑。然后在应用程序清单中,放置一个文件元素,将 kernel32.dll 重定向到您的虚拟文件。乐趣。

这一切描述了我在Windows Xp Sp2上的实验。为了获得额外的乐趣,我相信清单在几乎每个版本的 Windows 上都有不同的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用清单的 DLL 重定向 的相关文章

  • 具有不同大小结构的结构数组的 malloc()

    如果每个结构都包含一个大小不同的字符串数组 那么如何正确地 malloc 一个结构数组 因此每个结构可能有不同的大小 并且不可能 realloc 结构体数量 sizeof 结构体名称 after malloc 初始大小 sizeof 结构名
  • clang 格式换行符在错误的位置

    给出以下代码行 get abc manager get platform status abc platform status sw update status fill update status actions allowed stat
  • 分段错误(核心转储)错误

    我的程序编译罚款 但在输入文件时出现 分段错误 核心转储 错误 我没有正确处理 ostream 吗 include
  • 内联函数/方法

    声明 内联函数必须在调用之前定义 这个说法正确吗 EDIT 该问题最初是德语 内联功能穆森 弗 伊赫雷姆 奥夫鲁夫定义 sein 也许它对任何人都有帮助 是的 它是正确的 但只是部分正确 它可能正确地重新构建如下 内联函数必须在每个翻译单位
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • SSL/TLS/HTTPS 站点在 C#/.NET WebBrowser 控件中非常慢,但在 Internet Explorer 中则很好

    背景 我正在修改自动维基浏览器 http en wikipedia org wiki Wikipedia AutoWikiBrowser使用托管在安全服务器上的 MediaWiki 站点 我允许用户通过 C 应用程序中的 WebBrowse
  • 在 C++ 中将成对向量转换为两个独立向量的最快方法

    假设我有一个vector of pair
  • 为什么大多数平台上没有“aligned_realloc”?

    MSVC有自己的非标准函数 aligned malloc aligned realloc and aligned free C 17和C11引入了 std aligned alloc 其结果可以是de分配有free or realloc B
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • C++ 错误 - “成员初始值设定项表达式列表被视为复合表达式”

    我收到一个我不熟悉的 C 编译器错误 可能是一个非常愚蠢的错误 但我不能完全指出它 Error test cpp 27 error member initializer expression list treated as compound
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐

  • 无法使用 .NET 验证 JSON Web 令牌 – 密钥太短

    我用过JSONWebTokennpm 模块生成 jwt var jwt require jsonwebtoken var payload iss https secure example com exp 1410819380 http ex
  • `Apache` `localhost/~用户名/` 不工作

    所以我最近刚刚升级到 Mac OS X Yosemite 我需要再次设置我的 Apache 我在下面创建一个文件夹 Sites user kevin并将文件权限更改为 777 并取消注释 php5module 行 etc apache2 h
  • 使用变量中存储的类型进行 PowerShell 类型转换

    我想将 NET 对象转换为另一个 NET 类型 但是 目标 NET类型 类 存储在变量中 我不想使用 asPowerShell 运算符 我正在使用复杂的非原始类型 你将如何实现这一目标 例如 这是 PowerShell 的方式来做到这一点
  • Linux 上具有零端口的 CommPortIdentifier.getPortIdentifiers

    我正在尝试连接 ubuntu 上的串行端口 但是 它对我不起作用 我在 Windows 上成功运行了同一个项目 只是使用了不同的驱动程序 问题是我在使用它时无法加载任何端口 CommPortIdentifier getPortIdentif
  • 授予对封装容器的访问权限

    class X public typedef std list
  • 如何使用 C# 解压 docx 文件?

    如何使用 C 解压 docx 文件 新的 Office 文件扩展名 docx potx xlsx 等 在上传到 Web 服务器然后下载时会变成 zip 文件 这些文件格式现在使用 Open XML 文件格式系统 因此它们与 Google O
  • 将 .org 指令与 .data 部分中的数据一起使用:与 ld 相关

    在我努力了解如何使用 GNU binutils 来构建一个简单的引导加载程序时 使用gas我遇到过这样的问题 如何告诉链接器将数据放置在使用 org 推进位置计数器的文件中 同时将文件大小保持在 512 字节 我似乎找不到办法做到这一点 尝
  • 创建 Gmail 共享链接

    我想在我的单页 Web 应用程序上放置一个按钮 允许用户通过 Gmail 发送链接 我发现有些网站 例如 addthis com 提供了这样的按钮 但是该按钮自动使用网址栏中的链接 由于我有一个单页 Web 应用程序 因此网址栏中的链接将始
  • 嵌入数组中嵌入文档中的项目字段

    我有以下查询 cursor self postCol aggregate graphLookup from pCol startWith parent connectFromField parent connectToField id as
  • Java 中的散列——结构和访问时间

    我正在寻找两个不同但相关的论点的验证 上述论点 A 及以下 B Q 中的第一行行注释 A 道路HashMap的结构是 a HashMap是一张普通的桌子 这就是直接内存访问 DMA 背后的整个想法HashMap 或一般的散列 首先 是将这种
  • 微软团队机器人自适应卡片轮播删除卡片

    我正在将 Microsoft 团队机器人与 Node js 一起使用 我正在渲染自适应卡的轮播 并在每张卡上执行操作 我的要求是删除单击该操作的单个卡片 是否可以 当前代码如下所示 我尝试过删除活动 但这会删除整个轮播 const Turn
  • 使用我的数据库中的数据计算年龄

    这是我当前正在使用的代码 但它不起作用 Geboortedatum 在荷兰语中是出生日的意思 mysql connect xxx xxx xxx mysql select db xxx result mysql query select G
  • 如何从 Facebook Graph API 获得响应能力?

    我可以从 Facebook Graph API 中提取一个指标来告诉我其中一个 两个吗Response Rate and or Average Response Time从页面 我将附上我所指内容的屏幕截图 当我进入 设置 gt 见解 gt
  • 无法在 AutoMapper 5 中从 ViewModel 映射到 ApplicationUser

    我有一个从 ApplicationUser 基类 ASP NET Identity 继承的 Student 类 它有一个名为 StudentViewModel 的 ViewModel 如下所示 实体类 public class Applic
  • Google Play 说我的 apk 使用两个本机平台(我的库),因此它支持 0 台设备

    当我在 Google Play 上发布 apk 时 它显示 支持 0 台设备 在 apk 描述的底部写着 本机平台 actionbarsherlock SherlockNavigatorDrawer 这些是我用于我的项目的库 它们不是 ja
  • 在 C++ 中模拟 lambda 的复制赋值运算符

    这个问题有两个部分 Firstly 有人可以解释 C 禁用 lambda 的复制赋值运算符背后的基本原理吗 如果您要允许复制构造函数 为什么不允许复制赋值运算符呢 Secondly 如何在不强迫人们编写 C 03 风格函子或使用 std f
  • MediaElement 和 RTSP

    MediaElement 支持 RTSP 吗 我有一个流正在运行 我可以通过以下方式使用 VLC 播放器使用该流 rtsp 192 168 1 17 554 stream 但是 当尝试使用 Windows Media Player 时 我无
  • 如何将一个巨大的矩阵逐行写入文件(fortran 90)

    我想将一个包含大量数据的矩阵逐行写入文件中 例如 我有一个 100 100 的矩阵 我想在文件中以 100 100 的形式保存它 但是 它不起作用 以下是我的代码和一些描述 N和M是数百左右的整数 RECL 是预期长度我设置了文件 但在这里
  • 如何通过行列切换进行矩阵转换?

    我有一个由元素组成的方阵 1 或 0 第 i 行切换会切换所有第 i 行元素 1 变为 0 反之亦然 并且第 j 列切换切换所有 第 j 列元素 我有另一个方阵 大小相似 我想将初始矩阵更改为 使用最少切换次数的最终矩阵 例如 0 0 1
  • 使用清单的 DLL 重定向

    我需要可靠地重定向应用程序对特定 DLL 的查找 使用 app exe local 方法不起作用 因为如果应用程序具有清单 嵌入或单独的文件 则本地文件将被忽略 因此 我尝试通过在清单中将 DLL 定义为私有程序集来进行 DLL 重定向 我