主要观点:Windows 路径以[WTF-16]编码数十年,而可移植可执行文件的导入表中的模块名是字节。动态链接器需将字节解码为 Unicode 以构建查找路径,具体加载的 DLL 可能依赖系统代码页。通过[LoadLibraryA]和[LoadLibraryW]的情况对比,展示了代码页对模块路径的影响。文中设计了两个特殊名称的库õral.dll
和õral.dll
,通过应用不同代码页来演示此现象,还介绍了构建导入库的技巧及相关测试程序和工具的使用。
关键信息:
- Windows 路径编码与模块名编码的差异及影响。
- 两个特殊名称库及其编码。
- 构建导入库的方法及相关工具。
- 测试程序及不同代码页下的结果。
重要细节: õral.dll
在 CP-1252 下编码为"C3 B5 …"
,õral.dll
在 CP-1252 下编码为"F5 …"
,在 UTF-8 下编码为"C3 B5 …"
。- 构建导入库时需考虑工具链等的编码,Binutils
dlltool
无法处理此名称。 - 使用[application manifest]可控制特定 PE 图像的代码页。
- 测试程序
main.c
通过链接detect.lib
进行测试,peports
可打印非 ASCII 字节。 - 不同系统代码页下运行测试程序的结果不同,无 manifest 时系统代码页变化不影响结果。
- 此技巧在恶意软件外实用性不大,恶意软件可借此欺骗解码模块名不同的检查工具。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。