slore 发表于 2018-4-6 15:21:38

全版本drvinst.exe文件5分钟跳过驱动签名验证修改指南

本帖最后由 slore 于 2018-6-23 12:11 编辑

破解方法:
1.通过微软的符号服务器,找到关键调用函数的位置
2.UE修改跳转语句

我精简了最必要的组件打包为windisam工具。


z01.zip解压后改名z01



1分钟半破解GIF演示:


5分钟破解步骤:
1.解压到任意目录(最好简单没空格纯英文例如D:\windisam)

2.把drvinst.exe放到相同目录

3.拖动drvinst.exe文件到symbol_dl.bat

1,2秒左右,drvinst.pdb文件将生成一个Symbols文件夹

4.剪切drvinst.pdb到windisam根目录

5.拖动drivinst.exe到wdisasm.bat

1,2秒左右,将得到drvinst.asm反汇编文件

6.用记事本打开drvinst.asm文件,查找__imp_pSetupValidateDriverPackage
补充:有人问32位的,好像32位直接改注册表可以用不需要,既然问了就看了下。
32位的函数名是__imp__pSetupValidateDriverPackage
多了一个下划线,所以通用的话,用pSetupValidateDriverPackage就可以了。


000000014000898F: FF 15 E3 4B 01 00call      qword ptr
0000000140008995: 8B F8            mov         edi,eax
0000000140008997: 85 C0            test      eax,eax
0000000140008999: 75 09            jne         00000001400089A4


调用之后,会有一个test比较,然后是个跳转,处理这个跳转即可。

7. UE打开drvinst.exe,搜索字节序,改之。
8B F8 85 C0 75 09 41 8B
改成如下:
33 C0 8B F8 90 90 41 8B

8. 完。

实际操作非常简单,我就不图文了。








为什么这么处理这个跳转的详细说明,请看。以后可以照猫画虎处理RS5,RS6,估计,也许。

==============================================================================================
一般代码是这样的:
if (SetupValidateDriverPackage() != 0) {
   //签名不正确
   xxxxxxxx
   return 1
} else {
//签名正确
   return 0
}

或者
if (SetupValidateDriverPackage() == 0) {
   //签名正确
   xxxxxxxx
   return 0
} else {
//签名不正确
写错误日志
return 1
}



17133为例:
000000014000898F: FF 15 E3 4B 01 00call      qword ptr
0000000140008995: 8B F8            mov         edi,eax
0000000140008997: 85 C0            test      eax,eax
0000000140008999: 75 09            jne         00000001400089A4   <- 返回值不为0跳转到00000001400089A4
000000014000899B: 41 8B 07         mov         eax,dword ptr
000000014000899E: 41 89 46 10      mov         dword ptr ,eax
00000001400089A2: EB 3B            jmp         00000001400089DF<--- 正常处理
00000001400089A4: BA 20 00 00 00   mov         edx,20h
00000001400089A9: 89 44 24 20      mov         dword ptr ,eax
00000001400089AD: 4C 8D 0D 3C 65 01lea         r9,[??_C@_0DL@BAACEHAK@Driver?5package?5failed?5signature?5@]
                  00
00000001400089B4: 48 8B CD         mov         rcx,rbp
00000001400089B7: 44 8D 42 E1      lea         r8d,

jne跳到00000001400089A4后面是failed,那么就是出错处理,不要让它跳,75改74,签名认证成功跳转到failed,签名不正确不跳转,继续走正常处理。
或者75 09改成90 90,这个判断跳转不执行,不管驱动签名成功与否,都向下继续走000000014000899B,不知道PE会不有正常正常的驱动签名的文件,
有的话,建议用90 90吧。另外这里主要是找到关键跳转的位置的方法,汇编怎么改好,我不太懂,可以参考旧版本的修改。。。
我改的比较暴力,强跳,也有改test eax,eax比较语句的让其判断一直成立。

补充1:
某老版本的修正如下:
8B F0 85 C0 75 09 41 8B
改为
33 C0 8B F0 90 90 41 8B

17133对应:
8B F8 85 C0 75 09 41 8B
可能改成如下:
33 C0 8B F8 90 90 41 8B

我个人觉得90 90就够了,这个先33 C0,然后把去掉了85 C0 test eax,eax的话,保证eax和正确签名的时候一样为0(也就是签名验证函数返回0,没出错)。

