自解压可执行 C++

use*_*495 5 c++ resources extract hinstance

我试图了解自解压 PE 文件的工作原理。有人可以解释为什么我的代码不起作用,或者修复 main() 部分。

\n\n
#include <iostream>\n#include <Windows.h>\n\nusing namespace std;\n\nvoid ExtractResource(const HINSTANCE hInstance, WORD resourceID, const char* outputFilename);\n\nint main()\n{\n    HINSTANCE hInst = GetModuleHandle (0);\n    ExtractResource(hInst, 101, "101.dll");\n    ExtractResource(hInst, 102, "102.dll");\n    ExtractResource(hInst, 103, "103.dll");\n    ExtractResource(hInst, 104, "104.dll");\n    cout << "Files are now extracted!";\n    Sleep(INFINITE);\n}\n\n\nvoid ExtractResource(const HINSTANCE hInstance, WORD resourceID, const char* outputFilename){\n\n        // First find and load the required resource          \n\n        HRSRC hResource = FindResource(hInstance, MAKEINTRESOURCE(resourceID), "BINARY");\n\n        if(hResource==NULL)\n\n                return;\n\n        HGLOBAL hFileResource = LoadResource(hInstance, hResource);\n\n\n\n        // Now open and map this to a disk file          \n\n        LPVOID lpFile = LockResource(hFileResource);          \n\n        DWORD dwSize = SizeofResource(hInstance, hResource);            \n\n\n\n        // Open the file and filemap          \n\n        HANDLE hFile = CreateFileA(outputFilename, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW,\n\n                FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_READONLY, NULL);          \n\n        HANDLE hFilemap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwSize, NULL);            \n\n        LPVOID lpBaseAddress = MapViewOfFile(hFilemap, FILE_MAP_WRITE, 0, 0, 0);            \n\n\n\n        // Write the file\n\n        CopyMemory(lpBaseAddress, lpFile, dwSize);            \n\n\n\n        // Unmap the file and close the handles\n\n        UnmapViewOfFile(lpBaseAddress);\n\n        CloseHandle(hFilemap);\n\n        CloseHandle(hFile);\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的资源中有 4 个 dll 文件,但我无法使用它来提取它们。资源ID\xc2\xb4s应该是正确的,我从资源头检查了它。

\n\n

问题出在哪里hInst还是还有什么问题?我希望有人能帮助我:) 我大约一个月前才开始学习 C 和 C++,所以请原谅我。

\n

Bra*_*don 4

除了您没有检查函数的返回值并在出现问题时打印适当的消息之外,我没有发现您的代码有任何问题。另请注意,您可以将 hInstance 替换为 nullptr,它仍然有效。

另请注意,如果您要提取到需要额外权限的位置,则可能必须以管理员身份运行程序或添加清单以强制其请求管理员权限。

就我个人而言,我在我的任何资源应用程序中使用这些:

    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;
    }
Run Code Online (Sandbox Code Playgroud)

主要.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));
}
Run Code Online (Sandbox Code Playgroud)

再次强调,您使用的 CONSOLE 应用程序可能嵌入或未嵌入资源,请务必小心。