添加数字签名算法我就不说了,网上很多,这里给出两种方式,一种是数字作为资源添加,另一种是自定义文件添加(这种比较友好)。
VC++6.0文件拖放(OnDropFiles处理)两种方式
1、 对话框实现WM_DROPFILES消
2、 文本框实现WM_DROPFILES消息
详细见:http://blog.sina.com.cn/s/blog_4b53da1c0100l6dm.html
注意:组合控件设置对文本框WM_DROPFILES影响。
//****************************************************************************
void CreateSign()
{
DWORD dwSize,dwWritten;
HRSRC hr=FindResource(0,MAKEINTRESOURCE(IDR_SIGN),"SIGN");//查找资源
if(hr==NULL) return;
dwSize=SizeofResource(NULL,hr);
HGLOBAL hg=LoadResource(NULL,hr);//加载资源
if(hg==NULL) return;
LPSTR lp=(LPSTR)LockResource(hg);//锁定资源
if(lp==NULL) return;
HANDLE hFile;
hFile = CreateFile("C:\\SIGN",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);//创建文件
if(hFile == NULL) return;
WriteFile(hFile,(LPCVOID)lp,dwSize,&dwWritten,NULL);
CloseHandle(hFile);
}
//****************************************************************************
void CreateSign(LPCTSTR dsPath)
{
HANDLE hr=CreateFile(dsPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //从指定的路径DigitalSignature文件中读取文件句柄
DWORD dwSize=GetFileSize(hr, NULL); //获得文件的大小,用来分配全局内存
HGLOBAL hg=GlobalAlloc(GMEM_MOVEABLE, dwSize); //给文件分配全局内存
void *pImageMemory=GlobalLock(hg); //锁定内存
DWORD dwWritten; //保存实际读取的文件大小
ReadFile(hr, pImageMemory, dwSize, &dwWritten, NULL); //读取文件到全局内存当中
GlobalUnlock(hg); //解锁内存
CloseHandle(hr); //关闭文件句柄
HANDLE hFile;
hFile = CreateFile("C:\\SIGN",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);//创建文件
if(hFile == NULL) return;
WriteFile(hFile,pImageMemory,dwSize,&dwWritten,NULL);
CloseHandle(hFile);
}
//****************************************************************************
void CMyDlg::OnAddSign()
{
UpdateData();
char dspath[1000];
m_dsPath.GetWindowText(dspath,1000);//
// CreateSign();
CreateSign(dspath);
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");
}
//****************************************************************************
如有需要淘宝网店拍下数字签名,拍下即送免杀卡巴斯基的数字签名。