为exe添加资源文件及修改文件的描述,公司信息及版本号

NDIS nui111 2189浏览 0评论
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

最近项目安装包需要添加特殊的管理员的用户名和密码进行提权,而且能够提权后的程序仍然是一个安装包,可以供用户下载。
思考很久之后,决定把管理员的用户名和密码写入到程序的资源文件中。这就涉及到到了修改exe程序的资源文件问题。
    exe中的资源文件可以是程序中定义的图标,字符串之类的,也可以是自定义的文件,dll等。本文主要介绍三种,修改exe
程序中字符串资源文件,添加及释放dll资源文件及修改exe的文件版本号,产品版本号及公司信息等。
1)向exe中添加及释放dll资源文件
   (1)在exe的rc文件中添加自定义资源,由于我的是dll,所以我命名为"IDR_DLL",并且把dll文件插入资源文件中;
   (2)解压资源文件到临时文件夹,并记录文件位置
   

      BOOL WriteFileToTempPath(char* dllpath,int dllpathlen)
{
    HRSRC hSrc = FindResource(NULL,MAKEINTRESOURCE(IDR_IDR_DLL1),"IDR_DLL");
    if(hSrc == NULL)
        return FALSE;
    HGLOBAL hGlobal = LoadResource(NULL,hSrc);
    if(hGlobal == NULL)
        return FALSE;
    LPVOID lp = LockResource(hGlobal);
    DWORD dwSize = SizeofResource(NULL,hSrc);


    DWORD nBufLen= ::GetTempPath(0, NULL);
    char*  tmppath= new char[nBufLen+1];
    memset(tmppath,0,nBufLen+1);
    ::GetTempPath(nBufLen, tmppath);

    if(dllpathlen>((nBufLen+strlen(DLLNAME))+1))
    {
        sprintf_s(dllpath,dllpathlen,"%s%s",tmppath,DLLNAME);
    }
    else
    {
        if(g_tipmsg)
            MessageBox(NULL,"PATH FAIL","err",MB_OK);
        delete[] tmppath;
        tmppath = NULL;
        return FALSE;
    }

    HANDLE m_hFile = NULL;
    if ((m_hFile= CreateFile(dllpath, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL))==INVALID_HANDLE_VALUE)
    {
        FreeResource(hGlobal);
        return FALSE;
    }
     DWORD dwWritenSize = 0;
    WriteFile(m_hFile,lp, dwSize,&dwWritenSize, NULL);
    CloseHandle(m_hFile);
    m_hFile  = NULL;
    FreeResource(hGlobal);
    return TRUE;
}

2)修改exe的文件的版本号,产品版本号及公司信息
   主要方法是通过BeginUpdateResource,VerQueryValue,UpdateResource和EndUpdateResource进行修改。
    

 void WriteClientVersionInfo(wstring specialclient)
 {
     DWORD               dwHandle,
         dwSize,
         dwResult = 0;

     UINT len = 0;

     VS_VERSIONINFO      *pVerInfo;
     LPBYTE              pOffsetBytes;
     VS_FIXEDFILEINFO    *pFixedInfo;

     // determine the size of the resource information
     dwSize = GetFileVersionInfoSize(specialclient.c_str(), &dwHandle);
     if (0 < dwSize)
     {
         LPBYTE lpBuffer = new BYTE[dwSize];

         if (GetFileVersionInfo(specialclient.c_str(), 0, dwSize, lpBuffer) != FALSE)
         {
#define roundoffs(a,b,r) (((BYTE *) (b) - (BYTE *) (a) + ((r) - 1)) & ~((r) - 1))
#define roundpos(a,b,r) (((BYTE *) (a)) + roundoffs(a,b,r))

             // 'point to' the start of the version information block
             pVerInfo = (VS_VERSIONINFO *) lpBuffer;

             // the fixed section starts right after the 'VS_VERSION_INFO' string
             pOffsetBytes = (BYTE *) &pVerInfo->szKey[_tcslen(pVerInfo->szKey) + 1];

             pFixedInfo = (VS_FIXEDFILEINFO *) roundpos(pVerInfo, pOffsetBytes, 4);

             pFixedInfo->dwFileVersionMS    = m_dwFileVersionMS;
             pFixedInfo->dwFileVersionLS    = m_dwFileVersionLS;
             pFixedInfo->dwProductVersionMS = m_dwProductVersionMS;
             pFixedInfo->dwProductVersionLS = m_dwProductVersionLS;

             HANDLE hResource = BeginUpdateResource(specialclient.c_str(), FALSE);
             if (NULL != hResource)
             {
                 UINT uTemp;
                 // get the language information
                 if (VerQueryValue(lpBuffer, _T("\\VarFileInfo\\Translation"), (LPVOID *) &lpTranslate, &uTemp) != FALSE)
                 {
                     UINT Index=sizeof(VerSion)/sizeof(VerSion[0]);

                         for(int j=0;j<Index;j++)
                         {
                             wchar_t tmpstr[128]={L"0"};
                             wchar_t *pDetailInfo=NULL;
                             wsprintf(tmpstr,L"\\StringFileInfo\\%04x%04x\\%s",lpTranslate->wLanguage,lpTranslate->wCodePage,VerSion[j]);
                             if( VerQueryValue(lpBuffer,tmpstr,(LPVOID*)&pDetailInfo,&len) != FALSE)
                             {
                                 _tcscpy(pDetailInfo, m_VersionInfo.SanVersion[0][j]);
                             }
                             else
                             {
                                 MessageBox(tmpstr,L"VerQueryValue Fail",0);
                             }
                         }
                    

                     if (UpdateResource(hResource, RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO), lpTranslate->wLanguage, lpBuffer, dwSize) != FALSE)
                     {
                         if (EndUpdateResource(hResource, FALSE) == FALSE)
                         {
                             dwResult = GetLastError();
                             MessageBox(L"EndUpdateResource Fail");
                         }
                     }
                     else
                     {
                         dwResult = GetLastError();
                         MessageBox(L"UpdateResource Fail");
                     }
                 }        

             }
             else
             {
                 dwResult = GetLastError();
                 MessageBox(L"BeginUpdateResource Fail");
             }
         }
         else
         {
             dwResult = GetLastError();
             MessageBox(L"GetFileVersionInfo Fail");
         }

         delete [] lpBuffer;
     }
     else
         dwResult = GetLastError();

     if (0 != dwResult)
         wprintf(_T("Operation was not successful.  Result = %lu\n"), dwResult);
 }


   版权声明:本文为博主原创文章,未经博主允许不得转载。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 为exe添加资源文件及修改文件的描述,公司信息及版本号