hammackj

Extracting binary resources in win32

Here is a useful snippet for extracting a binary resource from a compiled resource in a exe or dll. I haven't really seen any thing demonstrates how to do this exactly. So hopefully this helps someone. Maybe next time I will post the code to extract into memory and execute a PE file.

/**
 * Extracts a binary resource and write it to the specified output file.
 *
 * @param output_filename filename of the output file
 * @param resource_id resource id of object to extract from the resource file
 *
 * @author Jacob Hammack
 *
 */
void extract_resource(TCHAR *output_filename, int resource_id)
{
    HGLOBAL resource_handle = NULL;
    HANDLE file_handle;
    HRSRC resource;
    TCHAR *resource_data;
    DWORD resource_size;
    DWORD bytes_written = 0;

    if(!(resource = FindResource(0, MAKEINTRESOURCE(resource_id), RT_RCDATA))
    {
        return;
    }

    if(!(res_handle = LoadResource(NULL, resource)))
    {
        return;
    }

    resource_data = (TCHAR*) LockResource(resource_handle);
    resource_size = SizeofResource(NULL, resource);

    file_handle = CreateFile(output_filename,
            GENERIC_WRITE,
            FILE_SHARE_WRITE,
            0,
            CREATE_ALWAYS,
            FILE_ATTRIBUTE_NORMAL,
            NULL);

    if(file_handle == INVALID_HANDLE_VALUE)
    {
        _tprintf(TEXT("[!] Unable to create file handle for writing temp data to disk.\n"));

        return;
    }

    while(bytes_written < resource_size)
    {
        if(FALSE == WriteFile(file_handle,
            resource_data + bytes_written,
            resource_size - bytes_written,
            &bytes_written,
            NULL))
        {
            CloseHandle(file_handle);

            return;
        }
    }

    CloseHandle(file_handle);
}