如何使用 Windows Native API 访问 PE 资源?
Posted
技术标签:
【中文标题】如何使用 Windows Native API 访问 PE 资源?【英文标题】:How to access PE resources using Windows Native API? 【发布时间】:2016-08-05 01:12:37 【问题描述】:我有一个包含embedded resources 的Windows native application,我想使用native API 访问它们。是否有处理资源的本机函数(类似于FindResource/LoadResource)或者我必须创建自己的PE阅读器来提取它们?
【问题讨论】:
如果我可能会问,您为什么要编写本机应用程序?如果资源被映射到内存中,并且我认为它们会被映射,或者您可以轻松地将其余可执行文件映射到其中,您只需知道它们的地址即可访问它们,因此不需要特殊的 API。您使用哪种嵌入式资源? @KubaOber:如果您想在加载 Win32 子系统之前执行,您需要一个本机应用程序。 “您只需知道他们的地址就可以访问它们” -FindResource
将是了解地址的 API。
没错,就是Win32加载前需要执行的应用程序。如果包含资源的其余可执行文件未映射到内存,我该怎么办?一旦我没有事先定义资源地址,我如何以编程方式找到它(将资源放入可执行文件是链接器的工作)。
我想你会使用 cvtres
从你的 .res
文件中获取一个目标文件,然后转储它以了解每个资源的符号名称,然后将它们声明为编译器的外部数据,并根据需要从 C 代码中获取它们的地址。链接器会将其全部修补,就像它对编译时未知的所有其他地址所做的那样。您还可以调整链接,以便映射 .rsrc 部分(如果不是)。
这是个好建议。让我看看是否有其他人有更简单的方法来解决它:)
【参考方案1】:
Ntdll 导出 LdrFindResource_U
和 LdrAccessResource
,它们几乎分别对应于 FindResource 和 LoadResource。您还需要GetModuleHandle 的对应方才能使用它们。 Wine source(特别是 resource.c 和 module.c)可以用作这些函数的文档。
【讨论】:
以上是关于如何使用 Windows Native API 访问 PE 资源?的主要内容,如果未能解决你的问题,请参考以下文章
WebRTC Windows Native音频中的Core Audio API
用Windows Native API枚举所有句柄及查找文件句柄对应文件名的方法
如何使用 Redux 在 React Native 中使用线程调用 API?