无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: slore
打印 上一主题 下一主题

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

    [复制链接]
跳转到指定楼层
1#
发表于 2018-4-6 15:21:38 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 slore 于 2018-6-23 12:11 编辑

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

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


z01.zip解压后改名z01
windisam.z01.zip (2.5 MB, 下载次数: 768)
windisam.zip (1.75 MB, 下载次数: 883)

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就可以了。


  1.   000000014000898F: FF 15 E3 4B 01 00  call        qword ptr [__imp_pSetupValidateDriverPackage]
  2.   0000000140008995: 8B F8              mov         edi,eax
  3.   0000000140008997: 85 C0              test        eax,eax
  4.   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 00  call        qword ptr [__imp_pSetupValidateDriverPackage]
  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 [r15]
  000000014000899E: 41 89 46 10        mov         dword ptr [r14+10h],eax
  00000001400089A2: EB 3B              jmp         00000001400089DF  <--- 正常处理
  00000001400089A4: BA 20 00 00 00     mov         edx,20h
  00000001400089A9: 89 44 24 20        mov         dword ptr [rsp+20h],eax
  00000001400089AD: 4C 8D 0D 3C 65 01  lea         r9,[??_C@_0DL@BAACEHAK@Driver?5package?5failed?5signature?5@]
                    00
  00000001400089B4: 48 8B CD           mov         rcx,rbp
  00000001400089B7: 44 8D 42 E1        lea         r8d,[rdx-1Fh]

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,没出错)。

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


补充2(继续往下走):
  000000014000899B: 41 8B 07           mov         eax,dword ptr [r15]                   <-r15的值保存到eax上
  000000014000899E: 41 89 46 10        mov         dword ptr [r14+10h],eax          <-eax保存到[r14+10h]上
  00000001400089A2: EB 3B              jmp         00000001400089DF
...
  00000001400089DF: 4C 8D 5C 24 60     lea         r11,[rsp+60h]
  00000001400089E4: 8B C7              mov         eax,edi         <- edi保存到eax,然后后面就ret了,那么这个函数的返回值是edi,所以上面光90 90的话,只是不写出错日志log,上层函数还会因为返回值是1失败。
  00000001400089E6: 49 8B 5B 30        mov         rbx,qword ptr [r11+30h]
  00000001400089EA: 49 8B 6B 40        mov         rbp,qword ptr [r11+40h]
  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是干这个事的,还是要这样改才对。

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


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


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

评分

参与人数 16无忧币 +80 收起 理由
2013koko + 5 牛!
纯脆entropy + 5 赞一个!
twak2142 + 5 赞一个!
whyme22 + 5
zhuhongxing + 5 正发愁,看了这篇教程,哈哈,大神膜拜
hero8000 + 5 很给力!
zmac2007 + 5
3ax31a + 5 很给力!
2012duanyongli + 5 啥都不说了...
tools241 + 5 很给力!
lwslin + 5 很给力!
nttwqz + 5 介于牛W与牛Y直接的神人哪!
tegl + 5 膜拜
2012zhd + 5 赞一个!
1400700226 + 5
freesoft00 + 5

查看全部评分

2#
 楼主| 发表于 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
  1.   0040D77A: FF 15 DC 11 42 00  call        dword ptr [__imp__pSetupValidateDriverPackage@44]
  2.   0040D780: 8B D8              mov         ebx,eax
  3.   0040D782: 85 DB              test        ebx,ebx
  4.   0040D784: 75 0A              jne         0040D790
  5.   0040D786: 8B 4D 10           mov         ecx,dword ptr [ebp+10h]
  6.   0040D789: 8B 07              mov         eax,dword ptr [edi]
  7.   0040D78B: 89 41 08           mov         dword ptr [ecx+8],eax
  8.   0040D78E: EB 2B              jmp         0040D7BB
  9.   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。


评分

参与人数 1无忧币 +5 收起 理由
zmac2007 + 5

查看全部评分

回复

使用道具 举报

3#
 楼主| 发表于 2018-4-8 08:51:22 | 显示全部楼层
不知道是不是我语文不好,上传一个。

1分钟半破解GIF演示

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

使用道具 举报

4#
 楼主| 发表于 2018-4-8 10:10:05 | 显示全部楼层
addaadda 发表于 2018-4-8 09:40
为啥explorer.exe 不能这样反汇编呢,楼主能帮忙看看么
=====================================
Microsof ...

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

评分

参与人数 1无忧币 +5 收起 理由
zmac2007 + 5

查看全部评分

回复

使用道具 举报

5#
 楼主| 发表于 2018-4-8 17:50:42 | 显示全部楼层
本帖最后由 slore 于 2018-4-8 17:57 编辑
freesoft00 发表于 2018-4-8 11:05
请问一下,mbr或者pbr使用winhex保存的bin如何转换成汇编代码。
想看看bootice是查看哪里的特征区分mbr ...


磁盘扇区上的数据是16位的汇编指令,dumpbin只能识别32位和64位的Windows程序不适用。

