gpt4 book ai didi

c++ - 自解压可执行 C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:57 26 4
gpt4 key购买 nike

我想了解自解压 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com