原文链接

http://www.nynaeve.net/?p=198
       因为某些原因,系统中的一些DLL需要加载在不同进程的同样的基地址上(在终端服务会话中,其中一些DLL可能使用轮流基地址) ,尽管微软没有明确的文档化, 一些程序的运行依赖于这些“固定基址的DLL”。
       这并不意味着这些DLL 的基地址不可改变,但是在系统运行的时候,所有的进程都将会把这些DLL 映射到同样的基地址上(如果它们确实映射这些DLL 的话)。
       当前在系统范围内需要同样的基地址的DLL 有 NTDLL, kernel32, and user32,但是它们需要固定基址的原因是不同的。

NTDLL 必须有同样的基地址,因为它导出了很多的函数,内核使用这些函数来间接安排用户模式的调用。例如,ntdll!LdrInitializeThunkis 是每一个用户模式线程的真实的启动地址。如果一个线程在进行用户模式等待且一个用户模式APC 准备好执行的话,ntdll!KiUserApcDispatcher 被用来执行该APC。在系统初始化的时候,系统解析这些函数(还有其它的)的地址并保存起来,以在之后需要执行用户模式代码的时候使用。因为系统缓存了这些函数地址且每次引用同样的函数地址,不同进程间NTDLL 的基地址不能是不同的。
       另外,有些用户模式程序也假设NTDLL 中的一部分导出函数在不同的进程中有同样的基地址。比如, ntdll!DbgUiRemoteBreakIn 被调试器用来侵入一个进程,调试器假设本地DbgUiRemoteBreakIn 函数的地址和目标进程的远程DbgUiRemoteBreakIn 地址是一样的。

与ntdll!DbgUiRemoteBreakIn 类似,Kernel32 中的许多函数被假设有同样的地址,以进行进程间线程注入操作。一个例子就是 console control event handler ,在kernel32.dll 初始化的时候, Ctrl-C 事件分发器的函数地址被传递给WinSrv.dll (在CSRSS 地址空间)。
WinSrv 本来只是简单的在第一个进程创建的时候缓存分发器指针 (因此需要会中的所有的进程中的kernel32模块的基地址相同). 在现在的系统中, WinSrv 根据每个进程来跟踪客户的kernel32 分发器指针,因为32-bit kernel32和64-bit kernel32 的分发器函数的地址不同。讽刺的是,对WinSrv 做出修改的开发者实际上忘了在几个小地方增加对于当前进程的分发器指针的支持。 (如 kernel32!SetLastConsoleActiveEvent 和 对应的winsrv!SrvConsoleNotifyLastClose 和winsrv!RemoveConsole CSRSS-side 函数). 这些地方,WinSrv仍然错误的传送缓存的 (64-bit) Ctrl-C 分发器值给CreateRemoteThread 函数,wow64.dll 有一个特定的hack (wow64!MapContextAddress64TO32),它将在WinSrv 之后清理并修复线程起始地址为32-bit kernel32.dll 中的地址。
       在WinSrv 和 Ctrl-C 处理做出改变之前,应用程序兼容性影响“kernel32 基地址在系统范围内同样基地址”的移除。消除这个限制是非常苛刻的(几乎所有的第三方代码注入都非常依赖于这个假设)。因此,由于这个(以及其它的)原因,kernel32 遵守这个限制,其基地址在不同的进程中不可被重定位。
       User32被要求在不同的进程间是同样的基地址,因为win32k.sys使用一个其导出的函数指针数组以供内置的窗口类的窗口处理函数使用(以及其它用途)。在会话建立并初始化CSRSS 的时候,WinSrv初始化win32k期间通过NtUserInitializeClientPfnArrays 函数拷贝这个函数指针数组。Wow64win.dll是NtUser/win32k Wow64 支持模块。提供了32-bit和64-bit 的转换转换支持,同时提供了对于这些函数地址的支持,这样的支持对于Wow64 进程来说是必要的。
user32 和kernel32 的需求可以被放宽以仅仅应用在一个终端会话上,尽管Windows XP 和之后的跨会话调试支持使得对于kernel32 的支持变得复杂,因为支持调试器侵入调试的需要,调试器需要在他们的侵入线程中使用DebugBreak 。(如果以64-bit kernel32 DebugBreak 出口地址创建了一个32-bit线程的话,Wow64 层提供了将DebugBreak 映射到32位地址的转移辅助)
       注意,ASLR 和这个限制不冲突。ASLR 机制在每次引导的时候为一个给定的DLL选择一个同样的基地址。因此,在系统启动的时候,NTDLL 可以拥有一个随机的起始地址,在重新启动之前,这个指定的随机地址被所有的进程所使用。
       更新:在Windows Server2003 和之前的操作系统中,kernel32 模块中的一个内部函数被当作CreateRemoteThread 和 CreateProcess 所创建的新线程的起始地址。这也是早期32 模块基地址不变的一个特别重要的原因。