000000014000898F: FF 15 E3 4B 01 00call      qword ptr
0000000140008995: 33 C0            xor         eax,eax   <- 异或运算,eax自己和自己异或结果为0
0000000140008997: 8B F8            mov         edi,eax    <- 把0放到edi上,和驱动签名正常时一样,放入0
0000000140008999: 90               nop       <- 没必要判断了,90之,直接往下走,不过eax已经是0了,保持原来的jne00000001400089A4跳转好像也可以(75 09),跳转条件不成立不会跳的
000000014000899A: 90               nop
000000014000899B: 41 8B 07         mov         eax,dword ptr
000000014000899E: 41 89 46 10      mov         dword ptr ,eax
00000001400089A2: EB 3B            jmp         00000001400089DF

补充2(继续往下走):
000000014000899B: 41 8B 07         mov         eax,dword ptr                    <-r15的值保存到eax上
000000014000899E: 41 89 46 10      mov         dword ptr ,eax          <-eax保存到上
00000001400089A2: EB 3B            jmp         00000001400089DF
...
00000001400089DF: 4C 8D 5C 24 60   lea         r11,
00000001400089E4: 8B C7            mov         eax,edi         <- edi保存到eax,然后后面就ret了,那么这个函数的返回值是edi,所以上面光90 90的话,只是不写出错日志log,上层函数还会因为返回值是1失败。
00000001400089E6: 49 8B 5B 30      mov         rbx,qword ptr
00000001400089EA: 49 8B 6B 40      mov         rbp,qword ptr
00000001400089EE: 49 8B E3         mov         rsp,r11
00000001400089F1: 41 5F            pop         r15
00000001400089F3: 41 5E            pop         r14
00000001400089F5: 41 5C            pop         r12
00000001400089F7: 5F               pop         rdi
00000001400089F8: 5E               pop         rsi
00000001400089F9: C3               ret


33 C0是干这个事的,还是要这样改才对。

还原的代码为:
      ret = pSetupValidateDriverPackage(...);
      if ( ret !=0 )
      SetupWriteTextLog(v9, 0x20u, 1u, "Driver package failed signature validation. Error = 0x%08X");
      else
      *(_DWORD *)(var1 + 16) = *(_DWORD *)(var2 + 2104);
      return (unsigned int)ret;
    }

只改90 90的话,没有if (ret!=0)的判断跳转到写日志,但是返回值是1,主要看上层函数管不管这个值,如果管还可能失败,还看不到日志(Driver package failed signature validation. )
ret = pSetupValidateDriverPackage(...);
*(_DWORD *)(var1 + 16) = *(_DWORD *)(var2 + 2104);
return (unsigned int)ret;

33 C0 .. 90 90的话,和正常签名效果一样,保存*(_DWORD *)(var1 + 16)且返回值为0
ret = pSetupValidateDriverPackage(...);
ret = ret xor ret;//ret = 0
*(_DWORD *)(var1 + 16) = *(_DWORD *)(var2 + 2104);
return (unsigned int)ret;

yamingw 发表于 2019-6-5 15:25:54

Windows 10 18908 x64
8B F0 85 C0 74 47
改为
33 C0 8B F0 EB 47

tools241 发表于 2018-4-7 22:49:55

本帖最后由 tools241 于 2020-9-27 09:16 编辑

17666x64
请参考楼主本文, 用Uedit32.exe找
8B F8 85 C0 75 09 41 8B
改成:
33 C0 8B F8 90 90 41 8B
________________________________
17666x86
请参考楼主在 #21F 的回复, 用Uedit32.exe找
8B D8 85 DB 75 0a 8B 4D
改成:
33 C0 8B D8 90 90 8B 4D

_________________________________________
18980x64 , 用Uedit32.exe找:
FF FF 8B F0 85 C0 74 23改成 FF FF 33 C0 8B F0 90 90
FF 85 C0 74 1F 48 改成 FF 33 C0 EB 1F 48
FF 85 C0 75 23 65 改成 FF 33 C0 90 90 65
________________________________
18980x86 , 用Uedit32.exe找:
FF FF 8B D8 85 DB 74 1B 改成 FF FF 33 C0 8B D8 90 90
FF 85 C0 74 1D 8B 改成 FF 33 C0 EB 1D 8B
FF 85 C0 75 13 64 改成 FF 33 C0 90 90 64

_________________________________________

