问题背景:我在做一个视频内容保护的DRM系统,不知道大家用过中国数字版权网(http://www.china-drm.com/)上的飓风视频加密软件没,在下就是用VC做一个和它有相似功能的系统。问题的描述:(1)系统的总界面如下图:
   
   先选择待加密的视频文件-----软件使用演示教程.wmv,输入加密密钥,然后点击“执行加密”,之后打包生成另一个可执行文件---软件使用演示教程.exe。(2)点击上述的“软件使用演示教程.exe”后,弹出如下界面:我要问的问题是:在(1)中的系统中点击“执行加密”后,它是如何生成像(2)中那样的可执行程序的?怎么实现的?谢谢大家!

解决方案 »

  1.   

    软件使用演示教程.exe可能是个解密程序,.wmv被进行加密处理后,变成了二进制放在了可执行文件中
      

  2.   

    图在自己电脑上别人看不到。
    先做一个演示程序,程序用FindResource、LoadResource、LockResource、SizeofResource等函数访问自定义资源。
    再主程序中,把演示程序添加为自定义资源,在需要生成程序时释放出来(用前面提到的几个函数,并写入文件),再用BeginUpdateResource、UpdateResource、EndUpdateResource等函数向演示程序中追加资源,把附带的数据作为资源加入。
      

  3.   

    把exe作为资源文件等,添加到exe中,运行的时候,再解压等出来,然后调用..
      

  4.   

    不好意思,图片没弄好!但问题的实质和这两张图片没关系,我想要的就是从一个应用程序中编译生成另一个应用程序。
    我从网上找了一段c++ Builder的程序,程序如下:(我修改了一部分)
    HRSRC hMyRes; //resource handle 
    HGLOBAL hgpt; //resource pointer 
    LPVOID lpBuff; //resource buffer pointer 
    DWORD rcSize=204800; //resource size 
    HANDLE hFile;//file to write 
    LPDWORD dwByte;//byte size had been write 
    dwByte=&rcSize; //locate the resource and load the resource to memory and lock it 
    hMyRes=FindResource((HMODULE)GetWindowLong(Handle,GWL_HINSTANCE),MAKEINTRESOURCE(1111),"CUSTOM"); 
    if(hMyRes==NULL) 
    MessageBox("1"); 
    hgpt=LoadResource(NULL,hMyRes); 
    if(hgpt==NULL) 
    MessageBox("2"); 
    lpBuff=LockResource(hgpt); 
    //now i will read the resource and write it to an file  hFile=CreateFile("e:\\mywriter.exe",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 
    WriteFile(hFile,lpBuff,rcSize,dwByte,NULL); 
    if(*dwByte!=204800) 
    MessageBox("3"); CloseHandle(hFile); 
    发现了下列问题:
    (1)FindResource的第一个参数中的GetWindowLog的第一个参数Handle不知如何设置.直接写Handle是错的,若改为NULL是正确的。我看了msdn了,这个参数应该是应用程序的句柄,怎样才能获得这个句柄呢?
    (2)FindResource的返回值竟然是空指针,LoadResource的返回值也是空,LockResource的返回值也是空,为什么呢?
    (3)最后能在制定目录下生成一个.exe文件,但其大小是0。不过这也是正常,因为前面两个问题没解决!
    请大家帮帮忙!我会及时加分的~!!谢谢~!
      

  5.   

    可以参考一下这篇文章:在VC项目中使用自定义资源
    http://www.vckbase.com/document/viewdoc/?id=1564
      

  6.   

    如果做为资源,需要重新编译,太麻烦,不适合动态生成。
    另一个方法是。你自己的解密用的EXE大小是固定的。而且你可以把这个大小写入到你的解密用的EXE当中。然后把加密后的视频数据,附加到EXE后面。将两个文件合并成一个文件。
    解密时,从程序中读取硬编码的EXE大小,然后从这个偏移开始读取数据就OK了。
    大概步骤,
    1.先编译一个解密用的EXE,里面有个常量,先不管,置为0.
    2.用这个EXE的大小替换常量的值。再编译,这个时候,EXE的大小应该不会改变,请不要使用增量编译。
    3.生成时,把加密后的数据附加到这个EXE后面。不知道怎么附加?创建文件,指针移到末尾,然后写入数据。
    4.解密时,EXE先读取常量中的大小,然后从这个大小开始偏移,读取加密的数据。直到末尾。
    5.解密,播放