- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个包含有效 exe 文件图像的内存缓冲区,我想从中提取一些资源。
为此,我正在使用 FindResource
函数,但该函数需要一个 HMODULE,并在为 exe 提供内存缓冲区时崩溃。
有没有办法让它与内存缓冲区一起工作,而不是将 exe 写入临时文件,使用 LoadLibrary
加载它,然后执行所需的工作?
最佳答案
I'm have a memory buffer which contains a valid file image
以哪种形式?我猜比原始的(如在磁盘上)。但您需要“映射为图像”内存才能使用 FindResource。不是自己硬映射你的原始图像(如果你只想访问资源,而不是从内存中执行它)代码示例:
PVOID MapImage(PIMAGE_DOS_HEADER pvRawData, ULONG cbRawData)
{
if (cbRawData < sizeof(IMAGE_DOS_HEADER))
{
return 0;
}
if (pvRawData->e_magic != IMAGE_DOS_SIGNATURE)
{
return 0;
}
ULONG e_lfanew = pvRawData->e_lfanew, s = e_lfanew + sizeof(IMAGE_NT_HEADERS);
if (e_lfanew >= s || s > cbRawData)
{
return 0;
}
PIMAGE_NT_HEADERS pinth = (PIMAGE_NT_HEADERS)RtlOffsetToPointer(pvRawData, e_lfanew);
if (pinth->Signature != IMAGE_NT_SIGNATURE)
{
return 0;
}
ULONG SizeOfImage = pinth->OptionalHeader.SizeOfImage, SizeOfHeaders = pinth->OptionalHeader.SizeOfHeaders;
s = e_lfanew + SizeOfHeaders;
if (SizeOfHeaders > SizeOfImage || SizeOfHeaders >= s || s > cbRawData)
{
return 0;
}
s = FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader) + pinth->FileHeader.SizeOfOptionalHeader;
if (s > SizeOfHeaders)
{
return 0;
}
ULONG NumberOfSections = pinth->FileHeader.NumberOfSections;
PIMAGE_SECTION_HEADER pish = (PIMAGE_SECTION_HEADER)RtlOffsetToPointer(pinth, s);
ULONG Size;
if (NumberOfSections)
{
if (e_lfanew + s + NumberOfSections * sizeof(IMAGE_SECTION_HEADER) > SizeOfHeaders)
{
return 0;
}
do
{
if (Size = min(pish->Misc.VirtualSize, pish->SizeOfRawData))
{
union {
ULONG VirtualAddress, PointerToRawData;
};
VirtualAddress = pish->VirtualAddress, s = VirtualAddress + Size;
if (VirtualAddress > s || s > SizeOfImage)
{
return 0;
}
PointerToRawData = pish->PointerToRawData, s = PointerToRawData + Size;
if (PointerToRawData > s || s > cbRawData)
{
return 0;
}
}
} while (pish++, --NumberOfSections);
}
PVOID ImageBase = VirtualAlloc(0, SizeOfImage, MEM_COMMIT, PAGE_READWRITE);
if (!ImageBase)
{
return 0;
}
memcpy(ImageBase, pvRawData, SizeOfHeaders);
if (NumberOfSections = pinth->FileHeader.NumberOfSections)
{
do
{
--pish;
if (Size = min(pish->Misc.VirtualSize, pish->SizeOfRawData))
{
memcpy(RtlOffsetToPointer(ImageBase, pish->VirtualAddress),
RtlOffsetToPointer(pvRawData, pish->PointerToRawData), Size);
}
} while (--NumberOfSections);
}
return ImageBase;
}
void Test(PVOID pvRawData, ULONG cbRawData, PCWSTR lpType, PCWSTR lpName)
{
if (HMODULE ImageBase = (HMODULE)MapImage((PIMAGE_DOS_HEADER)pvRawData, cbRawData))
{
if (HRSRC hResInfo = FindResource(ImageBase, lpName, lpType))
{
if (HGLOBAL hg = LoadResource(ImageBase, hResInfo))
{
__nop();
}
}
VirtualFree(ImageBase, 0, MEM_RELEASE);
}
}
包含检查有效数据大小的 MapImage。但是,如果您确定 (pvRawData, cbRawData) 100% 正确 - 您可以跳过此检查并简化代码
//我根据@IInspectable 注释编辑测试
函数 - 删除 __try/__except - 这里不需要
关于c++ - 将 FindResource 与内存缓冲区一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39398798/
(来源:khason.net) var ID = 1234; var FilePath = "C:\\file.dll"; IntPtr hMod = LoadLibraryEx(FilePath,
我编译了一些代码模板,我想了解代码的一部分,尽管我花了一整天的时间尝试,但我无法弄清楚它的作用。 有问题的代码如下: #define IDR_STUB 1 hRsrc = FindResource(N
我有一个自定义类加载器,我希望 getResource 在自定义位置查找资源。 因此,我想做的是重写 findResource,因为我希望它返回一个字节数组作为结果。 findResource函数的返
HRSRC test = FindResourceW(hModule, L"TEST", RT_MANIFEST); FindResource 失败并显示ERROR_RESOURCE_NAME_NOT
我正在编写一段与资源(可执行文件)交互的代码,但我目前遇到了一些问题。 问题 1在资源头文件 (resource1.h) 中,ID_EXEC 被定义为一个数字,但是当我使用函数“MAKEINTRESO
我正在尝试将二进制资源嵌入到我的内核模式静态库中,但我没有看到与 FindResource 和 LoadResource API 等效的内核。你能帮帮我吗? 最佳答案 也许 LdrFindResour
我必须使用 FindResource("key") 方法。在我的 MainWindow 类中,它有效。 我必须在另一个类中使用它,但我不能用 MainWindow 类的新实例引用它,因为这给我带来了一
我有一个包含有效 exe 文件图像的内存缓冲区,我想从中提取一些资源。 为此,我正在使用 FindResource 函数,但该函数需要一个 HMODULE,并在为 exe 提供内存缓冲区时崩溃。 有没
我们正在“外部”连接我们的 View 和 View 模型,这意味着我们在某处有以下类型的代码: var viewModel = new MyViewModel(); var view = Applic
我正在尝试从资源文件中获取 .png 图像。 res.rc TEST_BKG RC_DATA "img\\mainwnd_bkg.png" - main.c HRSRC hRsrc =
我正在尝试使用 Win32 FindResource() 函数将嵌入式资源加载到缓冲区中。我在 Visual Studio 2015 IDE 中添加资源编译时间: 正如您使用 CFFexplorer
我有这个值转换器,可以将数字转换为画笔颜色。我需要做的是将 return Brushes.Red; 行更改为 return (Brush)FindResource("PrimaryHueMidBrus
我想在 C# Windows Phone 编程中使用 FindResource() 来更改控件的样式,但我做不到。 play_btn.Style = FindResource("btnplay") a
我正在尝试从我的资源中加载字体。这是我使用的调用,它当前返回 NULL,因此失败: HRSRC rsrcData = FindResource(NULL, MAKEINTRESOURCE(IDF_RO
我正在 WPF 中编写 CustomControl。我的 Themes/Generic.xaml 中有一些 DataTemplates,处于资源字典级别,并为它们分配了 x:Key。 现在,在同一个控
我知道在 FrameworkElement(例如窗口)上调用 FindResource() 可用于在 FrameworkElement 的 ResourceDictionary 中查找资源。 例如,我
URLClassLoader有两个函数用于获取资源作为 URL。一个名为 getResource 并被继承,一个来自 URLClassLoader 并被命名为 findResource。两者都返回一个
过去 3 天我一直在尝试这个,但我仍然无法让它工作。 WINAPI FindResource 函数抛出错误 1813:这意味着找不到资源类型。我正在使用 eclipse,所以没有 .RC 文件或 re
我正在尝试关注 this tutorial在 MSDN 上从资源加载图像文件。我感觉所提供的一些代码是胡说八道,但我不知道如何让它工作。调用FindResource()一直失败,错误代码为 1813。
我一直都在研究这个,但我只是被困住了。我一直在构建一个项目,我想将一个文本文件作为资源嵌入到可执行文件中。我理解这个“应该”如何工作的所有基础知识,但出于某种原因,事实并非如此。因此,让我从目前的情况
我是一名优秀的程序员,十分优秀!