请选择 进入手机版 | 继续访问电脑版

    搜索
    热搜: 活动 交友 discuz
    Hi~登录注册
    查看: 21|回复: 0

    金盾视频加密器V2014视频加密原理分析

    [复制链接]

    14

    主题

    14

    帖子

    48

    积分

    超级版主

    Rank: 8Rank: 8

    积分
    48
    发表于 2018-10-6 22:43:58 | 显示全部楼层 |阅读模式
    声明:
        本帖大部分都是参考“天易love”的,原创的地方不多,只是随着软件版本更新,在此记录一下算法变化而已,著作权仍属原作者,错误之处请大家批评指正。
        本作只研究加密算法,如果软件原作者看到,请增强软件安全意识及时更新算法。

    摘要:
        简单来说,2014版本比之2012版本的变化有以下几点:
    输入密码的框框变大了机器码由三段每段十个字符变为四段每段五个字符由定义了A,B,C三段大小变为只定义A,B两个段的大小,其余部分按半分,并且在程序最后的数据中存有C段大小,文件大小的记录方法没有改变由解压到硬盘播放变为解压到内存播放

    正文:
    首先定义几个变量名,方便大家理解:

    本人不喜欢微软的缩写,很多都莫名其妙,因此向来使用完整名称
    1. Key// 视频加密密钥  本例没有用到
    2. Key_num1
    3. Key_num2

    4. MachineCode// 机器码
    5. MachineCode_num1
    6. MachineCode_num2

    7. PlayCode// 播放密码
    8. PlayCode_num1
    9. PlayCode_num2

    10. FileSize_Full// 文件完整大小
    11. FileSize_A
    12. FileSize_B
    13. FileSize_C
    14. FileSize_D

    15. FileEndCode// exe视频文件尾部密文
    16. DWORD_Of_FileEnd // exe视频文件除了密文之外最后一个DWORD
    17. DWORD_Of_FileEndCodeEnd // 神秘数字

    18. Encrypt()// 具体算法略过
    19. Decrypt()// 具体算法略过
    复制代码


    解密过程:

    由播放密码得到2个数字;由机器码得到2个数字;相减得到FileSize_A,相加得到FileSize_B;求出FileSize_Full,求出或读出FileSize_C,求出FileSize_D;定位读取A、B、C、D块,读取并播放(其中只有A块需要先进行解密操作,具体解密算法略过);附录。


    [label=1.由播放密码得到2个数字]
    PlayCode = f5309565ad54b405f0339667d622b57189359060ad54b476f0359361d153b07089339566d750b475f7369367d151e2798563c5
    Decrypt(PlayCode) = D261976DA153BA7087349767A705E0218162C364F403E2`84af
    Decrypt(前者) = cc49508166433fb`0``0```

    第一部分是关键,分为五个数字:n1=cc, n2=4950, n3=8166, n4=4, n5=33fb
    其中n1和n5是验证部分,分别为某一字符串的md5的第一个字节和第六到七个字节
    n4是n2和n3的位数
    最后:
    PlayCode_num1 = n2 = 4950
    PlayCode_num2 = n3 = 8166
    [/label]
    [label=2.由机器码得到2个数字]
    MachineCode = e2265-c6eb6-acadd-00000
    Encrypt(MachineCode) = D4309162A14EE177D4609579F500E325D52F9364A453B2
    md5(EncryptedMachineCode) = bfdefd03d98b4c5128058c545fe24243

    取md5前6个字符bfdefd的16进制值的低位字节转换得到字符串264 564。
    这样我们可以得到2个十进制数(前者扩大十倍,后者不变,并且若起始字符为0则替换成9):
    MachineCode_num1 = 2640
    MachineCode_num2 = 564
    [/label]
    [label=3.相减得到FileSize_A,相加得到FileSize_B]
    FileSize_A = PlayCode_num1 - MachineCode_num1 = 4950 - 2640 = 2310
    FileSize_B = PlayCode_num2 - MachineCode_num2 = 8166 + 564 = 8730

    FileSize_A *=  FileEndCode[66] = 2310 * 511 = 1180410
    FileSize_B *=  FileEndCode[66] = 8730 * 511 = 4461030
    [/label]
    [label=4.求出FileSize_Full,求出或读出FileSize_C,求出FileSize_D]
    FileSize_Full = DWORD_Of_FileEnd - DWORD_Of_FileEndCodeEnd*100 = 03D6EDBF - 986*100 = 64417215 - 98600 = 64318615

    FileSize_C = FileEndCode[57] = 29338588

    或者FileSize_Full - FileSize_A  - FileSize_B = 64318615-1180410-4461030 = 58677175
    除以2得29338588余29338587,即为FileSize_C和FileSize_D
    [/label]
    [label=5.定位读取A、B、C、D块,读取并播放]
    其中只有A块需要先进行解密操作,具体解密算法略过
    [/label]
    [label=6.附录]
    这是exe视频文件末尾:

    连工具都山寨了一个:

    山寨的工具,做做样子而已:

    [/label]
    [label=补充几点]
    ● FileEndCode中有一个标志位,标记本文件是否用试用版生成,如果被程序检测到为1,则使用预置的段大小,A为9876,B为1234,再乘以FileEndCode[66],值得注意。程序关键过程使用了VMP加密,跟踪还原困难。突破口是,vm前后栈结构不变,库函数不变,可以在库函数入口下断,就知道程序要做什么。

    [/label]
    [label=未尽之事]
    ● 由加密密钥导出A、B段大小的算法,及公因数的选定FileEndCode & key中各个量的含义

    [/label]

    最后引用天易love的总结作为结束语,同时感谢天易love的原作:视频制作人的加密密钥其实就包含了2个块大小的信息,一旦加密视频制作完毕,它的4个块的大小也固定了,而你要观看,就必须对exe文件的附加数据进行重组,当然制作人不会告诉你密钥,他间接的给你播放密码,加密视频.exe文件就会根据播放密码和机器码计算出这4个块大小,从而提取视频数据进行播放。

    原贴:https://bbs.pediy.com/thread-179252.htm
    IT资源社区 - 免责声明 1、本站会员可发帖,本主题所有言论和图片纯属会员个人意见,与本论坛立场无关.
    2、本站所有帖子由该帖子作者发表,该帖子作者享有帖子相关权益.
    3、本帖内容来源网友及会员分享和其它网络媒体.
    4、本站仅提供学习的平台,所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,并不承担任何法律责任,如果对您的版权或者利益造成损害,请提供相应的资质证明,我们将于3个工作日内予以删除并致以最深的歉意!
    5、若因内容问题IT资源社区管理员和版主有权不事先通知发贴者而删除本文.
    6、本站教程仅供本站会员学习参考,不得传播及用于其他用途,学习完后请在24小时内自行删除.
    7、本站邮箱地址:admin@it0365.com
    回复

    使用道具 举报

    游客
    回复
    懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
    您需要登录后才可以回帖 登录 | 加入我们

    关闭

    站长推荐上一条 /1 下一条

    快速回复 返回顶部 返回列表