Skip to content

Commit 599f8ea

Browse files
authored
Add BTF/CORE support (#95)
* BTF + CO-RE refactor * Updates for CORE * CO-RE updates * CORE updates * CORE updates * CORE update * CORE updates * CORE update * CORE Updates * CORE Update * Use bpf to check sizes of bpf programs instead of manually getting it from elf * CORE updates * CORE update * CORE Update * CORE update * Latest sysmoncommon * CORE updates * CORE updates * Fix azure-pipelines * CORE Update * CORE Update * CORE Update * CORE Update * CORE Update * CORE Update * CORE Update * CORE Update * CORE update * CORE update * CORE update
1 parent 44441f8 commit 599f8ea

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+132091
-353
lines changed

BUILD.md

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
# Build
2+
3+
## Prerequisites
4+
- SysinternalsEBPF being installed:
5+
library `libsysinternalsEBPF.so`, header `libsysinternalsEBPF.h`, plus
6+
resource files in `/opt/sysinternalsEBPF`. These can be installed from
7+
the
8+
[SysinternalsEBPF](https://github.com/Sysinternals/SysinternalsEBPF)
9+
project or via the `sysinternalsebpf` DEB package from the
10+
_packages.microsoft.com_ repository (see [INSTALL.md](INSTALL.md)).
11+
12+
- .NET (latest) SDK. Please see [.NET Installation](https://learn.microsoft.com/en-us/dotnet/core/install/linux)
13+
14+
- clang/llvm v10+
15+
16+
### Ubuntu 20.04+
17+
```
18+
sudo apt update
19+
dotnet tool install --global dotnet-t4 --version 2.3.1
20+
sudo apt -y install build-essential gcc g++ make cmake libelf-dev llvm clang libxml2 libxml2-dev libzstd1 git libgtest-dev apt-transport-https dirmngr googletest google-mock libgmock-dev libjson-glib-dev
21+
```
22+
23+
### Ubuntu 18.04
24+
```
25+
sudo apt update
26+
dotnet tool install --global dotnet-t4 --version 2.3.1
27+
sudo apt -y install build-essential gcc g++ make cmake libelf-dev llvm clang libxml2 libxml2-dev libzstd1 git libgtest-dev apt-transport-https dirmngr googletest google-mock libjson-glib-dev
28+
mkdir googletest-build
29+
cd googletest-build
30+
cmake /usr/src/googletest
31+
make
32+
sudo make install
33+
```
34+
The googletest-related libraries are built from source and installed
35+
under `/usr/local`:
36+
- `/usr/local/include/gtest`
37+
- `/usr/local/include/gmock`
38+
- `/usr/local/lib/libgtest*.a`
39+
- `/usr/local/lib/libgmock*.a`
40+
41+
### Rocky 9
42+
```
43+
dnf install dnf-plugins-core
44+
dnf config-manager --set-enabled crb
45+
dnf install epel-release
46+
47+
dnf update
48+
dotnet tool install --global dotnet-t4 --version 2.3.1
49+
sudo yum install gcc gcc-c++ make cmake llvm clang elfutils-libelf-devel rpm-build json-glib-devel python3 libxml2-devel gtest-devel gmock gmock-devel
50+
```
51+
52+
### Rocky 8
53+
```
54+
dnf install dnf-plugins-core
55+
dnf install epel-release
56+
dnf config-manager --set-enabled powertools
57+
58+
dnf update
59+
dotnet tool install --global dotnet-t4 --version 2.3.1
60+
sudo yum install gcc gcc-c++ make cmake llvm clang elfutils-libelf-devel rpm-build json-glib-devel python3 libxml2-devel gtest-devel gmock gmock-devel
61+
```
62+
63+
### Debian 11
64+
```
65+
wget https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
66+
sudo dpkg -i packages-microsoft-prod.deb
67+
rm packages-microsoft-prod.deb
68+
sudo apt update
69+
dotnet tool install --global dotnet-t4 --version 2.3.1
70+
sudo apt -y install build-essential gcc g++ make cmake libelf-dev llvm clang libzstd1 git libjson-glib-dev libxml2 libxml2-dev googletest google-mock libgmock-dev
71+
```
72+
73+
### Debian 10
74+
```
75+
wget https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
76+
sudo dpkg -i packages-microsoft-prod.deb
77+
rm packages-microsoft-prod.deb
78+
sudo apt update
79+
dotnet tool install --global dotnet-t4 --version 2.3.1
80+
sudo apt -y install build-essential gcc g++ make cmake libelf-dev llvm clang libzstd1 git libjson-glib-dev libxml2 libxml2-dev googletest google-mock libgmock-dev
81+
```
82+
83+
## Build
84+
```
85+
cd
86+
git clone --recurse-submodules https://github.com/Sysinternals/SysmonForLinux.git
87+
cd SysmonForLinux
88+
mkdir build
89+
cd build
90+
cmake ..
91+
make
92+
```
93+
94+
## Test
95+
```
96+
./sysmonUnitTests
97+
```
98+
99+
## Run
100+
```
101+
sudo ./sysmon -?
102+
```
103+
104+
## Install
105+
```
106+
sudo ./sysmon -accepteula
107+
sudo ./sysmon -i CONFIG_FILE
108+
```
109+
This will install sysmon and associated files into the /opt/sysmon directory.
110+
The binary is portable and self-contained - the build process packs the
111+
required files into the binary for installation with '-i'. Sysmon will restart
112+
on reboot with the same configuration.
113+
114+
Change the configuration with
115+
```
116+
sudo /opt/sysmon/sysmon -c CONFIG_FILE
117+
```
118+
119+
Uninstall sysmon with
120+
```
121+
sudo /opt/sysmon/sysmon -u
122+
```
123+
124+
## Make Packages
125+
Packages can be generated with:
126+
```
127+
make packages
128+
```
129+
The directories build/deb and build/rpm will be populated with the required
130+
files. If dpkg-deb is available, the build/deb directory will be used to create
131+
a deb package. Similarly if rpmbuild is available, the build/rpm directory will
132+
be used to create an rpm package.

CMakeLists.txt

Lines changed: 87 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ configure_file(package/SPECS.in/spec.in SPECS.spec)
6868
#
6969
# external programs used by this build
7070
#
71-
set(TEXTTRANSFORM "/usr/lib/monodevelop/AddIns/MonoDevelop.TextTemplating/TextTransform.exe")
71+
set(TEXTTRANSFORM "/root/.dotnet/tools/t4")
7272
set(ICONV "/usr/bin/iconv")
7373
set(LD "/usr/bin/ld")
7474

@@ -79,8 +79,9 @@ set(PACKAGE_NAME "sysmonforlinux")
7979

8080
#
8181
# report warnings as errors
82+
# -g is required for BTF and CO:RE
8283
#
83-
add_compile_options(-Wall -Werror)
84+
add_compile_options(-Wall -Werror -g)
8485

8586
#
8687
# support for C++17
@@ -134,6 +135,12 @@ add_executable(sysmon
134135
sysmonEBPFkern5.2.o.o
135136
sysmonEBPFkern5.3-5.5.o.o
136137
sysmonEBPFkern5.6-.o.o
138+
sysmonEBPFkern4.15_core.o.o
139+
sysmonEBPFkern4.16_core.o.o
140+
sysmonEBPFkern4.17-5.1_core.o.o
141+
sysmonEBPFkern5.2_core.o.o
142+
sysmonEBPFkern5.3-5.5_core.o.o
143+
sysmonEBPFkern5.6-_core.o.o
137144
sysmonLogView.o
138145
sysmon.d.o
139146
sysmon.service.o
@@ -143,6 +150,12 @@ add_executable(sysmon
143150
sysmonEBPFkern5.2.rep
144151
sysmonEBPFkern5.3-5.5.rep
145152
sysmonEBPFkern5.6-.rep
153+
sysmonEBPFkern4.15_core.rep
154+
sysmonEBPFkern4.16_core.rep
155+
sysmonEBPFkern4.17-5.1_core.rep
156+
sysmonEBPFkern5.2_core.rep
157+
sysmonEBPFkern5.3-5.5_core.rep
158+
sysmonEBPFkern5.6-_core.rep
146159
)
147160

148161
target_include_directories(sysmon PUBLIC
@@ -153,7 +166,7 @@ target_include_directories(sysmon PUBLIC
153166
"/usr/local/include"
154167
"${LIBXML2_INCLUDE_DIR}"
155168
"/opt/sysinternalsEBPF/ebpfKern"
156-
)
169+
)
157170

158171

159172
add_custom_target(packages
@@ -181,7 +194,7 @@ add_custom_command(OUTPUT sysmonEBPFkern4.16.rep
181194
COMMAND "${CMAKE_BINARY_DIR}/checkEBPFsizes" sysmonEBPFkern4.16.o 4096 && touch sysmonEBPFkern4.16.rep
182195
COMMENT "Checking sysmonEBPFkern4.16.o"
183196
DEPENDS checkEBPFsizes sysmonEBPFkern4.16.o
184-
)
197+
)
185198

186199
add_custom_command(OUTPUT sysmonEBPFkern4.17-5.1.rep
187200
COMMAND "${CMAKE_BINARY_DIR}/checkEBPFsizes" sysmonEBPFkern4.17-5.1.o 4096 && touch sysmonEBPFkern4.17-5.1.rep
@@ -207,6 +220,41 @@ add_custom_command(OUTPUT sysmonEBPFkern5.6-.rep
207220
DEPENDS checkEBPFsizes sysmonEBPFkern5.6-.o
208221
)
209222

223+
add_custom_command(OUTPUT sysmonEBPFkern4.15_core.rep
224+
COMMAND "${CMAKE_BINARY_DIR}/checkEBPFsizes" sysmonEBPFkern4.15_core.o 4096 touch sysmonEBPFkern4.15_core.rep
225+
COMMENT "Checking sysmonEBPFkern4.15_core.o"
226+
DEPENDS checkEBPFsizes sysmonEBPFkern4.15_core.o
227+
)
228+
229+
add_custom_command(OUTPUT sysmonEBPFkern4.16_core.rep
230+
COMMAND "${CMAKE_BINARY_DIR}/checkEBPFsizes" sysmonEBPFkern4.16_core.o 4096 && touch sysmonEBPFkern4.16_core.rep
231+
COMMENT "Checking sysmonEBPFkern4.16_core.o"
232+
DEPENDS checkEBPFsizes sysmonEBPFkern4.16_core.o
233+
)
234+
235+
add_custom_command(OUTPUT sysmonEBPFkern4.17-5.1_core.rep
236+
COMMAND "${CMAKE_BINARY_DIR}/checkEBPFsizes" sysmonEBPFkern4.17-5.1_core.o 4096 && touch sysmonEBPFkern4.17-5.1_core.rep
237+
COMMENT "Checking sysmonEBPFkern4.17-5.1_core.o"
238+
DEPENDS checkEBPFsizes sysmonEBPFkern4.17-5.1_core.o
239+
)
240+
241+
add_custom_command(OUTPUT sysmonEBPFkern5.2_core.rep
242+
COMMAND "${CMAKE_BINARY_DIR}/checkEBPFsizes" sysmonEBPFkern5.2_core.o 32768 && touch sysmonEBPFkern5.2_core.rep
243+
COMMENT "Checking sysmonEBPFkern5.2_core.o"
244+
DEPENDS checkEBPFsizes sysmonEBPFkern5.2_core.o
245+
)
246+
247+
add_custom_command(OUTPUT sysmonEBPFkern5.3-5.5_core.rep
248+
COMMAND "${CMAKE_BINARY_DIR}/checkEBPFsizes" sysmonEBPFkern5.3-5.5_core.o 32768 && touch sysmonEBPFkern5.3-5.5_core.rep
249+
COMMENT "Checking sysmonEBPFkern5.3-5.5_core.o"
250+
DEPENDS checkEBPFsizes sysmonEBPFkern5.3-5.5_core.o
251+
)
252+
253+
add_custom_command(OUTPUT sysmonEBPFkern5.6-_core.rep
254+
COMMAND "${CMAKE_BINARY_DIR}/checkEBPFsizes" sysmonEBPFkern5.6-_core.o 32768 && touch sysmonEBPFkern5.6-_core.rep
255+
COMMENT "Checking sysmonEBPFkern5.6-_core.o"
256+
DEPENDS checkEBPFsizes sysmonEBPFkern5.6-_core.o
257+
)
210258

211259
# list of files the EBPF programs depend upon
212260
set(EBPF_DEPENDS
@@ -303,8 +351,7 @@ target_include_directories(checkEBPFsizes PUBLIC
303351
"/usr/include"
304352
)
305353

306-
target_link_libraries(checkEBPFsizes elf)
307-
354+
target_link_libraries(checkEBPFsizes sysinternalsEBPF)
308355

309356
#
310357
# GTest required for unit tests
@@ -370,25 +417,25 @@ add_custom_command(OUTPUT yoursleep
370417
# automatically generate sources from manifest.xml and manifest.tt
371418
#
372419
add_custom_command(OUTPUT sysmonevents.h.utf16
373-
COMMAND "mono" "${TEXTTRANSFORM}" "${SYSMON_COMMON_SOURCE_DIR}/manifest.tt" -out sysmonevents.h.utf16 -a '!!type!header'
420+
COMMAND "${TEXTTRANSFORM}" "${SYSMON_COMMON_SOURCE_DIR}/manifest.tt" -out sysmonevents.h.utf16 -a '!!type!header'
374421
COMMENT "Extracting sysmonevents.h.utf16"
375422
DEPENDS "${SYSMON_COMMON_SOURCE_DIR}/manifest.tt"
376423
)
377424

378425
add_custom_command(OUTPUT sysmonevents.h
379-
COMMAND "${ICONV}" -f UTF-16LE -t UTF-8 sysmonevents.h.utf16 -o sysmonevents.h
426+
COMMAND "${ICONV}" -f ASCII -t UTF-8 sysmonevents.h.utf16 -o sysmonevents.h
380427
COMMENT "Converting sysmonevents.h.utf16 to UTF8"
381428
DEPENDS sysmonevents.h.utf16
382429
)
383430

384431
add_custom_command(OUTPUT sysmonmsg.mc.utf16
385-
COMMAND "mono" "${TEXTTRANSFORM}" "${SYSMON_COMMON_SOURCE_DIR}/manifest.tt" -out sysmonmsg.mc.utf16 -a '!!version!internal' -a '!!type!mc'
432+
COMMAND "${TEXTTRANSFORM}" "${SYSMON_COMMON_SOURCE_DIR}/manifest.tt" -out sysmonmsg.mc.utf16 -a '!!version!internal' -a '!!type!mc'
386433
COMMENT "Extracting sysmonmsg.mc.utf16"
387434
DEPENDS "${SYSMON_COMMON_SOURCE_DIR}/manifest.tt"
388435
)
389436

390437
add_custom_command(OUTPUT sysmonmsg.mc
391-
COMMAND "${ICONV}" -f UTF-16LE -t UTF-8 sysmonmsg.mc.utf16 -o sysmonmsg.mc
438+
COMMAND "${ICONV}" -f ASCII -t UTF-8 sysmonmsg.mc.utf16 -o sysmonmsg.mc
392439
COMMENT "Converting sysmonmsg.mc.utf16 to UTF8"
393440
DEPENDS sysmonmsg.mc.utf16
394441
)
@@ -400,13 +447,13 @@ add_custom_command(OUTPUT sysmonmsg.h
400447
)
401448

402449
add_custom_command(OUTPUT sysmonmsgop.man.utf16
403-
COMMAND "mono" "${TEXTTRANSFORM}" "${SYSMON_COMMON_SOURCE_DIR}/manifest.tt" -out sysmonmsgop.man.utf16 -a '!!version!internal' -a '!!type!man'
450+
COMMAND "${TEXTTRANSFORM}" "${SYSMON_COMMON_SOURCE_DIR}/manifest.tt" -out sysmonmsgop.man.utf16 -a '!!version!internal' -a '!!type!man'
404451
COMMENT "Extracting sysmonmsgop.man.utf16"
405452
DEPENDS "${SYSMON_COMMON_SOURCE_DIR}/manifest.tt"
406453
)
407454

408455
add_custom_command(OUTPUT sysmonmsgop.man
409-
COMMAND "${ICONV}" -f UTF-16LE -t UTF-8 sysmonmsgop.man.utf16 -o sysmonmsgop.man
456+
COMMAND "${ICONV}" -f ASCII -t UTF-8 sysmonmsgop.man.utf16 -o sysmonmsgop.man
410457
COMMENT "Converting sysmonmsgop.man.utf16 to UTF8"
411458
DEPENDS sysmonmsgop.man.utf16
412459
)
@@ -423,7 +470,7 @@ add_custom_command(OUTPUT sysmonmsgop.c
423470
DEPENDS sysmonmsgop.man
424471
)
425472

426-
#
473+
#
427474
# convert embedded files to objects for linking with the sysmon binary
428475
#
429476
add_custom_command(OUTPUT manifest.xml.o
@@ -439,6 +486,12 @@ set(PACKED_BINARY_FILES
439486
sysmonEBPFkern5.2.o
440487
sysmonEBPFkern5.3-5.5.o
441488
sysmonEBPFkern5.6-.o
489+
sysmonEBPFkern4.15_core.o
490+
sysmonEBPFkern4.16_core.o
491+
sysmonEBPFkern4.17-5.1_core.o
492+
sysmonEBPFkern5.2_core.o
493+
sysmonEBPFkern5.3-5.5_core.o
494+
sysmonEBPFkern5.6-_core.o
442495
sysmonLogView
443496
sysmon.service
444497
sysmon.d
@@ -485,10 +538,12 @@ set(CLANG_OPTIONS -Wno-unused-value
485538
-Wno-address-of-packed-member
486539
-Wno-tautological-compare
487540
-Wno-unknown-warning-option
541+
-g
488542
)
489543
set(CLANG_DEFINES -D __KERNEL__
490544
-D __BPF_TRACING__
491545
-D __TARGET_ARCH_x86
546+
-D __linux__
492547
)
493548
if (DEBUG_K)
494549
message("Using DEBUG_K Option...")
@@ -506,35 +561,44 @@ set(CLANG_INCLUDES
506561
-I "${libbpf_SOURCE_DIR}/src"
507562
)
508563

564+
set(EBPF_CORE_PROG_SUFFIX "_core")
565+
509566
#
510567
# EBPF
511568
#
512569
# This section makes the EBPF programs
513570
#
514571

515572
# function to make ebpf programs
516-
function(build_ebpf ebpfsrc)
517-
add_custom_command(OUTPUT ${ebpfsrc}.o
518-
COMMAND "${CLANG}" -nostdinc -isystem `gcc -print-file-name=include` ${CLANG_INCLUDES} ${CLANG_DEFINES} -O2 ${CLANG_OPTIONS} -emit-llvm -fno-stack-protector -c "${CMAKE_SOURCE_DIR}/ebpfKern/${ebpfsrc}.c" -o -| "${LLC}" -march=bpf -filetype=obj -o "${ebpfsrc}.o"
519-
COMMENT "Building EBPF object ${ebpfsrc}.o"
573+
function(build_ebpf ebpfsrc suffix)
574+
add_custom_command(OUTPUT ${ebpfsrc}${suffix}.o
575+
COMMAND "${CLANG}" -nostdinc -isystem `gcc -print-file-name=include` ${CLANG_INCLUDES} ${CLANG_DEFINES} -O2 ${CLANG_OPTIONS} -target bpf -fno-stack-protector -c "${CMAKE_SOURCE_DIR}/ebpfKern/${ebpfsrc}.c" -o "${ebpfsrc}${suffix}.o"
576+
COMMENT "Building EBPF object ${ebpfsrc}${suffix}.o"
520577
DEPENDS ebpfKern/${ebpfsrc}.c ${EBPF_DEPENDS}
521578
)
522579
endfunction()
523580

524-
# loop for all ebpf programs
581+
# Loop for all ebpf programs
525582
foreach(EBPF_PROG IN LISTS EBPF_PROGS)
526583

527584
# add custom target to build all ebpf programs with 'all'
528585
add_custom_target(${EBPF_PROG} ALL
529586
DEPENDS "${CMAKE_SOURCE_DIR}/ebpfKern/${EBPF_PROG}.c"
530-
)
587+
)
531588

532589
# test to only build ebpf programs when they have changed
533590
if(${CMAKE_SOURCE_DIR}/ebpfKern/${EBPF_PROG}.c IS_NEWER_THAN ${CMAKE_BINARY_DIR}/${EBPF_PROG}.o)
534-
build_ebpf(${EBPF_PROG})
591+
# first build NON CORE program
592+
list(REMOVE_ITEM CLANG_DEFINES -DEBPF_CO_RE)
593+
build_ebpf(${EBPF_PROG} "")
594+
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${EBPF_PROG}.o)
535595
endif()
536596

537-
# add ebpf programs to clean
538-
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${EBPF_PROG}.o)
539-
endforeach(EBPF_PROG)
597+
if(${CMAKE_SOURCE_DIR}/ebpfKern/${EBPF_PROG}.c IS_NEWER_THAN ${CMAKE_BINARY_DIR}/${EBPF_PROG}${EBPF_CORE_PROG_SUFFIX}.o)
598+
# next build CORE program
599+
list(APPEND CLANG_DEFINES -DEBPF_CO_RE)
600+
build_ebpf(${EBPF_PROG} ${EBPF_CORE_PROG_SUFFIX})
601+
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${EBPF_PROG}${EBPF_CORE_PROG_SUFFIX}.o)
602+
endif()
540603

604+
endforeach(EBPF_PROG)

0 commit comments

Comments
 (0)