海思H.265解码库破解


海思H.265解码库破解(去除海思LOGO)

前言:

最近在做一个关于H.265视频流的项目时,遇到一个问题:用海思H.265解码库,解码出来的图像会附加一个海思的logo严重影响了视频的体验。
于是自己琢磨这怎么把这个logo去掉。
经过广览资料和咨询朋友得到了解决方法:反汇编解码库,然后把加logo的这段代码跳过去,然后再链接回去。

正文

环境

  • Win7 + VS2013

工具:

  • VS2013 x86 本机工具命令提示
  • UltraEdit

步骤:

1、导出OBJ文件 :

执行命令
1
lib /LIST HW_H265dec_Win32.lib > liblist.txt
得到解码库的OBJ文件列表

这里写图片描述

然后利用UltraEdit编辑liblist.txt,用Column菜单的Insert/Fill column功能做一个批处理文件liblist.bat,形如:

这里写图片描述

运行该批处理文件会将静态库中的所有obj文件导出到当前目录下,此时再用UltraEdit将所有obj文件打开,
选择”search / Find in Files”,查找关键字”add_log”,发现在Util.obj和DPB.obj中找到了它,
需要破解的obj文件找到了!就是Util.obj和DPB.obj,而添加LOGO的函数叫做_add_logo_H265_c。

分析需要被破解的obj:

运行以下命令dump出Util.obj和DPB.obj中尽可能详细的信息:

dumpbin /ALL Util.obj > dumpcrackingobj.txt(DPB.obj 同样)

然后经过分析Util.obj里面是_add_logo_H265_c的定义和实现,而DPB.obj里面是_DisplayPic里面调用了_add_logo_H265_c,我一开始按照常规思路就想在_DisplayPic直接跳过_add_logo_H265_c的调用,然后发现只要播放到要加LOGO的时候播放器就崩溃了,这个失败的过程就不放出来了,然后我就开始研究_add_logo_H265_c的过程:因为海思这个解码库如果视频源是从海思自己设备出来的就不会出现,所以他在_add_logo_H265_c这个函数中肯定有一个判断跳过贴LOGO这个步骤。于是乎,再次运行dumpbin,反汇编Util.obj,命令如下:

dumpbin /disasm Util.obj > dumpasm.txt

编辑该文件,查找InitSkinMagicLib,会看到如下信息:
修改之前的
从图中就可以看出第一个红框是加载海思logo,第二红框小于直接跳到这个函数的最后,第三个红框也是小于直接跳到最后,于是我把第二个红框和第三个红框之间的操作全部改成nop,把第三个操作改成大于跳过,这样就不管怎么样都会跳到函数的最后而不会绘制海思logo。
修改之后的
红框部分就是修改部分。

分将修改后的obj导入到静态库:

直接运行以下命令将修改后的obj文件再导入到静态库:

lib HW_H265dec_Win32.lib Release\Util.obj

需要到当前目录建一个子目录Release把Util.obj放进去。
然后播放果然不会出现海思LOGO了。

注意

这里得到的是一个静态lib库,不是动态链接库。仅提供思路。

扩展

关于海思H.264的库也可以用这个方法破解,不过H.264的库的函数叫_add_logo_c

破解好的库

参考文献

最后的话