系统范围内拥有相同基址的DLL 以及这样做的原因相关推荐

  1. 无法启动此程序因为计算机丢失d3dx9,Win7系统电脑提示“计算机中丢失d3dx9-41.dll”怎么办?...

    在使用Win7系统电脑进行游戏或者编码的时候,偶尔会遇到问题,提示"无法启动此程序,因为计算机中丢失d3dx9-41.dll",这个问题的原因其实很明显了,就是计算机中丢失了d3d ...

  2. Android系统将内置滤镜功能

    from: http://cblog.cc/2015/09/03/Android-Camera-%E5%AE%9E%E6%97%B6%E6%BB%A4%E9%95%9C/ 一.Android系统将内置 ...

  3. 计算机丢失tlps,win7系统下PS提示计算机丢失tlpsplib10.dll文件的解决方法

    ps是一款图片处理软件,很多win7系统用户由于工作或学习需要会安装ps来使用,但是有时候要打开ps的时候,却提示计算机丢失tlpsplib10.dll文件,该怎么办呢,现在就给大家分享一下win7系 ...

  4. wdos8系统服务器丢失,win8一键修复丢失DLL,常见dll丢失一键修复办法

    win8一键修复丢失DLL,常见dll丢失一键修复办法? 在win8系统下,特别是win8 64位旗舰版下大家经常会碰到运行程序.或是点击一些游戏时出现XXXX.DLL丢失的故障,导致软件没有法点击, ...

  5. 苹果safari关掉java_如何在Safari,Chrome,Firefox和系统范围内禁用Java | MOS86

    如果您厌倦了所有Java安全更新和潜在的漏洞,您可以通过禁用Java来完全避免潜在的问题. 对于普通用户,我们建议将Java禁用作为保护Mac免受潜在恶意软件,病毒和木马的主要手段之一.事实上,最新版 ...

  6. c语言字符类型强制换成内码,C语言实现不同汉字系统的内码转换方法

    摹14●摹 1囊 l9髓 丰 3̂ 齐 弃 靖尔 大 学学 报 J伽rn|l 0fQiq 嘶 劬 q 言实现不 字 |I∈峰 张宏烈 周长支 一 1 / (齐弃暗拳太掌工鼍qb,一r /1 -i l ...

  7. win7网络找不到局域网计算机名,教你操作win7系统局域网内找不到其他电脑的解决方法...

    win7系统由于性能稳定可靠,兼容性强,受到了大部分用户的青睐,但再完美的系统,使用时间久了难免会遇到win7系统局域网内找不到其他电脑的麻烦,对于电脑不太熟悉的朋友面对win7系统局域网内找不到其他 ...

  8. 因为计算机中丢失d3dx926.dll,win10系统打开程序提示丢失d3dx9 26.dll的解决方法

    很多小伙伴都遇到过win10系统打开程序提示丢失d3dx9 26.dll的困惑吧,一些朋友看过网上零散的win10系统打开程序提示丢失d3dx9 26.dll的处理方法,并没有完完全全明白win10系 ...

  9. Win7系统提示“内置管理员无法激活此应用”的原因和解决方法

    有些用户在使用Win7 64位系统电脑时出现"内置管理员无法激活此应用"的提示,为什么突然之间会弹出这样的内容呢?这是因为电脑的安全设置问题造成的,知道故障原因后,那么Win7系统 ...

最新文章

  1. 数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)
  2. 模拟退火 HDU - 2899 Strange Function
  3. matlab中的single是什么类型_MATLAB 中cell数据类型的使用方法
  4. [文章存档]Kudu 的 Debug Console 窗口如何查看更多文件
  5. 杨强入选加拿大皇家科学院院士!此外还有3名华人学者入选
  6. PL0编译器TurboPascal版再现时间:2009-07-20 17:24:49来源:网络 作者:未知 点击:52次
  7. 求两数最大公约数,最小公倍数-Java
  8. 一张图告诉你E-R图怎么画
  9. 编程一小时 code.org [六一关注]
  10. 又上热搜!鸿星尔克悄悄给山西捐赠2000万物资!这些大厂也出手了...
  11. 【Kafka】docker下kafka报错 IOException: Connection to xxx:19093 (id: 1002 rack: null) failed
  12. Flutter入门(1)—环境配置
  13. 【Java后端】技术文档模板
  14. 医学数字成像设备中计算机系统的作用包括,《医学影像设备学》题 集
  15. OS_PV操作_4.过独木桥问题
  16. 后端每天更新微信用户用户头像
  17. Android 后台保活,这里有你需要的所有姿势。2019,最新版本。
  18. Flash鼠绘入门第四课:绘制漂亮的梅花
  19. pycharm运行报错:Process finished with exit code -1073741515 (0xC0000135)
  20. 昔日金屋中的女人,谁都难免面对帝王决然的背影

热门文章

  1. 菜鸡尝试:pytorch姿态估计hourglass模型(LSP数据集)
  2. 海尔linux系统密码,海尔路由器密码忘记了怎么办?
  3. 第十二届 蓝桥杯 EDA设计与开发项目 省赛
  4. 测试角度学安全测试之burpsuite--intruder之暴力破解
  5. 2021江西高考成绩查询微信可以吗,2021年江西高考成绩几号可以查?江西高考成绩排名分数什么时候出...
  6. linux查看bond0网卡,linux 查看bond0
  7. ant man 什么意思_外贸尾货,在外贸邮件里出现爱的ant是什么意思?
  8. 利用python可以做什么菜_python 爬取菜单生成菜谱,做饭买菜不用愁
  9. The ZYNQ Book ebook chinese
  10. VDSL与ADSL的区别