高级点的你用IDA可以看。
搜索16位反编译器,会有很多,毕竟就是CPU指令的翻译,
我随便点了一个github上的C#的,SharpDisasm。

下了一个NET35支持的版本,WINHEX保存55AA的MBR为MBR.BIN,
然后复制16进制可视区域得到十六进制的文本MBR.TXT
  1. 33 C0 8E D0 BC 00 7C FB 8E C0 8E D8 8B F4 BF 00
  2. 06 B9 00 02 FC F3 A4 EA 60 06 00 00 00 00 00 00
  3. 50 4F 57 45 52 52 45 43 4F 56 45 52 00 00 00 00
  4. ...
  5. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  6. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA
复制代码


然后运行:
type mbr.txt|| disasmcli.exe 16
  1. 0000 33 c0                          xor ax, ax
  2. 0002 8e d0                          mov ss, ax
  3. 0004 bc 00 7c                       mov sp, 0x7c00
  4. 0007 fb                             sti
  5. 0008 8e c0                          mov es, ax
  6. 000a 8e d8                          mov ds, ax
  7. 000c 8b f4                          mov si, sp
  8. 000e bf 00 06                       mov di, 0x600
  9. 0011 b9 00 02                       mov cx, 0x200
  10. 0014 fc                             cld
  11. 0015 f3 a4                          rep movsb
  12. 0017 ea 60 06 00 00                 jmp word 0x0:0x660
  13. 001c 00 00                          add [bx+si], al
  14. 001e 00 00                          add [bx+si], al
  15. 0020 50                             push ax
复制代码

也支持32位,64位。drvinst.exe的破解指令也可以看。

D:\Users\Slore\桌面\windisam\Net35>echo 8B F8 85 C0 75 09 |disasmcli.exe 64
0000000000000000 8b f8                          mov edi, eax
0000000000000002 85 c0                          test eax, eax
0000000000000004 75 09                          jnz 0xf

D:\Users\Slore\桌面\windisam\Net35>echo 33 c0 8b f8 90 90 |disasmcli.exe 64
0000000000000000 33 c0                          xor eax, eax
0000000000000002 8b f8                          mov edi, eax
0000000000000004 90                             nop
0000000000000005 90                             nop

D:\Users\Slore\桌面\windisam\Net35>echo 8B D8 85 DB 75 04|disasmcli.exe 32
00000000 8b d8                          mov ebx, eax
00000002 85 db                          test ebx, ebx
00000004 75 04                          jnz 0xa

D:\Users\Slore\桌面\windisam\Net35>echo 33 c0 8b D8 90 90|disasmcli.exe 32
00000000 33 c0                          xor eax, eax
00000002 8b d8                          mov ebx, eax
00000004 90                             nop
00000005 90                             nop


sharpdisasm_NET35.zip (67.07 KB, 下载次数: 33)
我没改,NET35里面的config写的是.net45,反正我WIN10下是可以运行。
删除config文件系统将自动识别,不过启动会变慢,卡顿0.5秒的感觉。

评分

参与人数 1无忧币 +5 收起 理由
freesoft00 + 5 必须支持

查看全部评分

回复

使用道具 举报

6#
 楼主| 发表于 2018-4-8 18:08:25 | 显示全部楼层
addaadda 发表于 2018-4-8 10:26
我看了win10x64的explorer可以反汇编(35MB),win8.1x64的就不行,不知道哪里的问题,系统是win10x64
...

windisam_dumpbin_x64.zip (1.98 MB, 下载次数: 66)

我不知道x86为什么不行,不过x64可以,我试着复制出来x64的最小文件,你可以试试,
如果不行的话,建议你安装Visual Studio自己找x64的dumpbin.exe

点评

多谢  详情 回复 发表于 2018-4-8 21:32
回复

使用道具 举报

7#
 楼主| 发表于 2018-4-9 11:30:03 | 显示全部楼层
红毛樱木 发表于 2018-4-9 09:55
ys是原始没改过的,另外一个是改过的

x86的是这样

x64,一次8字节指令,一句就够,x86要2句4字节指令,所以先push一个地址,在push出错信息。

汇编结果是对的,这里的逻辑也是和1楼一样的,你改的这几个字节也是对的。

只改这6个字节是好的,你在WIN7下可以运行,程序不出错。

但是通过FC命令比较,ys和你改的文件,变动比较多,你是改完还做了
文件校验和修改?

这个时候你改过的版本直接双击。

---------------------------
drvinst.exe - 应用程序错误
---------------------------
应用程序不能正确启动 (0xc000007b)。请点击[OK] 关闭应用。
---------------------------
OK   
---------------------------


WIN10是不需要校验和的,我不清楚WIN7是不是必须,如果是,那么是因为你这里错了,这个程序就运行不起来,所以驱动安装不了。

点评

确实是啊。。。我晕,我校验和处理过了之后我没运行一下测试。。。 难道win7的不能用校验和去处理下么  详情 回复 发表于 2018-4-9 11:33
哦,所有的我都做了校验和处理。  详情 回复 发表于 2018-4-9 11:32
回复

使用道具 举报

8#
 楼主| 发表于 2019-7-20 23:16:05 | 显示全部楼层
