解除NVEnc并行编码限制

前言

其实这篇文章已经在我的草稿箱里呆了有大半年了,不过过几天电脑就要卖掉了,赶紧连夜憋了出来。

上来先上一波维基百科:

Nvidia NVENC is a feature in its graphics cards that performs video encoding, offloading this compute-intensive task from the CPU. It was introduced with the Kepler-based GeForce 600 series in March 2012.

简单来说就是一个让视频转换得更快的好东西,不过,世上没有免费的午餐,刀法如神的老黄自然不会放过此等亮刀的机会,NVEnc在非专业卡下只能同时对两条视频流转换,在亮机卡GT1030/MX150上干脆阉割掉了:

刀法精湛
刀法精湛

不过,贫苦群众们当然不会就此罢休,Linux 上已经有人做出了傻瓜式补丁,wget然后跑一下就完事了,然而不同于赤裸裸的 Linux,得益于 Windows10 复(坑)杂紧(爹)扣的安全验证体系,想要对限制做手脚还得先费一番功夫……

不过,还是先上一张成功演示吧,7 条视频流同时编码,保证质量过得去(约等于 x264 slow crf26)的同时拥有极高的编码速度:

准备

首先我们需要一张能跑 nvenc 的显卡,以及安装正常的驱动(废话),然后去微软商店下载WinDBG Perview,以及准备一个十六进制编辑器,这里推荐HxD Editor

WinDBG
WinDBG

由于破解 nvenc 需要修改驱动,因此如果不进入调试模式,就算是管理员权限也无法获得内核修改权的,接下来根据你的电脑设置有两种选择,在未开启 Bitlocker 启动的前提下,可以直接修改启动设置,以内核调试模式启动即可,如果开启了 Bitlocker,那么每次开机都需要重新启动内核调试模式

提醒

大部分超极本/二合一笔记本以及平板电脑都已默认开启,为了安全性不建议手动关闭,会降低你电脑的安全性,当然如果你电脑里装了各种辣鸡国产杀软,那开不开都没啥区别了

  • 当你没有开启 Bitlocker 时

以管理员打开命令行并运行

bcdedit -debug on
bash

然后重启即可

  • 当你开启了 Bitlocker 时
提示

由于在启用了 Bitlocker 后,Windows10 启用所有安全机制,以尽量确保你的电脑无法在不经人手的前提下对系统进行修改,因此只有在用户知情的前提下,才能临时启用调试模式,以下的复杂操作你可以视为一个“确认知情”的过程

提示

由于 Bitlocker 可以通过多种途径启动,对应解密流程也不一样,这里只针对默认已启用的情况进行说明,对于手动启动的朋友,自行启用调试模式应该不成问题吧?

首先插入一个 U 盘,然后打开设置(Win 键+I),在搜索框里输入 Bitlocker,然后打开 Bitlocker 设置

Bitlocker
Bitlocker

然后点击系统驱动器里的备份恢复密钥

Backup key
Backup key

在新窗口里点击保存到文件,保存后可以关闭设置窗口,然后把保存得到的 txt 文件打开,一般内容如下:

BitLocker 驱动器加密恢复密钥

要验证这是否为正确的恢复密钥,请将以下标识符的开头与电脑上显示的标识符值进行比较。

标识符:

	xxxxxxxxxxxxxxxxxxx

如果以上标识符与电脑显示的标识符匹配,则使用以下密钥解锁你的驱动器。

恢复密钥:

	xxxxxxxxxxxxxxxxxxx

如果以上标识符与电脑显示的标识符不匹配,则该密钥不是解锁你的驱动器的正确密钥。
请尝试其他恢复密钥,或参阅 https://go.microsoft.com/fwlink/?LinkID=260589 以获得其他帮助。
ini

把其中的恢复密钥(即上面高亮的那行)记下来后删除 txt

CAUTION

这个文档可以用来解密你的硬盘并得到其中的数据,切记不要保存在会被他人看到的地方

接下来按住 Shift 键并点击开始菜单中的重启,稍等片刻进入到全屏蓝色的恢复界面,接下来点击疑难解答->高级设置->启动设置->重启

提示

可以使用方向键移动光标,如果移动不了可以用 Tab 键

之后系统自动重启,进入 Bitlocker Recovery 界面,此时会提示由于系统引导被修改,需要输入 Bitlocker 恢复密钥,根据提示选择输入后,直接输入前面保存下来的恢复密钥中的数字即可,横杠会自动补全,无需手动输入。

如果你有多个分区或硬盘,可能会提示你输入多次密钥,你只要在提示解密操作系统驱动器的时候输入即可。

启用调试模式
启用调试模式

输入完成后系统继续引导,进入到一个新的蓝色界面,提示选择高级启动选项,此时请按对应数字选择启用调试即可,稍等片刻后系统顺利启动,进入到登陆界面。

修改

经过漫长的准备(其实熟练的话几分钟就能搞好了),终于要开始修改限制了,我们先以管理员权限打开 WinDBG。

然后点击窗口左上角的文件->Attach to kernel->Local,然后点击OK

加载完成后默认是没有符号文件的,在窗口中间的命令输入框中输入

.sympath srv*https://msdl.microsoft.com/download/symbols
.reload /f
bash

输入一行回车一下,之后开始自动加载符号文件,网速不好的话可能要等很久,这时候我们先把注意力转移到驱动文件上。

先搜索到 nvlddmkm.sys,用十六进制编辑器打开,然后搜索"75 07 B8 69 00 00 00",并记下偏移量。

偏移量
偏移量

记下偏移量并切回 WinDbg,输入u nvlddmkm+0x偏移量,譬如上图是 1a7b19,就应该输入u nvlddmkm+0x1a7b19,下图是旧版驱动的图,所以偏移量不一样。

asm
asm

然后再输入!pte nvlddmkm+0x偏移量获取实际的物理页地址:

asm
asm

我们需要用图中的数据计算出物理地址,首先 pte 的 pfn 为 0x10041,然后乘 0x1000 得到物理页地址 0x10041000,然后加 0xbed(即取后三位,因为内存一页为 4k,即 0x1000),最后检查下内容一致:

data
data

然后就可以修改内容了:!eb 10041BED eb,修改后在读一下物理内存看看是否成功:

check
check

现在在重启之前,修改都不会失效,enjoy your self!