首页
社区
课程
招聘
[原创]用Clang-LLVM编译Windows驱动
发表于: 2020-6-26 13:46 15719

[原创]用Clang-LLVM编译Windows驱动

2020-6-26 13:46
15719

踩过的坑比较多,折腾了一周总算编译出能用的驱动了


源码:

	void DriverUnload(PDRIVER_OBJECT driver_object) {

	}

	NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryString)
	{
		UNREFERENCED_PARAMETER(pRegistryString);

		pDriverObject->DriverUnload = DriverUnload;

		return STATUS_SUCCESS;
	}

效果:



方法:安装VS-LLVM插件(工具->扩展和更新->LLVM Compiler Chain)



常规

配置类型:动态库(.dll)

平台工具集:LLVM

Windows SDK版本:看着设置,一般选最新

VC++目录 

包含目录 手动指定:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\版本号\include

C:\Program Files (x86)\Windows Kits\10\Include\SDK版本号\ucrt

C:\Program Files (x86)\Windows Kits\10\Include\SDK版本号\km\crt

C:\Program Files (x86)\Windows Kits\10\Include\SDK版本号\km

C:\Program Files (x86)\Windows Kits\10\Include\SDK版本号\shared

库目录 手动指定:

C:\Program Files (x86)\Windows Kits\10\lib\SDK版本号\km\x64

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\版本号\lib\x64

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\版本号\atlmfc\lib\x64

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\VS\lib\x64

C:\Program Files (x86)\Windows Kits\10\lib\SDK版本号\ucrt\x64

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\VS\UnitTest\lib

C:\Program Files (x86)\Windows Kits\10\lib\SDK版本号\um\x64

C:\Program Files (x86)\Windows Kits\NETFXSDK\版本号\lib\um\x64

C:\Program Files (x86)\Windows Kits\NETFXSDK\版本号\Lib\um\x64


C/C++


预处理器:


AMD64;_AMD64_;_WIN64;__WIN64_;_KERNEL_MODE;__x86_64__


代码生成:


Spectre缓解:否


运行库:MD


启用C++异常:否


链接器


输入


附加依赖项:

ntstrsafe.lib

netio.lib

ntoskrnl.lib

hal.lib

wmilib.lib

BufferOverflowK.lib


忽略特定默认库:

msvcrt.lib

libcmt.lib


清单文件


生成清单:否


系统


子系统:本机 (/SUBSYSTEM:NATIVE)


驱动程序:驱动程序 (/Driver)(选错此项会导致驱动无法正常卸载)


高级


入口点:DriverEntry


设置校验和:是 (/RELEASE)(选错此项会导致驱动无法正常加载)


坑1:不支持某些intrin

用clang编译时会提示找不到__writecr0  __readcr3 __readmsr之类内核常用指令


解决方法1:修改clang\xxx\include\intrin.h,封装未实现的intrin,用__asm__让其强行支持,比如

static __inline__ void __DEFAULT_FN_ATTRS
__writecr3(unsigned long long __cr3_val) {
  __asm__ ("mov %0, %%cr3" : : "q"(__cr3_val) : "memory");
}


解决方法2:MASM写.asm,封装成函数让链接器去链接


比如

; void __stdcall AsmWriteCR2(_In_ ULONG_PTR cr2_value);
AsmWriteCR2 PROC
    mov cr2, rcx
    ret
AsmWriteCR2 ENDP

坑2:不支持SEH

__try__except结构就别想用了

解决方法1:避免使用SEH,用不了就憋用了呗


解决方法2:把需要SEH的地方用MSVC编译成lib,再链接过去


[课程]Android-CTF解题方法汇总!

最后于 2020-6-30 11:16 被hzqst编辑 ,原因:
收藏
免费 6
支持
分享
最新回复 (19)
雪    币: 5734
活跃值: (1737)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
表哥牛批
2020-6-26 16:14
0
雪    币: 789
活跃值: (1784)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
2020-6-26 22:50
0
雪    币: 6
活跃值: (3185)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
用vmp不香吗?
2020-6-26 23:25
0
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
5
咖啡_741298 用vmp不香吗?
vmp太拉跨了
2020-6-27 10:25
0
雪    币: 6910
活跃值: (3410)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
asd
6
这个整好了 期待整llvm obfuscator
2020-6-28 10:42
0
雪    币: 1519
活跃值: (2017)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
7

直接修改官方的配置就行了....


坑就是 用stl很麻烦 然后就是大表哥说的cr8的问题


用的论坛的一份开源混淆https://bbs.pediy.com/thread-255224.htm

最后于 2020-6-28 13:31 被Chords编辑 ,原因:
2020-6-28 13:20
3
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
牛人
2020-6-29 09:12
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
hzqst vmp太拉跨了
VS-LLVM插件  哪里有下载的?没找到啊
2020-6-30 09:26
0
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
10
别问,问就是牛排
2020-6-30 09:42
0
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
11
caolinkai VS-LLVM插件 哪里有下载的?没找到啊
工具->扩展和更新->LLVM Compiler Chain
2020-6-30 11:16
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
hzqst 工具->扩展和更新->LLVM Compiler Chain

请问大佬 clang-cl.exe  、lld-link.exe、llvm-lib.exe 这三个不是 LLVM Compiler Chain    插件附带的吗?搜索了 各个目录页没找到

最后于 2020-6-30 17:36 被caolinkai编辑 ,原因: 222222222
2020-6-30 16:56
0
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
13
caolinkai hzqst 工具->扩展和更新->LLVM Compiler Chain 请问大佬 clang-cl.exe&am ...

需要自己安装clang

最后于 2020-6-30 18:00 被hzqst编辑 ,原因:
2020-6-30 17:59
0
雪    币: 1378
活跃值: (3067)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
老铁666
2020-7-3 17:39
0
雪    币: 405
活跃值: (2150)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
编译的驱动出了问题,自己看DUMP能定位吗?
2020-7-3 18:26
0
雪    币: 4709
活跃值: (1560)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
16
表哥牛批
2020-7-12 10:32
0
雪    币: 6124
活跃值: (4476)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
17

编译r3稍微复杂点的项目一堆错,还是观望一下。

最后于 2020-8-11 02:14 被黑洛编辑 ,原因:
2020-8-11 02:14
0
雪    币: 1110
活跃值: (1085)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
既然是clang,intrin没有就直接内联汇编吧,clang好像没有64位无法内联汇编的限制。
2021-6-17 10:42
1
雪    币: 665
活跃值: (1070)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
大表哥居然用vs2017,惊了
2021-8-22 18:55
0
雪    币: 3
活跃值: (466)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20

正常编译 但是ida 查看没效果

最后于 2023-5-25 16:54 被拉闸太子编辑 ,原因:
2023-5-25 14:56
0
游客
登录 | 注册 方可回帖
返回
//