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);
}