利用OLLVM编译windows驱动
2022-10-29 14:36:43 Author: bbs.pediy.com(查看原文) 阅读量:59 收藏

利用OLLVM编译windows驱动

3天前 2244

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

图片描述

找到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)" />

    图片描述

随便创建个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++部分去掉继承后就不用再设置其他的了。

然后正常编译就行了。

图片描述

图片描述
图片描述

  • 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;

}

看雪2022 KCTF 秋季赛 防守篇规则,征题截止日期11月12日!(iPhone 14等你拿!)


文章来源: https://bbs.pediy.com/thread-274911.htm
如有侵权请联系:admin#unsafe.sh