很久以前写过一个在EXE的资源中释放出一个文件,然后加载运行做些事情的小程序,时间久了,忽然又有这个需求的时候,居然忘记是如何做的了,原来的程序代码早被删了,自己胡乱试验几次,结果弄出N个蓝屏出来,只好上网查了一下,但没有发现很理想的资料。只好吭哧吭哧费了九牛二虎才搞定,所以在此记录一下,以免以后忘记了。
声明:本文只用作技术研究,思想不良人士请勿参照此方法释放驱动,可执行程序等做坏事,否则后果自负。
废话少说,转入正题。
需要:释放一个名为001.jpg文件到C盘根目录,并修改成名字002.jpg
随便建个VC的工程,在VC工程的的"Resource View"画面中,鼠标右键-〉add->add resource,出现添加资源画面,然后选"Import...",找到001.jpg,然后确定,显示资源类型定义对话框,在资源类型定义中,自己定义一个不存在的类型名,这里叫TROJANHORSE,然后就把001.jpg添加进来了。这个时候,"Resource View"画面中会多出一个"TROJANHORSE"类型,下面资源名为:IDR_TROJANHORSE1,这个名字可以自由修改。
在代码中,写一个函数,(函数懒得自己写,借助了网上资料,出处忘记了)为
BOOL ReleaseMyFile(LPCTSTR lpszDestFilePath, LPCTSTR lpName, LPCTSTR lpType)
{
HRSRC hRsrc = ::FindResource(NULL, lpName, lpType);
if (NULL == hRsrc)
return FALSE;
HGLOBAL hGlobal = ::LoadResource(NULL, hRsrc);
if (NULL == hGlobal)
return FALSE;
DWORD dwSize = ::SizeofResource(NULL, hRsrc);
LPVOID pBuffer = ::LockResource(hGlobal);
BOOL bRt = FALSE;
FILE* fp = _tfopen(lpszDestFilePath, _T("wb"));
if (fp != NULL)
{
if (dwSize == fwrite(pBuffer, sizeof(char), dwSize, fp))
bRt = TRUE;
fclose(fp);
}
return bRt;
}
然后就可以在main中调这个函数释放资源文件了,具体代码如下:
BOOL bRt = ReleaseMyFile(TEXT("c:\\002.jpg"), MAKEINTRESOURCE(IDR_TROJANHORSE1), TEXT("TROJANHORSE"));
当然,可以把001.jpg换成exe或者sys文件,做该做的事情。