一.10PE适用的drvinst.exe
注: 因故已无法提供*.exe载点.
仅供参考: 初步测试 drvinst.exe 的推论:
10240x64 可使用在10PEx64 16299版至10240版.
10240x86 可使用在10PEx86 16299版至10240版.
17666x64 可使用在10PEx64 16299版至15063版.
17666x86 可使用在10PEx86 16299版至15063版.
17134版起最好采用同版本的drvinst.exe


二.有兴趣者可自行取得原始EXE档, 利用 Uedit32.exe 加以修改:
UltraEdit.7z (9M) -- 此为旧版, 若取得新版须注册否则有使用期限
10PE20215x64(RamOS)_Admin_C.iso 504M -- 可与手机连线, 可由桌面以最高管理员登入(>72H不会重启), 内建"微软拼音/五笔"
百度网盘1 (ISO1 新版), 2019/06/08新链接:https://cowtransfer.com/s/03b63f2eb7c649   提取码: czfb


三.如何由 *.EXE 产生 *.asm
1.先下载楼主在本文中提供的 windisam.z01.zip 及 windisam.zip
   windisam.z01.zip改名windisam.z01再解压windisam.zip
2.一般的10PE可能无法正常执行 windisam 之下的 *.bat ,
   可改用 "正常Win系统" 或本人发布的 10PE20215x64(RamOS)_Admin_?.iso ,
