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

549050-20180227170712623-72135842.png

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、效果

549050-20180227171628179-1810417396.png

5、参考

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

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

转载于:https://www.cnblogs.com/17bdw/p/8479854.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值