软件制作:Digital Signature

来源:互联网 发布:八方源码论坛 编辑:程序博客网 时间:2024/04/25 23:39
 

添加数字签名算法我就不说了,网上很多,这里给出两种方式,一种是数字作为资源添加,另一种是自定义文件添加(这种比较友好)。

 

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");

}

//****************************************************************************

如有需要淘宝网店拍下数字签名,拍下即送免杀卡巴斯基的数字签名。