Windows 动态链接依赖于活动代码页

主要观点: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 时系统代码页变化不影响结果。
  • 此技巧在恶意软件外实用性不大,恶意软件可借此欺骗解码模块名不同的检查工具。
阅读 15
0 条评论