windows核心编程(第五版)的20.6节介绍了Dll重定向。

0x01  Dll重定向简介

  产生Dll重定向原因: 

  应用程序 a.exe 依赖动态链接库 compoent.dll 1.0 版本。但是用户的另一个软件 b 在系统的系统目录安装了 component.dll 2.0 版本,这两个版本不兼容,

因此,Windows 在加载 component.dll 的时候,会直接加载系统目录中的 component.dll,这就造成了 a.exe 程序无法运行,如果这时用户需要同时使用两个软件,就会造成所谓的 DLL Hell。

  

  动态链接库重定向技术如何解决 DLL Hell:

   这里有两种方法可以作为解决方案:

  1.创建 a.exe.local 文件,该文件内容为空。

    这时系统就会强制使 a.exe LoadLibrary 时先在 a.exe 所在的目录下查找要加载的动态库,之后才到系统目录下寻找。这个解决方法适用于两个不同的应用。

   2.创建 a.exe.local 目录,将 a.exe 依赖的库放入其中。

  这时系统就会强制使 a.exe LoadLibrary 时先在 a.exe.local 目录下查找要加载的动态库,之后才到系统目录下寻找。这个解决方法适用于单个应用中存在两个应用程序,并且以来同名但是互不兼容的库。

  动态链接库重定向技术实际上是 M$ 修改了 LoadLibrary(Ex) 的代码,使其在调用时先检测是否存在 <AppName>.local 文件或目录实现重定向的。它是作为临时解决 DLL HELL 的方法。并且,当应用程序存在 Manifest 时,该技术将不会起作用。

0x01  Dll重定向实现步骤:  

   (假设我的EXE为SHApp.exe, 要调试的DLL为 SHModule.dll):

  1) 在 SHApp.exe 的目录下创建一个 SHApp.exe.local

  2) 把你希望加载的 SHModule.dll 复制到 SHApp.exe.local 目录下

  3) 运行 SHApp.exe

  

#include "stdafx.h"
#include <Windows.h>
#include <stdio.h> int main()
{
CHAR szMoudlePath[MAX_PATH];
LPSTR szKernel32 = "kernel32.dll";
LPSTR szuser32 = "user32.dll";
HMODULE hKernel32; //使用NULL参数,获取本模块路径
if (!GetModuleFileNameA(NULL, szMoudlePath, MAX_PATH))
{return 0;}
printf("本模块路径 %s \n\n", szMoudlePath); hKernel32 = LoadLibraryA(szKernel32);
//使用Kernel32.dll的句柄模块,获取其路径
if (!GetModuleFileNameA(hKernel32, szMoudlePath, MAX_PATH))
{return 0;}
printf("kernel32模块路径 %s \n", szMoudlePath); return 0;
}

  

  按照这位博主的说法(http://blog.csdn.net/zacklin/article/details/7535569),要打开.local这个功能,需要在注册表设置DevOverrideEnable值,并且重启机器

  [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options]

  "DevOverrideEnable"=dword:00000001

  然而,在笔者win10的注册表上,并没有找到这个键值:

  

   所以笔者猜测win10下的此技术可能得到了改进?又或者是我个人的原因?各位看官路过如若知晓的话,还望不吝赐教,感激不尽~

  

Dll重定向(尚存否?)的更多相关文章

  1. 带你读Paper丨分析ViT尚存问题和相对应的解决方案

    摘要:针对ViT现状,分析ViT尚存问题和相对应的解决方案,和相关论文idea汇总. 本文分享自华为云社区<[ViT]目前Vision Transformer遇到的问题和克服方法的相关论文汇总& ...

  2. DLL重定向处理

    说明 目前正在做的项目批次功能涉及第三方插件,而第三方插件需依赖4.* 版本的Newtonsoft.Json.dll,由于现有功能已经使用6.*版本的Newtonsoft.Json.dll,故采用了d ...

  3. .Net中DLL冲突解决(真假美猴王)

    <西游记>中真假美猴王让人着实难以区分,但是我们熟知了其中的细节也不难把他们剥去表象分别出来.对问题不太关心的可以直接调到文中关于.Net文件版本的介绍 问题 最近在编译AKKA.net ...

  4. 第20章 DLL高级技术(3)

    20.4 函数转发器 (1)函数转发器原理(下图是利用Dependency Walker打开Kernel32.dll得到) ①图中CloseThreadpool*等4个函数转发到NTDLL中相应的函数 ...

  5. dll劫持技术

    DLL劫持技术当一个可执行文件运行时,Windows加载器将可执行模块映射到进程的地址空间中,加载器分析可执行模块的输入表,并设法找出任何需要的DLL,并将它们映射到进程的地址空间中. DLL劫持原理 ...

  6. dll延迟加载

    用于隐式链接选项, 这样设置后在exe调用dll的函数才会加载dll,调用DLL_PROCESS_ATTACH.否则隐式链接直接会在exe启动时加载dll

  7. 【windows核心编程】DLL相关(3)

    DLL重定向 因为DLL的搜索路径有先后次序,假设有这样的场景:App1.exe使用MyDll1.0.dll, App2.exe使用MyDll2.0.dll, MyDll1.0 和 MyDll2.0是 ...

  8. 关于CodeBlocks中stdc++-6.dll缺失的小问题

    前一阵子在用CodeBlocks刷OJ(也并不是什么很难的算法,背包问题而已)时,遇到了个小麻烦,按下F9编译运行(有的人习惯用鼠标去点那个小button,多麻烦啊)后,Windows给我跳出个小窗说 ...

  9. Windows编程总结之 DLL

    +-- 版本 --+-- 编辑日期 --+-- 作者 -------------+ | V1. | | yin_caoyuan@.com | +----------+--------------+-- ...

随机推荐

  1. php绝对路径转相对路径

    /** * 绝对路径转成相对 路径 * $path相对于$base的相对路径 * @param string $base * @param string $path * 思路:去除共同部分 */ fu ...

  2. DedecmsV5.7本地上传缩略图无法自动添加水印的解决方法

    问题:dedecms后台 系统->图片水印设置 图片水印设置有开启了,但是本地上传缩略图无法自动添加水印 网上有很多资料,所以记录一下 1.打开dede(实际项目后台文件夹)/archives_ ...

  3. Kindergarten CodeForces - 484D (贪心,好题)

    大意: 给定序列, 求划分为若干段, 使得总贡献最大, 每段的贡献为max-min 可以发现最优解一定是连续一段递增或递减, 然后dp即可. #include <iostream> #in ...

  4. div成圆形分布

    1.  css3 ul{                 width: 200px;                 height: 200px;                 background ...

  5. swf 上传

    推荐这个博客:http://blog.csdn.net/hi_kevin/article/details/23430345 这个文章很不错,我推荐这个文章:http://leeon.me/upload ...

  6. php + mysql 分布式事务

    事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元: 事务应该具有4个属性:原子性.一致性.隔离性.持续性 原子性(atomicity).一个事务是一个不可分割的工作单 ...

  7. MySQL压力测试(1)-mysqlslap

    mysqlslap是从MySQL的5.1.4版开始就开始官方提供的压力测试工具.通过模拟多个并发客户端并发访问MySQL来执行压力测试,同时提供了较详细的SQL执行数据性能报告,并且能很好的对比多个存 ...

  8. py request.post header

    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome ...

  9. 字符串和数组----string

    一.初始化string对象的方式 #include <iostream> #include <string> using std::cout; using std::endl; ...

  10. bash 调试

    bashdb test.sh step edit  visual 跳到那一行 R restart http://www.ibm.com/developerworks/cn/linux/l-cn-she ...