Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /* Copyright (c) 2020 Facebook */
0003 
0004 #include "vmlinux.h"
0005 #include <bpf/bpf_helpers.h>
0006 #include <bpf/bpf_tracing.h>
0007 #include <bpf/bpf_core_read.h>
0008 
0009 #define MAX_LEN 256
0010 
0011 char buf_in1[MAX_LEN] = {};
0012 char buf_in2[MAX_LEN] = {};
0013 
0014 int test_pid = 0;
0015 bool capture = false;
0016 
0017 /* .bss */
0018 __u64 payload1_len1 = 0;
0019 __u64 payload1_len2 = 0;
0020 __u64 total1 = 0;
0021 char payload1[MAX_LEN + MAX_LEN] = {};
0022 
0023 /* .data */
0024 int payload2_len1 = -1;
0025 int payload2_len2 = -1;
0026 int total2 = -1;
0027 char payload2[MAX_LEN + MAX_LEN] = { 1 };
0028 
0029 int payload3_len1 = -1;
0030 int payload3_len2 = -1;
0031 int total3= -1;
0032 char payload3[MAX_LEN + MAX_LEN] = { 1 };
0033 
0034 int payload4_len1 = -1;
0035 int payload4_len2 = -1;
0036 int total4= -1;
0037 char payload4[MAX_LEN + MAX_LEN] = { 1 };
0038 
0039 SEC("raw_tp/sys_enter")
0040 int handler64_unsigned(void *regs)
0041 {
0042     int pid = bpf_get_current_pid_tgid() >> 32;
0043     void *payload = payload1;
0044     long len;
0045 
0046     /* ignore irrelevant invocations */
0047     if (test_pid != pid || !capture)
0048         return 0;
0049 
0050     len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in1[0]);
0051     if (len >= 0) {
0052         payload += len;
0053         payload1_len1 = len;
0054     }
0055 
0056     len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in2[0]);
0057     if (len >= 0) {
0058         payload += len;
0059         payload1_len2 = len;
0060     }
0061 
0062     total1 = payload - (void *)payload1;
0063 
0064     return 0;
0065 }
0066 
0067 SEC("raw_tp/sys_exit")
0068 int handler64_signed(void *regs)
0069 {
0070     int pid = bpf_get_current_pid_tgid() >> 32;
0071     void *payload = payload3;
0072     long len;
0073 
0074     /* ignore irrelevant invocations */
0075     if (test_pid != pid || !capture)
0076         return 0;
0077 
0078     len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in1[0]);
0079     if (len >= 0) {
0080         payload += len;
0081         payload3_len1 = len;
0082     }
0083     len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in2[0]);
0084     if (len >= 0) {
0085         payload += len;
0086         payload3_len2 = len;
0087     }
0088     total3 = payload - (void *)payload3;
0089 
0090     return 0;
0091 }
0092 
0093 SEC("tp/raw_syscalls/sys_enter")
0094 int handler32_unsigned(void *regs)
0095 {
0096     int pid = bpf_get_current_pid_tgid() >> 32;
0097     void *payload = payload2;
0098     u32 len;
0099 
0100     /* ignore irrelevant invocations */
0101     if (test_pid != pid || !capture)
0102         return 0;
0103 
0104     len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in1[0]);
0105     if (len <= MAX_LEN) {
0106         payload += len;
0107         payload2_len1 = len;
0108     }
0109 
0110     len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in2[0]);
0111     if (len <= MAX_LEN) {
0112         payload += len;
0113         payload2_len2 = len;
0114     }
0115 
0116     total2 = payload - (void *)payload2;
0117 
0118     return 0;
0119 }
0120 
0121 SEC("tp/raw_syscalls/sys_exit")
0122 int handler32_signed(void *regs)
0123 {
0124     int pid = bpf_get_current_pid_tgid() >> 32;
0125     void *payload = payload4;
0126     long len;
0127 
0128     /* ignore irrelevant invocations */
0129     if (test_pid != pid || !capture)
0130         return 0;
0131 
0132     len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in1[0]);
0133     if (len >= 0) {
0134         payload += len;
0135         payload4_len1 = len;
0136     }
0137     len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in2[0]);
0138     if (len >= 0) {
0139         payload += len;
0140         payload4_len2 = len;
0141     }
0142     total4 = payload - (void *)payload4;
0143 
0144     return 0;
0145 }
0146 
0147 SEC("tp/syscalls/sys_exit_getpid")
0148 int handler_exit(void *regs)
0149 {
0150     long bla;
0151 
0152     if (bpf_probe_read_kernel(&bla, sizeof(bla), 0))
0153         return 1;
0154     else
0155         return 0;
0156 }
0157 
0158 char LICENSE[] SEC("license") = "GPL";