zoukankan      html  css  js  c++  java
  • 软件制作:Digital Signature

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

     

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

    }

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

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

  • 相关阅读:
    c#大文件上传解决方案支持分片断点上传
    css精灵动画
    文字游戏
    利用myeclipse配置数据库连接池
    python 简单的txt文件读写
    数据库连接池配置
    hdu 1030 Delta-wave
    java jdbc sqlhelper
    js实现页面的自动读秒跳转
    购物车模块
  • 原文地址:https://www.cnblogs.com/Gemgin/p/3136233.html
Copyright © 2011-2022 走看看