问题背景:我在做一个视频内容保护的DRM系统,不知道大家用过中国数字版权网(http://www.china-drm.com/)上的飓风视频加密软件没,在下就是用VC做一个和它有相似功能的系统。问题的描述:(1)系统的总界面如下图:
先选择待加密的视频文件-----软件使用演示教程.wmv,输入加密密钥,然后点击“执行加密”,之后打包生成另一个可执行文件---软件使用演示教程.exe。(2)点击上述的“软件使用演示教程.exe”后,弹出如下界面:我要问的问题是:在(1)中的系统中点击“执行加密”后,它是如何生成像(2)中那样的可执行程序的?怎么实现的?谢谢大家!
先选择待加密的视频文件-----软件使用演示教程.wmv,输入加密密钥,然后点击“执行加密”,之后打包生成另一个可执行文件---软件使用演示教程.exe。(2)点击上述的“软件使用演示教程.exe”后,弹出如下界面:我要问的问题是:在(1)中的系统中点击“执行加密”后,它是如何生成像(2)中那样的可执行程序的?怎么实现的?谢谢大家!
先做一个演示程序,程序用FindResource、LoadResource、LockResource、SizeofResource等函数访问自定义资源。
再主程序中,把演示程序添加为自定义资源,在需要生成程序时释放出来(用前面提到的几个函数,并写入文件),再用BeginUpdateResource、UpdateResource、EndUpdateResource等函数向演示程序中追加资源,把附带的数据作为资源加入。
我从网上找了一段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。不过这也是正常,因为前面两个问题没解决!
请大家帮帮忙!我会及时加分的~!!谢谢~!
http://www.vckbase.com/document/viewdoc/?id=1564
另一个方法是。你自己的解密用的EXE大小是固定的。而且你可以把这个大小写入到你的解密用的EXE当中。然后把加密后的视频数据,附加到EXE后面。将两个文件合并成一个文件。
解密时,从程序中读取硬编码的EXE大小,然后从这个偏移开始读取数据就OK了。
大概步骤,
1.先编译一个解密用的EXE,里面有个常量,先不管,置为0.
2.用这个EXE的大小替换常量的值。再编译,这个时候,EXE的大小应该不会改变,请不要使用增量编译。
3.生成时,把加密后的数据附加到这个EXE后面。不知道怎么附加?创建文件,指针移到末尾,然后写入数据。
4.解密时,EXE先读取常量中的大小,然后从这个大小开始偏移,读取加密的数据。直到末尾。
5.解密,播放