html tool

2018年11月19日星期一

对比dll 动态链接库的加载顺序 在windows/linux 系统上的不同


linux动态链接库的加载顺序:


linux动态链接库的加载顺序:
它有5个地方会查找,
1. 编译时指定的run path 
[popexizhi:
    查看run path方式 readelf -d test 可以看到(RPATH) Library rpath: [pos1] 
   PS: readelf 是linux下的elf文件的读取工具很好用的,
            详细参见    https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/readelf.html
]
2. LD_LIBRARY_PATH 指定的地方
[ popexizhi: 需要用LD_LIBRARY_PATH 说明。此例为: export LD_LIBRARY_PATH=./pos2
]
3. ldconfig 指定的地方
[popexizhi: 需要在/etc/ld.so.conf 中指明,此例为:/home/hjj/MyTest/temp/pos3
         然后ldconfig 生成缓存使设置生效 
]
4. /lib
5. /usr/lib

参考:https://blog.csdn.net/hejinjing_tom_com/article/details/52454478
[popexizhi:这里写的很全,作者推荐使用 strace和 编译dll 五个位置依次测试的方法都很好用 ,mark一下]


Windows动态链接库的加载顺序:


参考: https://payloads.online/archivers/2018-06-09/1


应用程序寻找DLL的过程
0.注册表\KnownDlls 
[popexizhi:
  系统启动时,smss.exe 会根据设置项创建一个 \KnownDlls 目录,其中存放了各个KnownDlls的Section对象。当系统需求加载dll时,优先从\KnownDlls对象目录中查找,如果有直接使用NtMapViewOfSection将其映射到内存。如果没有继续搜索。P462 《加密与解密-第4版》
]
1.程序所在目录
[popexizhi:
此位置是正在加载dll的进程的可执行文件的目录,这里是dll劫持的最后位置
]
2.系统目录即 SYSTEM32 目录
3.16位系统目录即 SYSTEM 目录
4.Windows目录
5.加载 DLL 时所在的当前目录
[popexizhi: 这个位置与1的区别,pope推断是,这里是正在加载DLL的进程的当前目录,此位置执行使用的目录,例如1为此c:\test\a.exe, 而在d:\ 下调用,步骤1是c:\test\, 步骤3是 d:\ ]
6.PATH环境变量中列出的目录

到这里还没有系统就提示找不到dll了。

没有评论:

发表评论