作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想了解自解压 PE 文件的工作原理。有人可以解释为什么我的代码不起作用,或者修复 main() 部分。
#include <iostream>
#include <Windows.h>
using namespace std;
void ExtractResource(const HINSTANCE hInstance, WORD resourceID, const char* outputFilename);
int main()
{
HINSTANCE hInst = GetModuleHandle (0);
ExtractResource(hInst, 101, "101.dll");
ExtractResource(hInst, 102, "102.dll");
ExtractResource(hInst, 103, "103.dll");
ExtractResource(hInst, 104, "104.dll");
cout << "Files are now extracted!";
Sleep(INFINITE);
}
void ExtractResource(const HINSTANCE hInstance, WORD resourceID, const char* outputFilename){
// First find and load the required resource
HRSRC hResource = FindResource(hInstance, MAKEINTRESOURCE(resourceID), "BINARY");
if(hResource==NULL)
return;
HGLOBAL hFileResource = LoadResource(hInstance, hResource);
// Now open and map this to a disk file
LPVOID lpFile = LockResource(hFileResource);
DWORD dwSize = SizeofResource(hInstance, hResource);
// Open the file and filemap
HANDLE hFile = CreateFileA(outputFilename, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW,
FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_READONLY, NULL);
HANDLE hFilemap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwSize, NULL);
LPVOID lpBaseAddress = MapViewOfFile(hFilemap, FILE_MAP_WRITE, 0, 0, 0);
// Write the file
CopyMemory(lpBaseAddress, lpFile, dwSize);
// Unmap the file and close the handles
UnmapViewOfFile(lpBaseAddress);
CloseHandle(hFilemap);
CloseHandle(hFile);
}
我在资源中有 4 个 dll 文件,但我无法使用它提取它们。资源 ID 应该是正确的,我从资源标题中检查过。
是 hInst
中的问题还是其他问题?我希望有人能帮助我 :) 我才一个月前开始学习 C 和 C++,所以请原谅我。
最佳答案
除了您没有检查函数的返回值并在出现问题时打印适当的消息外,我没有看到您的代码有任何问题。另请注意,您可以将 hInstance 替换为 nullptr,它仍然有效。
另请注意,如果您要提取到需要额外权限的位置,您可能必须以管理员身份运行程序或添加强制其请求管理员权限的 list 。
就个人而言,我在我的任何资源应用程序中使用这些:
bool ExtractResource(std::uint16_t ResourceID, std::string OutputFileName, const char* ResType)
{
try
{
HRSRC hResource = FindResource(nullptr, MAKEINTRESOURCE(ResourceID), ResType);
if (hResource == nullptr)
{
return false;
}
HGLOBAL hFileResource = LoadResource(nullptr, hResource);
if (hFileResource == nullptr)
{
return false;
}
void* lpFile = LockResource(hFileResource);
if (lpFile == nullptr)
{
return false;
}
std::uint32_t dwSize = SizeofResource(nullptr, hResource);
if (dwSize == 0)
{
return false;
}
HANDLE hFile = CreateFile(OutputFileName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
HANDLE hFilemap = CreateFileMapping(hFile, nullptr, PAGE_READWRITE, 0, dwSize, nullptr);
if (hFilemap == nullptr)
{
return false;
}
void* lpBaseAddress = MapViewOfFile(hFilemap, FILE_MAP_WRITE, 0, 0, 0);
CopyMemory(lpBaseAddress, lpFile, dwSize);
UnmapViewOfFile(lpBaseAddress);
CloseHandle(hFilemap);
CloseHandle(hFile);
return true;
}
catch (...) {}
return false;
}
主要.cpp:
#include "Resource.h"
bool Extract(HWND WindowHandle) //WindowHandle for MessageBox parent.
{
return ExtractResource(101,"101.dll", "BINARY");
}
int main()
{
std::cout<<"Extracted Successfully: "<<std::boolalpha<<Extract(GetModuleHandle(0));
}
再次强调,要非常小心您使用的是 CONSOLE 应用程序,它可能嵌入也可能不嵌入资源。
关于c++ - 自解压可执行 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18927721/
我是一名优秀的程序员,十分优秀!