首页
社区
课程
招聘
利用OLLVM编译windows驱动
2022-10-28 16:34 27512

利用OLLVM编译windows驱动

2022-10-28 16:34
27512

环境搭建

OLLVM的坑多的离谱,所以请100%按照本文搭建。

  • 开发工具选择:VS2017社区版。VS2019别想了,编译应用层还行,驱动折磨死人。
  • LLVM版本:12.0.0 。
  • OLLVM版本:来自大佬的仓库:https://github.com/0x3f97/ollvm-12.x 。可以自己按照方法编译或者下载我这边提供的编译好的文件。不推荐自己编译,如果非要自己来,不要用VS2019!!!。

所有文件下载地址

链接:https://pan.baidu.com/s/1JJuWIypPmZa86kD2_QSkVQ?pwd=xz60
提取码:xz60
--来自百度网盘超级会员V99999999999999的分享

环境安装

  • 下载网盘里的VS2017安装,这步就不用说了。
  • 安装网盘里的WDK。
  • 安装网盘里的VS2017插件:llvm.vsix。
  • 安装网盘里的LLVM-12.0.0-win64。一直下一步即可,环境变量一会自己配置。
  • 解压网盘里的OLLVM.zip至LLVM安装目录,全部覆盖。
  • 将网盘里的zlib.dll复制到LLVM\bin目录中,这是clang-cl的运行必需库。

系统环境变量

系统变量中加两个变量:LLVMInstallDir、LLVMToolsVersion。分别是LLVM根目录及 12.0.0

 

图片描述

VS工具集配置

找到PlatformToolsets目录,直接搜就行,找到X64路径的那个版本(如果你是其他平台驱动就找对应平台的)。

 

图片描述

 

复制一份WindowsKernelModeDriver10.0。

 

图片描述

 

修改复制后的WindowsKernelModeDriver10.0中的Toolset.props及Toolset.targets,具体如下:

  • Toolset.props

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <PropertyGroup>
        <V141PropsFile>$(VCTargetsPath)\Platforms\$(Platform)\PlatformToolsets\v141\Toolset.props</V141PropsFile>
        <V142PropsFile>$(VCTargetsPath)\Platforms\$(Platform)\PlatformToolsets\v142\Toolset.props</V142PropsFile>
        <ClangPropsFile>$(VCTargetsPath)\Platforms\$(Platform)\PlatformToolsets\llvm\Toolset.props</ClangPropsFile>
     
      </PropertyGroup>
      <Import Condition="Exists('$(ClangPropsFile)')" Project="$(ClangPropsFile)" />
     
      <Import Condition="!Exists('$(V142PropsFile)')" Project="$(V142PropsFile)" />
      <Import Condition="!Exists('$(V142PropsFile)')" Project="$(V141PropsFile)" />

    图片描述

  • Toolset.targets

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <PropertyGroup>
        <V141TargetsFile>$(VCTargetsPath)\Platforms\$(Platform)\PlatformToolsets\v141\Toolset.targets</V141TargetsFile>
        <V142TargetsFile>$(VCTargetsPath)\Platforms\$(Platform)\PlatformToolsets\v142\Toolset.targets</V142TargetsFile>
        <ClangTargetsFile>$(VCTargetsPath)\Platforms\$(Platform)\PlatformToolsets\llvm\Toolset.targets</ClangTargetsFile>
     
      </PropertyGroup>
     
      <Import Project="$(WDKContentRoot)\build\WindowsDriver.common.targets" Condition="Exists('$(WDKContentRoot)\build\WindowsDriver.common.targets')"/>
      <Import Condition="Exists('$(ClangTargetsFile)')" Project="$(ClangTargetsFile)" />
      <Import Condition="!Exists('$(V142TargetsFile)')" Project="$(V142TargetsFile)" />
      <Import Condition="!Exists('$(V142TargetsFile)')" Project="$(V141TargetsFile)" />

    图片描述

写个demo

随便创建个driver项目,vs的配置这样弄:

  • 常规

    • 平台工具集选你复制后的WindowsKernelModeDriver10.0
  • LLVM:Use lld-link 选为否。否则编译时候会提示各种参数错误。

  • C/C++

    • 命令行

      • 从父级或项目默认设置继承 取消勾选!!!

      • 其他选项:

        1
        -mno-sse -mno-mmx -D__CUDACC__ -D_ALLOW_COMPILER_AND_STL_VERSION_MISMATCH -mllvm -sobf -mllvm -bcf -mllvm -bcf_prob=99 -mllvm -bcf_loop=1 -mllvm -sub -mllvm -sub_loop=5 -mllvm -fla -mllvm -split_num=5 -mllvm -aesSeed=DEADBEEFDEADCODEDEADBEEFDEADCODE
  • 连接器

    • 常规
      • 启用增量链接:否
      • 将连接器警告视为错误:否
    • 清单文件
      • 生成清单:否
      • 调试:全部清空。不过对于驱动没啥作用,清空就完事了。
    • 高级
      • 设置校验和:是。 这是默认的,但是确认一下。
  • 其余正常开发驱动时怎么设置就怎么设置,C/C++部分去掉继承后就不用再设置其他的了。

