zoukankan      html  css  js  c++  java
  • 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
    Port:%ls
    Other Information:%ls
    ", 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

  • 相关阅读:
    oracle日志总结
    UIScrollView,contentOffset,contentInsert的各自特点和区别?
    js动态增加表格
    判断某个对象是不是DOM对象
    IOS 中frame与bounds的区别
    删除重复项,只取其中一条数据
    NSBundle
    React
    HTML5 postMessage 和 onmessage API 详解
    SonarQube
  • 原文地址:https://www.cnblogs.com/17bdw/p/8479854.html
Copyright © 2011-2022 走看看