公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
最近项目安装包需要添加特殊的管理员的用户名和密码进行提权,而且能够提权后的程序仍然是一个安装包,可以供用户下载。
思考很久之后,决定把管理员的用户名和密码写入到程序的资源文件中。这就涉及到到了修改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)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 为exe添加资源文件及修改文件的描述,公司信息及版本号