我能用C++在EXE文件中找到资源的偏移量吗
Can I find an offset of a resource in an EXE file with C++?
我正在编写一个自定义模块,用于检查EXE文件的一致性(这不是本问题的一部分。)为此,我需要知道EXE文件中某个资源的偏移量,以计算我需要检查的EXE文件体的大小。
我想出了以下代码来获取strExeFilePath
文件中IDR_HTML_DLG
资源的偏移量:
int ncbOffsetInBytes = 0;
HMODULE hModule = LoadLibrary(strExeFilePath);
if(hModule)
{
HRSRC hRes = ::FindResource(hModule, MAKEINTRESOURCE(IDR_HTML_DLG), RT_HTML);
if(hRes)
{
long szLength = ::SizeofResource(hModule, hRes);
HGLOBAL hGlobal = ::LoadResource(hModule, hRes);
if(szLength && hGlobal)
{
BYTE* pData = (BYTE*)LockResource(hGlobal);
DWORD dwLast = (DWORD)(pData + szLength);
DWORD dwFirst = (DWORD)hModule;
ncbOffsetInBytes = dwLast - dwFirst;
}
}
::FreeLibrary(hModule);
hModule = NULL;
}
但是ncbOffsetInBytes
中的结果比EXE文件本身更大。知道怎么纠正吗?
正如@rodrigo所指出的,当PE文件加载到内存中时,每个相关部分都将加载到不同的内存部分中,每个部分之间都有填充,并且部分的偏移量以及模块本身的大小将与磁盘上的PE文件不同。这里有一些关于这是如何工作的信息。
在我看来,有两种方法可以做你想做的事情。你要么需要考虑内存中PE的大小,并以此为基础进行计算——我相信IMAGE_OPTIONAL_HEADER
的SizeOfImage
成员给出了加载到内存中的图像大小。另一种选择是继续使用磁盘上PE文件的大小,在这种情况下,您可以将PE文件作为数据文件加载到内存中(而不是使用LoadLibrary
),然后从那里开始工作。在这种情况下,如果你需要从文件中检索资源等的偏移量,你可能需要手动解析和抓取PE文件结构——这里有一个很好的参考。
相关文章:
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 通过指针偏移量访问结构变量值
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- librdkafka:rd_kafka_assignment 返回分配分区的偏移量 -1001
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- 向指针地址添加 20 个字节偏移量
- glMapBufferRange(..) 中的偏移量关系和 glDrawArraysInstanced(..) 中的第一
- 是否有与 C# Structs/StructLayout 等效的功能,C++中的字段偏移量?
- 我的 sumASCII 函数中的此偏移量是多少?
- boost::序列化中的派生类偏移量计算.有效吗?
- RedisGraph 语法错误在偏移量 8 靠近"创建"
- 胎面偏移量的时间复杂度?
- 如何从 c++ 中的给定标准输入中获取每个字符的偏移量?
- 编译器在构造函数中计算的成员偏移量不正确
- 使用基地址和偏移量获取变量的地址
- c++ 读取进程内存基址 + 偏移量不起作用
- 通过其在 C 中的偏移量调用函数
- ld:无效的字符串偏移量...对于".strtab"部分
- GDB 显示损坏的指令地址偏移量
- 我能用C++在EXE文件中找到资源的偏移量吗