恶意文件有时会通过资源(resource)来携带一些其他的子文件。一般的资源有图标,对话框等(可以去查看关于FindResoure的文档)。好像可以自己定义资源的种类!下面是如何从母文件中提取子文件的方法:
long SizeOfImage=0;
DWORD NumOfWrittenBytes;
HANDLE hFile;
HGLOBAL hResData;
HMODULE hExe;
HRSRC hResInfo;
hExe=LoadLibrary("完整的母文件名"); //加扩展名
if(NULL==hExe)
{
printf("LoadLibrary err!");
return 0;
}
//FindResource(_In_opt_ HMODULE hModule,_In_ LPCTSTR lpName,_In_ LPCTSTR lpType)
hResInfo=FindResource(hExe," "," ");//找资源,就是查看是否有相关资源
if(NULL==hResInfo)
{
printf("FindResource err!");
return 0;
}
SizeOfImage=SizeofResource(hExe,hResInfo);//获取资源大小
if(0==SizeOfImage)
{
printf("SizeofResource err!");
return 0;
}
printf("the size of file:%d\n",SizeofImage);
hResData=LoadResource(hExe,hResInfo);//加载资源
if(NULL==hResData)
{
printf("LoadResouce err!");
return 0;
}
if(!LockResource(hResData))
{
printf("lock resource err!\n");
return 0;
}
//printf("%x ",*(DWORD *)hResData);
//有的资源数据可能经过了一些处理加密,这里将资源读出来之后还差一步解密
hFile=CreateFile("文件名",0x0c0000000,0,0,2,0,0);
if(!hFile)
{
printf("create file err!\n");
return 0;
}
if(!SetFilePointer(hFile,0,0,0))&&
!(WriteFile(hFile,hResData,SizeOfImage,
&NumOfWrittenBytes,0))
{
printf("write file err!\n");
return 0;
}
CloseHandle(hFile);