PE文件的资源为一个隐藏的PE文件,使用FindResource把它给提取出来,顺便理解一下资源函数的使用
// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include "GgetPE_Info.h"
int _tmain(int argc, _TCHAR* argv[])
{
char *buffer = NULL;
HRSRC hRsrc = NULL;
// 获取指定模块里的指定资源
HANDLE hFile=CreateFileW(L"KmdManager",GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("打开文件失败\n");
goto exit;
}
DWORD dwFileSize=GetFileSize(hFile,NULL);
if (dwFileSize == INVALID_FILE_SIZE)
{
printf("获取文件大小失败\n");
goto exit;
}
buffer = new char[dwFileSize];
DWORD readSize = 0;
BOOL isReadSucc = ReadFile(hFile, buffer, dwFileSize, &readSize, NULL);
if (!isReadSucc )
{
printf("读取文件内容失败,错误码%d\n",GetLastError());
goto exit;
}
//buffer需要拉伸到内存状态
PVOID imageBuffer = NULL;
ImageBufferToNewBuffer(buffer, &imageBuffer); //该函数为自写函数 把文件对其的buffer拉伸为内存中的状态。
hRsrc = FindResource((HMODULE)imageBuffer, "EXERESX", RT_RCDATA); //第一个参数为模块句柄,其实就是buffer开始地址。
if (!hRsrc)
{
printf("查找资源失败,错误码%d\n", GetLastError());
goto exit;
}
// 获取资源的大小
DWORD dwSize = ::SizeofResource((HMODULE)imageBuffer, hRsrc);
if (0>=dwSize)
{
printf("获取资源大小失败,错误码%d\n", GetLastError());
goto exit;
}
HGLOBAL hGlobal = ::LoadResource((HMODULE)imageBuffer, hRsrc);
if (NULL == hGlobal)
{
printf("加载资源失败,错误码%d\n", GetLastError());
goto exit;
}
// 锁定资源
LPVOID lpVoid = ::LockResource(hGlobal);
if (NULL == lpVoid)
{
printf("加载资源失败,错误码%d\n", GetLastError());
goto exit;
}
// 保存资源为文件
FILE *fp = NULL;
fopen_s(&fp, "212.exe", "wb+");
if (NULL == fp)
{
printf("加载资源失败,错误码%d\n", GetLastError());
goto exit;
}
fwrite(lpVoid, sizeof(char), dwSize, fp);
fclose(fp);
exit:
if (hFile)
{
CloseHandle(hFile);
}
getchar();
return 0;
}