WAIGO 发表于 2019-7-19 21:13
19H2(18362.10005) x86 PE 用了没破解的原始 drvinst.exe 文件,始终出现警告字句。想按照首頁的説明自行破 ...


你网络环境没有问题么?我这里可以下载符号信息。

symchk.exe "D:\Users\Slore\桌面\windisam\drvinst.exe" /s SRV*D:\Users\Slore\桌面\windisam\Symbols*http://msdl.microsoft.com/download/symbols
press any key to continue...

SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
请按任意键继续. . .


特征码如下:
  1. 0040D6B0: FF 15 D4 11 42 00  call        dword ptr [__imp__pSetupValidateDriverPackage@40]
  2.   0040D6B6: 8B D8              mov         ebx,eax
  3.   0040D6B8: 85 DB              test        ebx,ebx
  4.   0040D6BA: 75 0A              jne         0040D6C6
  5.   0040D6BC: 8B 4D 10           mov         ecx,dword ptr [ebp+10h]
  6.   0040D6BF: 8B 07              mov         eax,dword ptr [edi]
  7.   0040D6C1: 89 41 08           mov         dword ptr [ecx+8],eax
  8.   0040D6C4: EB 2B              jmp         0040D6F1
  9.   0040D6C6: 53                 push        ebx
  10.   0040D6C7: 68 BC 24 40 00     push        offset ??_C@_0DL@BAACEHAK@Driver?5package?5failed?5signature@
复制代码



另外不需要手动处理吧。WimBuilder的自动处理也正常。。。
D:\Dev\WimBuilder2\Projects\WIN10XPE\01-Components\Patch_drvinst>main.bat
.\drvinst.exe was successfully patched!
请按任意键继续. . .

回复

使用道具 举报

9#
 楼主| 发表于 2019-12-2 11:55:40 | 显示全部楼层
liuzhaoyzz 发表于 2019-12-2 11:47
addaadda,请问下drvinst对于14393不同的版本是否可以通用?小版本号另外,你说错了一个字节,是哪个字节? ...

看代码,微软有时候改动影响到了,就不一定了,通常没影响,WimBuilder2的包里有个测试驱动,main.bat你改下开关,没破解前不能装,破解可以装,用来验证的。

点评

54楼的代码,我试了似乎不行啊。 http://wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=408492&pid=3881168&fromuid=298214  详情 回复 发表于 2019-12-2 12:01
回复

使用道具 举报

10#
 楼主| 发表于 2019-12-2 22:40:33 | 显示全部楼层
liuzhaoyzz 发表于 2019-12-2 20:23
刚才试了下,
H:\WimBuilder2-Full2019101014393\Projects\WIN10XPE\01-Components\Patch_drvinst\main.ba ...

测试了,
  1. :Drvinst_10.0.14393_x64
  2. call :PATCH 8BD8 85C0 7508 8B06
  3. goto :EOF
复制代码

代码没有问题。这个帖子的内容没问题。

=========================================
你没有看日志?没有添加pause确认自己的代码被运行?也没有提取PE的系统文件比较?

“提示内存位置访问无效”错误,是因为你没有成功修改。

因为默认先使用通用补丁(DrvInstPatch.exe),不过这个补丁貌似对低版本改的不太对。

Applying Patch:.\Patch_drvinst\main.bat
X:\Windows\System32\drvinst.exe was successfully patched!

这里成功了,就没继续。


开测试,正常构建时的日志是:
Extracting file data: 181 KiB of 181 KiB (100%) done
Done extracting files.
Applying Patch:.\Patch_drvinst\main.bat
X\Windows\INF\netrndis.inf
X\Windows\INF\rndismp6.sys
X\Windows\INF\usb80236.sys
X\Windows\INF\wceisvista.inf
复制了 4 个文件
Assemble Patch ...
Writing to X:\Windows\System32\drvinst.exe.org...
Writing to X:\Windows\System32\drvinst.exe...
Done: 1 matches.
正在比较文件 X:\WINDOWS\SYSTEM32\drvinst.exe.org 和 X:\WINDOWS\SYSTEM32\DRVINST.EXE
00006802: 8B 33
00006803: D8 C0
00006804: 85 8B
00006805: C0 D8
00006806: 75 90
00006807: 08 90


正确的修改是添加一行下面的代码,在通用补丁执行前跳转
  1. if %VER[3]% LSS 15063 goto :AssemblePatch
复制代码



另外,默认的测试驱动就是RNDIS驱动。。。是系统自带的,
仅当DRIVERS“未设置”的时候,才需要修改drvinst.exe,
合并和替换的话,自动就可以正常安装驱动,达不到测试的目的。

回复

使用道具 举报

11#
 楼主| 发表于 2021-7-31 00:14:50 | 显示全部楼层
2011mtw35 发表于 2021-7-30 22:39
S大,drvinst.asm里面没pSetupValidateDriverPackage这个参数啊,有时间帮忙看看什么问题,

...

你搜索下 ValidateDriverPackage 是不是就有了?
关键码和21h1一样的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-3 05:36

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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