GetVersionInfoSizeEx不上的DLL,但不能在副本相同的

问题描述

偶尔部署我的应用程序时,*捆绑的DLL看似随意的一个一个陌生的国家得到。在例如我现在调试它的System.Net.Security.dll(从.NET 3.1的核心),但它可以是任何

  • 在资源管理器,该DLL没有显示版本信息(版本,产品名称,版权等)。
  • 在.NET应用程序未能加载库,产生BadImageFormatException:集清单未发现
  • 资源黑客的确实显示版本信息块。
  • 当我做了DLL的一个副本,副本工作正常。原始的和复制是位对位相同。
  • 当我使磁盘的磁盘映像并将其安装在其他地方,有问题的文件是好的。
  • 当我打电话 GetVersionInfoSizeEx()上的DLL,它失败,错误1813(ERROR_RESOURCE_TYPE_NOT_FOUND)。它的工作原理上的位对位相同副本细。

Screenshot

由于显然是没有错的文件中的位,我倾向于腐败犯罪嫌疑人在排序缓存数据结构或内存。

如何来的版本信息不能读取此DLL,而它可以从相同的副本来读取就好了?


我做了一些挖掘,发现资源的API调用 LoadLibraryEx()LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE。一些篮球后,我们在结束了NTDLL的私人的 LdrpResGetResourceDirectory()的,做一些计算和查找的字段在模块内部偏移:

00007ffd`c4c17f61 0fb74a0e        movzx   ecx,word ptr [rdx+0Eh]
00007ffd`c4c17f80 6685c9          test    cx,cx
00007ffd`c4c17f83 7463            je      ntdll!LdrpResGetResourceDirectory+0x408 (00007ffd`c4c17fe8)

rdx一个指针,指向在模块内部的某个地方。从我的读数:

rdx = handle + 0x100 + somestruct.(0x14) - somestruct.(0x0C)

这是有问题的原始 DLL 和逐位相同副本之间执行分歧的地方:cx 为 0 表示坏的原始副本,但 1 表示好的副本。

(我打过电话的调用LoadLibrary()的的DLL,然后倾倒比较它与原始DLL的记忆,但我不能让走出森林在所产生的树的diff。)


*)这是通过下载和提取拉链,那么它robocopying到共享/.

的方式部署到Windows Server 2019天青批次节点的自包含.NET核心3.1应用>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)