linux动态链接库的加载顺序:
linux动态链接库的加载顺序:
它有5个地方会查找,
1. 编译时指定的run path
它有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 指定的地方
3. ldconfig 指定的地方
[popexizhi: 需要在/etc/ld.so.conf 中指明,此例为:/home/hjj/MyTest/temp/pos3
然后ldconfig 生成缓存使设置生效
]
4. /lib
5. /usr/lib
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了。
没有评论:
发表评论