-
-
利用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的配置这样弄:
然后正常编译就行了。
- 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