3,881
社区成员
![](https://csdnimg.cn/release/cmsfe/public/img/topic.427195d5.png)
![](https://csdnimg.cn/release/cmsfe/public/img/me.40a70ab0.png)
![](https://csdnimg.cn/release/cmsfe/public/img/task.87b52881.png)
![](https://csdnimg.cn/release/cmsfe/public/img/share-circle.3e0b7822.png)
void CMyDlg::OnAddSign()
{
UpdateData();
CreateSign();
DWORD dwSingSize=0;
DWORD dwSingOffe=0;
TCHAR szText[MAX_PATH]={0};
GetFileSizeAndName(m_path.LockBuffer(),NULL,&dwSingOffe);
GetFileSizeAndName("C:\\SIGN",NULL,&dwSingSize);
sprintf(szText,"宿主文件偏移:0x%d...",dwSingOffe);
AddText(szText);
sprintf(szText,"签名文件大小:0x%d...",dwSingSize);
AddText(szText);
CopyFile(m_path.LockBuffer(),"C:\\TEMP",TRUE);
AttachFile("C:\\TEMP","C:\\SIGN");
void * pFile=GetMemoryFilePoint("C:\\TEMP");
if (pFile==NULL)
{
return;
}
PIMAGE_DOS_HEADER pImageDosHeader ;
PIMAGE_NT_HEADERS pImageNtHeaders ;
pImageDosHeader = (PIMAGE_DOS_HEADER)pFile ;
AddText("开始检测文件的有效性");
if (pImageDosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
{
UnmapViewOfFile(pFile);
AddText("您选择的文件是无效的");
DeleteFile("C:\\TEMP");
DeleteFile("C:\\SIGN");
return ;
}
pImageNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)pFile+pImageDosHeader->e_lfanew) ;
if (pImageNtHeaders->Signature!=IMAGE_NT_SIGNATURE)
{
UnmapViewOfFile(pFile);
AddText("您选择的文件是无效的");
DeleteFile("C:\\TEMP");
DeleteFile("C:\\SIGN");
return ;
}
if (pImageNtHeaders->OptionalHeader.DataDirectory[4].Size!=0 || pImageNtHeaders->OptionalHeader.DataDirectory[4].VirtualAddress!=0 )
{
if(MessageBox(_TEXT("这个文件以经有了数字签名 要继续添加吗?"),_TEXT("提示"),MB_YESNO|MB_ICONQUESTION)!=IDYES)
{
UnmapViewOfFile(pFile);
AddText("这个文件以经有了数字签名");
DeleteFile("C:\\TEMP");
DeleteFile("C:\\SIGN");
return ;
}
}
AddText("开始写入偏移位置和大小");
pImageNtHeaders->OptionalHeader.DataDirectory[4].Size=dwSingSize; //数字签名的大小
pImageNtHeaders->OptionalHeader.DataDirectory[4].VirtualAddress=dwSingOffe; //数字签名的位置
TCHAR szNewFile[MAX_PATH]={0};
lstrcpy(szNewFile,m_path.LockBuffer());
lstrcat(szNewFile,"New.exe");
AddText("创建新的文件");
CreateSingedFile(szNewFile,pFile,dwSingOffe+dwSingSize);
AddText("添加数字签名成功");
UnmapViewOfFile(pFile);
DeleteFile("C:\\TEMP");
DeleteFile("C:\\SIGN");
}