踩过的坑比较多,折腾了一周总算编译出能用的驱动了
源码:
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编辑
,原因: