MFC将二进制文件导入资源后释放

1、前言

前一篇笔记记录了怎么修改PE,此篇记录下如何利用自身的资源文件。

2、编程思路

获得资源句柄 - 获得资源文件大小 - 加载资源文件 - 锁定资源并获得其指针。

3、实践代码

1)编译以下代码将EXE作为资源导入到MFC的资源。

  • 服务端

声明三个已经初始化值的变量

// URL配置器.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdafx.h"  

int main(int argc, char* argv[])
{
    TCHAR szIpAddress[] = L"AAAAAAAAAAAAAAAAAAAAAAAAAAAA";                                 // IP地址
    TCHAR szPort[] = L"BBBBBBBBBBBBBBBBBBBBBBBBBBBB";                                      // 端口号
    TCHAR szOtherInfo[] = L"CCCCCCCCCCCCCCCCCCCCCCCCCCCC";                                 // 其他信息

    printf("IP:%ls\nPort:%ls\nOther Information:%ls\n", szIpAddress, szPort, szOtherInfo); // 打印信息

    getchar();

    return 0;
}

2)来到代码编辑区,我们在需要使用这个exe文件的时候,从资源里拿出这段二进制代码,写入内存或一个磁盘文件就行了。首先定位我们的资源文件,其中IDR_RCEXE即为资源文件的ID:

HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCEA(IDR_EXE1), TEXT("EXE"));

3)获得资源文件大小,这个大小之后我们如果要提取出来会用到的:

DWORD dwSize  = SizeofResource(NULL, hRsrc);

4)加载资源,使用之前获得的资源文件句柄hRsrc:

HGLOBAL hGlobal = LoadResource(NULL, hRsrc);

5)在内存中锁定资源,其返回值即为一个指向资源第一个字节的指针:

LPVOID pBuffer = LockResource(hGlobal);

6)部分代码

void CMFC配置端Dlg::OnBnChangeResource()
{
	// TODO: 在此添加控件通知处理程序代码

	TCHAR chPath[MAX_PATH];  // 配置文件路径
	HANDLE hFile;            //释放资源到某个文件中
	BOOL bRet = false;     // 打开状态标志

	// 获得资源句柄
	HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(IDR_EXE1), TEXT("EXE"));

	// 获得资源文件大小
	DWORD dwSize = SizeofResource(NULL, hRsrc);

	// 加载资源文件
	HGLOBAL hGlobal = LoadResource(NULL, hRsrc);

	// 锁定资源并获得指针
	LPVOID pBuffer = LockResource(hGlobal);

	// 获得要保存的PE文件路径
	CFileDialog dlg_NewSavePath(TRUE, _T("exe"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("可执行文件|*.exe||"), this);
	dlg_NewSavePath.m_ofn.lpstrTitle = L"保存的路径.exe";
	if (dlg_NewSavePath.DoModal() == IDOK)
	{
		CString szPE_Path;
		szPE_Path = dlg_NewSavePath.GetPathName();
		wmemset(chPath, 0, szPE_Path.GetLength() + 1);
		wmemcpy(chPath, szPE_Path, szPE_Path.GetLength() + 1);
	}
	else
	{
		return;
	}

	// 新建文件
	hFile = CreateFile(chPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS,
		FILE_ATTRIBUTE_NORMAL, NULL);

	// 写入文件
	bRet = WriteFile(hFile, pBuffer, dwSize, &dwSize, NULL);
	if (bRet == 0)
	{
		return;
	}
	// 关闭句柄
	CloseHandle(hFile);
}

4、效果

5、参考

将二进制文件加入VC资源后释放执行

http://blog.csdn.net/hik_zxw/article/details/51498897

posted @ 2018-02-27 17:06  17bdw  阅读(705)  评论(0编辑  收藏  举报