然后正常编译就行了。

 

图片描述

 

图片描述
图片描述

OLLVM参数

  • sobf:开启字符串加密
  • bcf_prob:每个基本代码块的混淆概率,拉到100就行。
  • bcf_loop:每个函数的混淆次数。写多少都行
  • sub_loop:这个东西影响编译速度与编译后的文件大小,不宜过大。1、2、3都行。

弱外部定义冲突

如果开启了字符串加密,确保所有源码文件中不要出现两个内容完全相同的字符串即可,如果相同字符串在两个地方用到了,要么写一个函数去返回,要么extern。
图片描述
下面这个会报错:

1
2
3
4
5
6
7
8
EXTERN_C NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {
    //代码
    char * gjg1 = "dasdasdasdasda";
    char * gjg2 = "dasdasdasdasda";
    DbgPrintEx(77, 0, gjg1);
    DbgPrintEx(77, 0, gjg2);
    return STATUS_UNSUCCESSFUL;
}

下面这个则不会报错

1
2
3
4
5
6
7
8
EXTERN_C NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {
    //代码
    char * gjg1 = "dasdasdasdasda";
    char * gjg2 = "dasdasdasdasda1";
    DbgPrintEx(77, 0, gjg1);
    DbgPrintEx(77, 0, gjg2);
    return STATUS_UNSUCCESSFUL;
}

下面这个也不会报错

1
2
3
4
5
6
7
8
9
10
11
12
char * fuck(){
    return "dasdasdasdasda";
}
 
EXTERN_C NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {
    //代码
    char * gjg1 = fuck();
    char * gjg2 = fuck();
    DbgPrintEx(77, 0, gjg1);
    DbgPrintEx(77, 0, gjg2);
    return STATUS_UNSUCCESSFUL;
}

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞8
打赏
分享
最新回复 (14)
雪    币: 248
活跃值: (3779)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
luskyc 2022-10-28 22:26
2
0
VS2019编译驱动,编译64位asm汇编的路过
雪    币: 3906
活跃值: (5528)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
badboyl 2 2022-10-30 18:02
3
1
这两天群里叫嚣的厉害啊
雪    币: 389
活跃值: (565)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
自然dashen 2022-11-1 17:16
4
1
这两天群里叫嚣的厉害啊绿头画
雪    币: 2656
活跃值: (3730)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
值得怀疑 2022-11-1 23:00
5
0
LLVM是你自己编译的吗??
雪    币: 186
活跃值: (6527)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
Golden_Boy 2022-11-25 11:32
6
1
这两天群里叫嚣的厉害啊绿头画
雪    币: 750
活跃值: (3888)
能力值: ( LV6,RANK:98 )
在线值:
发帖
回帖
粉丝
还我六千雪币 2023-1-3 09:46
7
1

***

最后于 2023-1-16 11:37 被kanxue编辑 ,原因:
雪    币: 1451
活跃值: (14614)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
SSH山水画 3 2023-1-3 10:18
8
0
还我六千雪币 看懂了 群友才是免费的打工仔

************

最后于 2023-1-16 11:37 被kanxue编辑 ,原因:
雪    币: 750
活跃值: (3888)
能力值: ( LV6,RANK:98 )
在线值:
发帖
回帖
粉丝
还我六千雪币 2023-1-4 15:50
9
1
SSH山水画 ***

***

最后于 2023-1-16 11:37 被kanxue编辑 ,原因:
雪    币: 43
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
紫梦寒 2023-1-18 01:53
10
0
sub_loop是2的情况下,bcf_loop这个超过3就完全卡住编译了,根本都编译不成功,一直卡住。 是啥问题导致的呢
雪    币: 31
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_phohatwd 2023-2-20 11:04
11
0
大佬,加个好友呗
雪    币: 766
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
ChamyFire 2023-2-24 10:19
12
0
大佬,能开个交流群吗
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_fgsvwlam 2023-5-4 02:36
13
0
紫梦寒 sub_loop是2的情况下,bcf_loop这个超过3就完全卡住编译了,根本都编译不成功,一直卡住。 是啥问题导致的呢
老哥,你解决这个问题了嘛,我也是这样
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_fgsvwlam 2023-5-4 02:37
14
0
紫梦寒 sub_loop是2的情况下,bcf_loop这个超过3就完全卡住编译了,根本都编译不成功,一直卡住。 是啥问题导致的呢
sub_loop是2的话,bcf_loop这个超过3就会卡住,这是为啥?
雪    币: 1451
活跃值: (14614)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
SSH山水画 3 2023-5-4 15:54
15
0
mb_fgsvwlam sub_loop是2的话,bcf_loop这个超过3就会卡住,这是为啥?
可能是指数级的增长吧,数字不需要太大,差不多就行
游客
登录 | 注册 方可回帖
返回