采用10PE20215x64(RamOS)_Admin_?.iso 启动后, 须登入Administrator再执行 windisam 之下的 *.bat ,
3.windisam\dumpbin_x86 之下补17个DLL档, 可由本人特制的 Firefox56 免安装版的 APP\Firefox\*.DLL 复制过来:
   [ Firefox56(免安装异空版,不支援XP,可用新旧套件不可用外挂,32位元含26元件,简繁英通用).rar(70M)
   ==> https://www.firefox.net.cn/read-52082   ]
windisam\dumpbin_x86 之下补17个DLL档, 清单如下:
api-ms-win-crt-conio-l1-1-0.dll
api-ms-win-crt-convert-l1-1-0.dll
api-ms-win-crt-environment-l1-1-0.dll
api-ms-win-crt-filesystem-l1-1-0.dll
api-ms-win-crt-heap-l1-1-0.dll
api-ms-win-crt-locale-l1-1-0.dll
api-ms-win-crt-math-l1-1-0.dll
api-ms-win-crt-multibyte-l1-1-0.dll
api-ms-win-crt-process-l1-1-0.dll
api-ms-win-crt-runtime-l1-1-0.dll
api-ms-win-crt-stdio-l1-1-0.dll
api-ms-win-crt-string-l1-1-0.dll
api-ms-win-crt-time-l1-1-0.dll
api-ms-win-crt-utility-l1-1-0.dll
msvcp140.dll
ucrtbase.dll
vcruntime140.dll

红毛樱木 发表于 2018-4-6 16:10:09

老大厉害,马上下载使用。

邪恶海盗 发表于 2018-4-6 17:21:53

我X,介于牛A与牛C间的淫呐...

sysop 发表于 2018-4-6 18:29:53

虽然看不懂 但是我知道楼主很强 楼上描述确切





Mozilla/5.0 (Wayland; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0(zh-CN)
——2018/4/6 下午6:29:55         

2012zhd 发表于 2018-4-6 18:46:14

虽然看不懂,还是顶一下。

tegl 发表于 2018-4-6 20:53:36

支持原创,感谢分享教程

Xongkoro 发表于 2018-4-6 21:42:46

这个牛,把破解好的各版本文件放上来吧

红毛樱木 发表于 2018-4-6 22:01:33

本帖最后由 红毛樱木 于 2018-4-6 22:19 编辑

老大,33 C0到底改成什么呢

看懂了,中间原来也补充内容了,手机没仔细看,不好意思。

音乐与电脑 发表于 2018-4-6 23:16:19

然后,这个文件是干什么的呢?它是不是校验驱动程序签名的?

ChinToy 发表于 2018-4-6 23:31:06

大大原创厉害感谢分享

tools241 发表于 2018-4-7 09:10:13

大大是否方便发17133版已改好的drvinst.exe ?

Windows 10 版本 1803 的正式发行版本就是 Build 17133。

微软在这两天已经将 Windows 10 版本 1803 (春季创作者更新 Spring Creators Update,
也就是 Redstone Wave 4) 的正式发行版本安装映像发布到 Windows Update 伺服器上,目
前根据国外媒体报导预估会在 4 月 10 日前后正式向全世界的 Windows 10 使用者进行公
开推送升级 (但将采分批推送,因此有些使用者不会在第一时间就收到新版本的系统)。

tools241 发表于 2018-4-7 09:44:43

本帖最后由 tools241 于 2018-4-8 00:00 编辑

tools241 发表于 2018-4-7 09:10

Windows 10 版本 1803 的正式发行版本就是 Build 17133。 ...
17133版 drvinst.exe64位元版 已找到字串.
感谢!



tools241 发表于 2018-4-7 15:00:11

测试结果:
17046x64 的 drvinst.exe 修改后可给 10PE17046x64用.
17133x64 的 drvinst.exe 修改后可给 10PE17046x64, 10PE16299x64, 10PE15063x64 用,
因此可以推论: 17133x64 的 drvinst.exe 修改后 "至少" 可给 10PEx64 "17133 至 15063 之间的版本使用,
可能可以给更早的版本使用 .

2012zhd 发表于 2018-4-7 16:40:02

tools241 发表于 2018-4-7 15:00
测试结果:
17046x64 的 drvinst.exe 修改后可给 10PE17046x64用.
17133x64 的 drvinst.exe 修改后可给 10 ...

能不能分享一下 修改后的17133x64 的 drvinst.exe

tools241 发表于 2018-4-7 17:18:44

本帖最后由 tools241 于 2018-4-14 11:36 编辑

2012zhd 发表于 2018-4-7 16:40
能不能分享一下 修改后的17133x64 的 drvinst.exe
请参考 22F :
http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=408492&pid=3551745&fromuid=581308

2012zhd 发表于 2018-4-7 17:57:56

tools241 发表于 2018-4-7 17:18
drvinst17133.7z
https://pan.baidu.com/s/1lpOegdKGX0F5k4czTCWcfg



非常感谢,辛苦了。

2012zhd 发表于 2018-4-7 19:47:58

tools241 发表于 2018-4-7 17:18
drvinst17133.7z
https://pan.baidu.com/s/1lpOegdKGX0F5k4czTCWcfg



大师,32位s大在首页作了补充,您可以去再看看。

tools241 发表于 2018-4-7 20:16:12

本帖最后由 tools241 于 2018-4-14 11:37 编辑

2012zhd 发表于 2018-4-7 19:47
大师,32位s大在首页作了补充,您可以去再看看。请参考 22F :
http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=408492&pid=3551745&fromuid=581308

zfgeng 发表于 2018-4-7 22:19:22

谢谢楼主的分享,17133准备上线了,到时 折腾个新PE玩玩

slore 发表于 2018-4-7 22:44:58

tools241 发表于 2018-4-7 20:16
我改用 8.1(RamOS)PE 启动, 又自 Firefox 移植了一些 APP\*.DLL 过来,
依楼主提供的程式, 已经可产生 17 ...

看到你经过实际操作了,给你说下x86的情况。

为什么你的位置会是4074FA?
你确定搜索到pSetupValidateDriverPackage
你的结果根本没有加载到微软的符号信息,都看不到函数名。。。
你确定你把drvinst.pdb剪切到windisam目录了么?

drvinst_x86.exe
0040D77A: FF 15 DC 11 42 00call      dword ptr
0040D780: 8B D8            mov         ebx,eax
0040D782: 85 DB            test      ebx,ebx
0040D784: 75 0A            jne         0040D790
0040D786: 8B 4D 10         mov         ecx,dword ptr
0040D789: 8B 07            mov         eax,dword ptr
0040D78B: 89 41 08         mov         dword ptr ,eax
0040D78E: EB 2B            jmp         0040D7BB
0040D790: 53               push      ebx


8B D8 85 DB 75 08 6A 08
(本人的推测, 尚待验证)改成:
33 DB 8B D8 90 90 6A 08

为什么33 DB?

.text:0040D77A               call    ds:__imp__pSetupValidateDriverPackage@44 ; pSetupValidateDriverPackage(x,x,x,x,x,x,x,x,x,x,x)
.text:0040D780               xor   ebx, ebx       <= ebx异或清0
.text:0040D782               mov   ebx, eax   <= 把SetupValidateDriverPackage函数的返回值eax又赋值给ebx,清0有何意义?还是返回(签名失败1,可能上层没有判断这个值,所以有90 90就可以吧)

ebx = 0
ebx = eax       => ebx = 1


和x64一样,
xor eax,eax
mov ebx,eax

前2个字节还是33 C0。


addaadda 发表于 2018-4-8 08:07:12

好久不见的技术贴

2012zhd 发表于 2018-4-8 08:11:19

tools241 发表于 2018-4-7 22:49
17133x64
请参考楼主本文, 用Uedit32.exe找
8B F8 85 C0 75 09 41 8B


t大,麻烦破解一下win8x64的drvinst.exe

tools241 发表于 2018-4-8 08:19:22

本帖最后由 tools241 于 2018-4-8 08:46 编辑

2012zhd 发表于 2018-4-8 08:11
t大,麻烦破解一下win8x64的drvinst.exe
我只是代工而已, 其他版本可找现成的:
在立邦电子大的 WinPE生成器2.0 有
bin\DRVINST\w864
bin\DRVINST\w886
bin\DRVINST\w8164
bin\DRVINST\w8186
bin\DRVINST\w1064
bin\DRVINST\w1086

WinPE生成器2.0中的 w1064 适用在 x64 的 16299版至更早的版本, 不适用在17046起的版本.( 我忘了是否适用在17025,17035版? )
未来 WinPE生成器2.1 版必然会再更新 w1064 及 w1086, 以便适用在17046起的版本.

2012zhd 发表于 2018-4-8 08:35:42

tools241 发表于 2018-4-8 08:19
可找现成的:
在立邦电子大的 WinPE生成器2.0 有
bin\DRVINST\w864


感谢,我去下载提取。

slore 发表于 2018-4-8 08:51:22

不知道是不是我语文不好,上传一个。

1分钟半破解GIF演示

再不行那就是下载符号库和,dumpbin.exe程序有问题,
自己到安装Visual Studio自行提取。

addaadda 发表于 2018-4-8 09:40:25

为啥explorer.exe 不能这样反汇编呢,楼主能帮忙看看么
=====================================
Microsoft (R) COFF/PE Dumper Version 14.00.23918.0
Copyright (C) Microsoft Corporation.All rights reserved.

找到 PDB 文件(在“E:\windisam\explorer.pdb”中)

LINK : fatal error LNK1000: Internal error during DumpSections

Version 14.00.23918.0

ExceptionCode            = C0000005
ExceptionFlags         = 00000000
ExceptionAddress         = 014190DA (01380000) "E:\windisam\dumpbin_x86\link.exe"
NumberParameters         = 00000002
ExceptionInformation[ 0] = 00000000
ExceptionInformation[ 1] = 00000000

CONTEXT:
Eax    = 00000000Esp    = 00CFDE04
Ebx    = 00000000Ebp    = 00CFDEE8
Ecx    = 00000000Esi    = 00CF0001
Edx    = 00000001Edi    = 00CFF034
Eip    = 014190DAEFlags = 00010202
SegCs= 00000023SegDs= 0000002B
SegSs= 0000002BSegEs= 0000002B
SegFs= 00000053SegGs= 0000002B
Dr0    = 00000000Dr3    = 00000000
Dr1    = 00000000Dr6    = 00000000
Dr2    = 00000000Dr7    = 00000000
请按任意键继续. . .

slore 发表于 2018-4-8 10:10:05

addaadda 发表于 2018-4-8 09:40
为啥explorer.exe 不能这样反汇编呢,楼主能帮忙看看么
=====================================
Microsof ...

不错,会变通。符库已经下好了,内部错误,估计explorer的结果比较大,x86的dumpbin处理不了,换64位dumpbin.exe试试。这个是文本,你可以其他反编译工具查看,可以加载到pdb就行。od,ida等等。

addaadda 发表于 2018-4-8 10:26:33

本帖最后由 addaadda 于 2018-4-8 10:29 编辑

slore 发表于 2018-4-8 10:10
不错,会变通。符库已经下好了,内部错误,估计explorer的结果比较大,x86的dumpbin处理不了,换64位dump ...

我看了win10x64的explorer可以反汇编(35MB),win8.1x64的就不行,不知道哪里的问题,系统是win10x64

上传不可以反编译的附件



freesoft00 发表于 2018-4-8 11:05:29

slore 发表于 2018-4-8 10:10
不错,会变通。符库已经下好了,内部错误,估计explorer的结果比较大,x86的dumpbin处理不了,换64位dump ...

请问一下,mbr或者pbr使用winhex保存的bin如何转换成汇编代码。
想看看bootice是查看哪里的特征区分mbr类型的
页: [1] 2 3
查看完整版本: 全版本drvinst.exe文件5分钟跳过驱动签名验证修改指南