公告:“业余草”微信公众号提供免费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添加资源文件及修改文件的描述,公司信息及版本号