利用OLLVM编译windows驱动
环境搭建OLLVM的坑多的离谱,所以请100%按照本文搭建。 所有文件下载地址环境安装- 下载网盘里的VS2017安装,这步就不用说了。
- 安装网盘里的WDK。
- 安装网盘里的VS2017插件:llvm.vsix。
- 安装网盘里的LLVM-12.0.0-win64。一直下一步即可,环境变量一会自己配置。
- 解压网盘里的OLLVM.zip至LLVM安装目录,全部覆盖。
- 将网盘里的zlib.dll复制到LLVMin目录中,这是clang-cl的运行必需库。
系统环境变量在系统变量中加两个变量:LLVMInstallDir、LLVMToolsVersion。分别是LLVM根目录及 12.0.0
利用OLLVM编译windows驱动
VS工具集配置找到PlatformToolsets目录,直接搜就行,找到X64路径的那个版本(如果你是其他平台驱动就找对应平台的)。
利用OLLVM编译windows驱动
复制一份WindowsKernelModeDriver10.0。
利用OLLVM编译windows驱动
修改复制后的WindowsKernelModeDriver10.0中的Toolset.props及Toolset.targets,具体如下: Toolset.props 1
2
3
4
5
6
7
8
9
10
| < ropertyGroup>
$(VCTargetsPath)Platforms$(Platform)PlatformToolsets141Toolset.props
$(VCTargetsPath)Platforms$(Platform)PlatformToolsets142Toolset.props
$(VCTargetsPath)Platforms$(Platform)PlatformToolsetsllvmToolset.props
|
利用OLLVM编译windows驱动
Toolset.targets 1
2
3
4
5
6
7
8
9
10
11
| < ropertyGroup>
$(VCTargetsPath)Platforms$(Platform)PlatformToolsets141Toolset.targets
$(VCTargetsPath)Platforms$(Platform)PlatformToolsets142Toolset.targets
$(VCTargetsPath)Platforms$(Platform)PlatformToolsetsllvmToolset.targets
|
利用OLLVM编译windows驱动
写个demo随便创建个driver项目,vs的配置这样弄: 然后正常编译就行了。
利用OLLVM编译windows驱动
利用OLLVM编译windows驱动
利用OLLVM编译windows驱动
OLLVM参数- sobf:开启字符串加密
- bcf_prob:每个基本代码块的混淆概率,拉到100就行。
- bcf_loop:每个函数的混淆次数。写多少都行
- sub_loop:这个东西影响编译速度与编译后的文件大小,不宜过大。1、2、3都行。
弱外部定义冲突如果开启了字符串加密,确保所有源码文件中不要出现两个内容完全相同的字符串即可,如果相同字符串在两个地方用到了,要么写一个函数去返回,要么extern。
利用OLLVM编译windows驱动
下面这个会报错: 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;
}
|
|